Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

mongodb check if point is in polygon

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.

like image 979
user3806072 Avatar asked Jul 04 '14 16:07

user3806072


1 Answers

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.

like image 188
John Powell Avatar answered Sep 20 '22 02:09

John Powell