Definição
$geoIntersects
Seleciona documentos cujos dados geoespaciais interseccionam com um objetoGeoJSON especificado; ou seja, onde a interseção dos dados e do objeto especificado não está vazia.
O operador
$geoIntersects
utiliza o operador$geometry
para especificar o objeto GeoJSON . Para especificar um polígono ou vários polígonos GeoJSON com o sistema de referência de coordenadas padrão (CRS), utilize a seguinte sintaxe:{ <location field>: { $geoIntersects: { $geometry: { type: "<GeoJSON object type>" , coordinates: [ <coordinates> ] } } } } Para queries do
$geoIntersects
que especificam geometrias GeoJSON com áreas maiores que um único hemisfério, o uso do CRS padrão resulta em queries para as geometrias complementares.Uma geometria complementar é a menor de duas geometrias. Se uma geometria especificada cobrir mais de um hemisfério, a query padrão do CRS retornará documentos para a geometria complementar.
Por exemplo, se você definir uma geometria como uma área que cobre 75% da superfície da Terra, o CRS usará o 25% restante como área complementar. A query retorna resultados dessa área complementar menor 25% em vez da 75% maior.
A seção Exemplos nesta página mostra como especificar áreas menores e maiores.
Para especificar um polígono GeoJSON com um MongoDB CRS personalizado, utilize o seguinte protótipo que especifica o MongoDB CRS personalizado na expressão
$geometry
:{ <location field>: { $geoIntersects: { $geometry: { type: "Polygon" , coordinates: [ <coordinates> ], crs: { type: "name", properties: { name: "urn:x-mongodb:crs:strictwinding:EPSG:4326" } } } } } } O CRS personalizado do MongoDB usa uma ordem de enrolamento no sentido anti-horário e permite que
$geoIntersects
aceite queries com um polígono GeoJSON de anel único cuja área seja maior ou igual a um único hemisfério. Se o polígono especificado for menor que um único hemisfério, o comportamento do$geoIntersects
com o CRS do MongoDB será o mesmo que com o CRS padrão. Veja também Polígonos "big".Importante
Se especificar coordenadas de latitude e longitude, liste a longitude primeiro e então a latitude.
Os valores de longitude válidos estão entre
-180
e180
, ambos inclusos.Os valores de latitude válidos estão entre
-90
e90
, ambos inclusos.
Comportamento
Índices geoespaciais
$geoIntersects
utiliza geometria esférica. $geoIntersects
não exige um índice geoespacial. No entanto, um índice geoespacial melhorará o desempenho da query. Somente o índice geoespacial 2dsphere aceita $geoIntersects
.
Degeneração geométrica
$geoIntersects
não garante que considerará a interseção de um polígono com suas próprias bordas, seus próprios vértices ou outro polígono que compartilhe vértices ou bordas, mas não tenha espaço interior.
Polígonos "big"
Por $geoIntersects
, se você especificar um polígono de anel único que tenha uma área maior que um único hemisfério, inclua o sistema de referência de coordenadas personalizado do MongoDB na expressão $geometry
. Caso contrário, $geoIntersects
consultará a geometria complementar. Para todos os outros polígonos GeoJSON com áreas maiores que um hemisfério, $geoIntersects
consultará a geometria complementar.
Exemplos
Intersecciona um polígono
O exemplo a seguir utiliza $geoIntersects
para selecionar todos os dados loc
que fazem interseção com o Polygon
definido pela array coordinates
. A área do polígono é menor que a área de um único hemisfério:
db.places.find( { loc: { $geoIntersects: { $geometry: { type: "Polygon" , coordinates: [ [ [ 0, 0 ], [ 3, 6 ], [ 6, 1 ], [ 0, 0 ] ] ] } } } } )
Para polígonos de anel único com áreas maiores que um único hemisfério, consulte Intersecciona com um polígono "grande".
Intersecciona um Polígono "Grande"
Para executar query com um polígono GeoJSON de anel único cuja área é maior que um único hemisfério, a expressão $geometry
deve especificar o sistema de referência de coordenadas MongoDB personalizado. Por exemplo:
db.places.find( { loc: { $geoIntersects: { $geometry: { type : "Polygon", coordinates: [ [ [ -100, 60 ], [ -100, 0 ], [ -100, -60 ], [ 100, -60 ], [ 100, 60 ], [ -100, 60 ] ] ], crs: { type: "name", properties: { name: "urn:x-mongodb:crs:strictwinding:EPSG:4326" } } } } } } )