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检查点是不是包含在具有容差的多边形中

斯威夫特:多边形中的点?如何检查用户的位置是不是在 Geo-JSON 多边形内?

检查点是不是在多边形内

Google Maps v3:检查点是不是存在于多边形中