mongodb check if point is in polygon
mongodb, mongodb-query, point, polygon
Solution
It seems to be to do with the order. If you are using `$geoWithin` and you are trying to find points inside a polygon, the thing that is within is the field you are searching on. However, `$geoIntersects` works in either direction, so you can search for points inside polygons, or polygons containing points, eg:
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]
}
}
}
});
Also, note that, you need to repeat the first point of the polygon at the end. If you remove the final pair, you will get a `$err`:
Can't canonicalize query: BadValue bad geo query" error.
It seems that MongoDB allows you to insert invalid geometries and only complains when you try and add a 2dsphere index or do an intersects/within/near query, which, I suppose is reasonable, as GeoJSON can be valid JSON without being a valid geometry.
Problem
`mongo 2.6` I have some amount of stored polygons. And I have a point. I what to know if this point fits any of stored polygons document example ``` { ..., "polygons" : [ [ 17.60083012593064, 78.18557739257812 ], [ 17.16834652544664, 78.19381713867188 ], [ 17.17490690610013, 78.739013671875 ], [ 17.613919673106714, 78.73489379882812 ] ], ... } ``` There is nearly the same question already Mongodb : Check if a point is inside a stored polygon. But it is not working for me - this query has to give at least one result(the one in example) - but it does not. ``` db.areas.find( { polygons : { $geoIntersects : { $geometry : {type:"Point",coordinates:[17.3734, 78.4738]} } } } ) ``` Actually if I chose a point on a border of any polygon - it does. `$geoWithin` method has to do the work as `mondodb` documentation says. but any of these queries do not work ``` 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 ``` It seems I miss something but cant understand what and where. I would be grateful for help.