【问题标题】: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 索引?
  • 我已经发布了一个解决方案。似乎点/多边形相交查询的顺序很重要。

标签: mongodb polygon point mongodb-query


【解决方案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 
    }
    

    【讨论】:

      猜你喜欢
      • 2022-10-07
      • 2014-04-26
      • 1970-01-01
      • 2013-03-29
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      相关资源
      最近更新 更多