mongodb检查点是不是在多边形中
Posted
技术标签:
【中文标题】mongodb检查点是不是在多边形中【英文标题】:mongodb check if point is in polygonmongodb检查点是否在多边形中 【发布时间】:2014-08-26 00:47:39 【问题描述】:mongo 2.6
我有一些存储的多边形。我有一点。我知道这一点是否适合任何存储的多边形
文档示例
..., "polygons" : [ [ 17.60083012593064, 78.18557739257812 ], [ 17.16834652544664, 78.19381713867188 ], [ 17.17490690610013, 78.739013671875 ], [ 17.613919673106714, 78.73489379882812 ] ], ...
Mongodb : Check if a point is inside a stored polygon 已经有几乎相同的问题了。 但这对我不起作用-此查询必须至少给出一个结果(示例中的结果)-但事实并非如此。
db.areas.find( polygons : $geoIntersects : $geometry : type:"Point",coordinates:[17.3734, 78.4738] )
实际上,如果我在任何多边形的边界上选择一个点 - 确实如此。
$geoWithin
方法必须按照mondodb
文档所述完成工作。
但是这些查询中的任何一个都不起作用
db.areas.find( polygons : $geoWithin : $geometry : type:"Point",coordinates:[17.3734, 78.4738] ) - not supported with provided geometry
db.tradeareas.find( polygons : $geoWithin : $geometry : type:"Polygon",coordinates: inside_polygon ) - BadValue bad geo query
我好像错过了什么,但不明白什么和在哪里。
我将不胜感激。
【问题讨论】:
您使用的是 2d 还是 2dsphere 索引? 我已经发布了一个解决方案。似乎点/多边形相交查询的顺序很重要。 【参考方案1】:这似乎与订单有关。如果您使用$geoWithin
并尝试在多边形内查找点,则其中的内容就是您正在搜索的字段。但是,$geoIntersects
可以在任一方向工作,因此您可以搜索多边形内的点或包含点的多边形,例如:
db.geom.insert(
"polygons":
"type":"Polygon",
"coordinates": [[
[ 17.60083012593064, 78.18557739257812],
[ 17.16834652544664, 78.19381713867188],
[ 17.17490690610013, 78.739013671875],
[ 17.613919673106714, 78.73489379882812],
[ 17.60083012593064, 78.18557739257812]
]]
);
db.geom.find(
polygons:
$geoIntersects:
$geometry:
"type": "Point",
"coordinates": [17.3734, 78.4738]
);
另外,请注意,您需要在最后重复多边形的第一个点。如果你删除最后一对,你会得到一个$err
:
无法规范化查询:BadValue bad geo query”错误。
似乎 MongoDB 允许您插入无效的几何图形,并且仅在您尝试添加 2dsphere 索引或执行 intersects/within/near 查询时才会抱怨,我认为这是合理的,因为 GeoJSON 可以是有效的 JSON 而不是有效的几何图形。
【讨论】:
感谢您的回复。我按照您的建议进行了此类测试-它确实可以正常工作-就像在 mongo 文档示例中一样。但我没有多边形。我只有一点作为参数。要获得多边形,我需要向 DB 提出请求。所以有一百万条记录 - 我需要 200 万个请求来查找包含我的点的所有多边形 @user3806072。我已经更新了我的答案,它现在按预期工作,它会找到所有包含一个点的多边形。 非常感谢 - 它确实有效。正如您所提到的 - 错误在于保存的多边形的 GEOJSON 结构不正确。 @user3806072 我遇到了同样的问题。我确实认为这是保存的多边形的 GEOJSON 结构。你把结构改成什么了?您的架构是什么样的?非常感谢! @banbar。抱歉,我不再使用 MongoDB。我相信您可以做到这一点,但我认为您可能想将其作为一个单独的问题提出。【参考方案2】:感谢John Powell,这是同一查询的 C# 驱动程序版本。
var geometry = new BsonDocument
"type", "Point" ,
"coordinates",
new BsonArray(new double[] Longitude,
Latitude )
;
var geometryOperator = new BsonDocument "$geometry", geometry ;
var geoIntersectsOperator = new BsonDocument "$geoIntersects", geometryOperator ;
var findField = new BsonDocument "geometry", geoIntersectsOperator ;
var results = MyCollection.Find(findField).ToList();
【讨论】:
【参考方案3】:在Java中可以这样做
@Autowired
private MongoOperations mongoOpertions;
public void pointIntersect(GeoJsonPoint gp)
Query query = new Query();
query.addCriteria(Criteria.where("geometry").intersects(gp));
List<ResultDtoType> result = mongoOpertions.find(query, ResultDtoType.class);
//perform any action with result
【讨论】:
以上是关于mongodb检查点是不是在多边形中的主要内容,如果未能解决你的问题,请参考以下文章
查找给定的经纬度是不是位于 MongoDB 中的任何多边形中
在Android中使用Google Maps API检查点是不是在多边形中
Java geotools检查点是不是包含在具有容差的多边形中