mongodb polygon point mongodb-query

mongodb comprueba si el punto está en polígono



polygon point (1)

mongo 2.6

Tengo cierta cantidad de polígonos almacenados. Y tengo un punto. Quiero saber si este punto se ajusta a alguno de los polígonos almacenados.

ejemplo de documento

{ ..., "polygons" : [ [ 17.60083012593064, 78.18557739257812 ], [ 17.16834652544664, 78.19381713867188 ], [ 17.17490690610013, 78.739013671875 ], [ 17.613919673106714, 78.73489379882812 ] ], ... }

Ya casi hay la misma pregunta Mongodb: compruebe si un punto está dentro de un polígono almacenado . Pero no funciona para mí: esta consulta debe dar al menos un resultado (el que está en el ejemplo), pero no lo hace.

db.areas.find( { polygons : { $geoIntersects : { $geometry : {type:"Point",coordinates:[17.3734, 78.4738]} } } } )

En realidad, si elegí un punto en un borde de cualquier polígono, lo hace.

$geoWithin método $geoWithin tiene que hacer el trabajo como dice la documentación de mondodb .

pero cualquiera de estas consultas no funciona

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

Parece que echo de menos algo, pero no puedo entender qué y dónde.

Estaría agradecido por la ayuda


Parece que tiene que ver con el orden. Si está utilizando $ geoWithin y está tratando de encontrar puntos dentro de un polígono, lo que está dentro es el campo en el que está buscando. Sin embargo, geoIntersects funciona en cualquier dirección, por lo que puede buscar puntos dentro de polígonos, o polígonos que contienen puntos, por ejemplo,

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 ] } } } });

Además, tenga en cuenta que debe repetir el primer punto del polígono al final. Si eliminas el par final, obtendrás un error "$ err": "No se puede canonicalizar la consulta: Error en la mala geo consulta".

Parece que MongoDB le permite insertar geometrías no válidas y solo se queja cuando intenta agregar un índice de 2dsphere o hace una intersección / dentro / cerca de la consulta, lo cual, supongo que es razonable, ya que GeoJSON puede ser JSON válido sin ser una geometría válida.