Como implementar recursos geoespaciais do MongoDB

Como Implementar Recursos Geoespaciais Do Mongodb



O recurso geoespacial do MongoDB fornece uma maneira direta de armazenar dados geográficos em um banco de dados. Essencialmente, podemos armazenar os dados geoespaciais no MongoDB como objetos GeoJSON. GeoJSON é um formato gratuito e de código aberto que depende da notação de objetos JavaScript com dados geográficos simples. Essa funcionalidade é importante para apps que necessitam de serviços baseados em localização, como o processo de mapeamento, baseado em busca de localização, entre outros. Este artigo aborda o recurso geoespacial com o exemplo de implementação.

Adicionando Documentos à Coleção para Recursos Geoespaciais

Para demonstrar a funcionalidade do recurso MongoDB Geospatial, precisamos dos documentos da coleção específica. Inserimos alguns documentos na coleção “área”, conforme mostrado a seguir:

db.area.insertMany( [
{
nome: 'Parque Infantil' ,
Tipo de localização: 'Apontar' , coordenadas: [ - 60,97 , 30,77 ] },
categoria: 'Jardim'
},
{
nome: “Área do Estudante” ,
Tipo de localização: 'Apontar' , coordenadas: [ - 60.9928 , 30.7193 ] },
categoria: 'Jardim'
},
{
nome: 'Campo de Futebol' ,
Tipo de localização: 'Apontar' , coordenadas: [ - 60.9375 , 30.8303 ] },
categoria: 'Estádio'
}
] )

Temos documentos que contêm os dados de localização, como coordenadas. Além disso, criamos um índice geoespacial em campo para otimizar o desempenho das consultas geoespaciais.









Exemplo 1: Usando o Operador de Consulta $geoIntersects

Primeiro, temos o operador $geoIntersects do recurso geoespacial que cruza com o objeto fornecido. Considere a seguinte implementação do operador $geoIntersects:



db.area.find({localização: { $geoIntersects: { $geometria: { tipo: 'Apontar' ,

coordenadas: [ - 60,97 , 30,77 ] } } } })

No exemplo, chamamos a coleção “área” junto com a operação “encontrar”. Para o método find(), passamos os conjuntos de campos “local” para o operador de consulta $geoIntersects do recurso geoespacial. Isto é usado para verificar se o ponto especificado faz interseção com a geometria armazenada no campo de geometria.





Então, o operador $geoIntesects pega o operador $geometry onde o campo de tipo é definido com o valor “Ponto” e o campo de coordenadas é fornecido com os valores de “coordenadas”. Aqui, a $geometry é definida para a comparação geoespacial.

A saída a seguir é onde o documento esperado é recuperado e onde o campo de geometria contém um objeto geométrico que faz interseção com o ponto especificado:



Exemplo 2: Usando o operador de consulta $near

O operador $near também é o recurso geoespacial usado para fazer consultas geoespaciais para identificar os documentos que estão geograficamente próximos de um determinado local. Ele recupera os documentos organizados de acordo com sua proximidade do local especificado. Aqui, fornecemos a implementação do operador $near:

db.area.find(
{
localização:
{ $perto:
{
$geometria: { tipo: 'Apontar' ,  coordenadas: [ - 60.9667 , 30,78 ] },
$minDistância: 1000 ,
$distânciamáx: 5.000
}
}
}
)

No exemplo, definimos o campo “location” da coleção “area” dentro da operação “find”. Em seguida, definimos o operador de consulta $near do recurso geoespacial para esse campo “localização”. O operador $near procura o ponto próximo com o ponto de coordenadas fornecido. A seguir, usamos os parâmetros $minDistance e $maxDistance no operador $near, que são fornecidos com determinados valores para recuperar os documentos dentro do intervalo de distância especificado a partir de um determinado ponto.

O documento é recuperado na saída que está próximo dos locais ou pontos de interesse especificados em uma coleção de “área” geoespacial:

Exemplo 3: usando o operador de consulta $nearsphere

Alternativamente, temos o operador $nearsphere que é semelhante ao operador $near, mas $nearSphere leva em consideração a forma esférica da Terra ao calcular as distâncias.

db.area.find(
{
localização: {
$nearSphere: {
$geometria: {
tipo : 'Apontar' ,
coordenadas: [- 60.9667 , 30,78 ]
},
$minDistância: 1000 ,
$distânciamáx: 5.000
}
}
}
)

No exemplo, usamos o operador $nearsphere da consulta geoespacial. O operador $nearspehere aqui procura o documento cujos pontos mais próximos estão próximos dos pontos especificados na consulta e os pontos são definidos na matriz do campo de coordenadas.

Depois disso, refinamos os resultados estabelecendo os parâmetros $minDistance e $maxDistance. O parâmetro $minDistance garante que os documentos retornados estejam a pelo menos 1.000 metros de distância do ponto especificado, enquanto o parâmetro $maxDistance limita os resultados aos locais que não estão a mais de 5.000 metros de distância.

O documento é exibido na saída com uma localização dentro de um metro especificado a partir do ponto com determinadas coordenadas:

Exemplo 4: Usando o Operador de Consulta $geoWithin

A seguir, temos o operador $geoWithin no MongoDB, que é usado para consultas geoespaciais para encontrar documentos que estão completamente dentro de uma forma especificada, como um círculo. Vamos fazer a seguinte demonstração da consulta $geoWithin:

db.area.find({localização:

{ $geoDentro:

{ $centerSphere: [ [ - 60.93414657 , 30.82302903 ], 3 / 3963,2 ] } } })

No exemplo, usamos o operador $geoWithin para encontrar os documentos da coleção “área” dentro de uma determinada área circular em uma esfera 2D. Para isso, especificamos o operador $centerSphere dentro do operador $geoWithin que toma os dois argumentos como o ponto central, que provavelmente representa o ponto de coordenadas aqui, e o raio do círculo que representa o valor da distância em milhas.

O documento resultante é recuperado a seguir, representando um ponto geoespacial que se enquadra no círculo definido pelo ponto central determinado e pelo raio de aproximadamente 3 milhas:

Exemplo 5: Usando o operador de consulta $geoNear

Além disso, o operador $geoNear também é um operador geoespacial usado para o pipeline de agregação. Ele realiza uma consulta geoespacial e retorna os documentos que são classificados por proximidade a um ponto especificado. Aqui, fornecemos o operador $geoNear que é chamado dentro do pipeline de agregação.

db.area.agregado([
{
$geoPerto: {
perto de: {tipo: 'Apontar' , coordenadas: [ - 60.99279 , 30.719296 ] },
campo de distância: 'dist.calculado' ,
distância máxima: 2 ,
consulta: {categoria: 'Jardim' },
incluirLocs: 'dist.localização' ,
esférico: verdadeiro
}
}
])

No exemplo, chamamos o método agregado do MongoDB e definimos o operador $geoNear dentro dele. O operador $geoNear é definido com vários parâmetros para especificar o comportamento da consulta. Primeiro, definimos o parâmetro “próximo” que fornece os valores das “coordenadas” como ponto de referência para pesquisa.

Em seguida, utilizamos o parâmetro “distanceField” para especificar o campo fornecido como o campo de resultado. Este campo de resultado definido armazena a distância entre cada documento e o ponto de referência. A seguir definimos o parâmetro “maxDistance” com o valor “2″ que representa a distância máxima em metros.

Depois disso, temos o parâmetro “consulta” que filtra os documentos pelo campo “categoria” e considera apenas os documentos cuja “categoria” seja “Parques”. Em seguida, chamamos o parâmetro “includeLocs” para conter as informações de localização. Finalmente especificamos o parâmetro “esférico” com o valor “verdadeiro” que calcula as distâncias usando um sistema de coordenadas esféricas 2D.

O pipeline de agregação representa o documento na saída que exibe as informações em relação ao parâmetro de acordo. O seguinte campo “dist.calculated” exibe a distância de cada documento ao ponto de referência:

Conclusão

Descobrimos que os recursos geoespaciais do MongoDB nos ajudam a lidar e consultar com eficiência as informações baseadas em localização. Aprendemos a implementação do recurso geoespacial usando seus vários operadores com o programa de exemplo. Temos muito mais funcionalidades e métodos que também são benéficos para uma ampla gama de aplicações.