mongodb check if point is in polygon
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.
Thanks for John Powell here is C# driver version of the same query.
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();
In Java it Can be done this way
@Autowiredprivate 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 }