mongodb检查点是否在多边形中

时间:2014-07-04 16:45:33

标签: mongodb polygon point mongodb-query

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

似乎我错过了一些东西,但无法理解什么和在哪里。

我很感激你的帮助。

3 个答案:

答案 0 :(得分:28)

这似乎与订单有关。如果您正在使用$ 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错误的地理查询”错误。

似乎MongoDB允许你插入无效的几何图形,只有当你尝试添加一个2dsphere索引或者做一个相交/内/近查询时才会抱怨,我认为这是合理的,因为GeoJSON可以是有效的JSON而不是有效几何。

答案 1 :(得分:1)

感谢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();

答案 2 :(得分:0)

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 
}