Este capítulo apresenta como o MongoDB armazena dados geoespaciais. Para utilizar a funcionalidade de consulta geoespacial do MongoDB, primeiro precisamos entender como armazenar dados geoespaciais.

Os dados geoespaciais consistem principalmente em pontos, linhas e formas geométricas.

Um ponto em um mapa é definido por suas coordenadas de longitude e latitude. Múltiplos pontos formam uma linha e várias linhas podem formar várias formas.

Em aplicações práticas: A localização de uma loja, "Onde estou?", e "Onde fica a escola?" podem ser representadas usando coordenadas. Descrever a extensão de um campus ou de um shopping requer formas geométricas.

Objeto GeoJSON

O MongoDB utiliza objetos GeoJSON para representar informações geoespaciais.

Os tipos comuns de GeoJSON incluem:

  • Point - representando um ponto de coordenada
  • LineString - representando uma linha
  • Polygon - representando um polígono

O formato para armazenar objetos GeoJSON em campos do MongoDB é o seguinte:

<campo>: { type: <tipo geojson>, coordinates: <coordenadas> }

Explicação:

  • - Nome do campo
  • type - Tipo GeoJSON
  • coordinates - Uma matriz de pontos de coordenadas. O formato varia para diferentes tipos de GeoJSON.

Exemplo:

localizacao: {
      type: "Point",  // tipo de dado geoespacial, neste caso, é um ponto de coordenadas
      coordinates: [-73.856077, 40.848447] // longitude, latitude
}

Explicação: O campo de localização armazena dados geoespaciais do tipo ponto de coordenada.

Ponto de Coordenada (Point)

Formato:

{ type: "Point", coordinates: [ longitude, latitude ] }

Exemplo:

{ type: "Point", coordinates: [ 40, 5 ] }

Linha (LineString)

Formato:

{ type: "LineString", coordinates: [ ponto1, ponto2, ...] }

Exemplo:

{ type: "LineString", coordinates: [ [ 40, 5 ], [ 41, 6 ] ] }

Polígono

Pode ser composto por uma ou mais linhas. Formato:

{
  type: "Polygon",
  coordinates: [ 
		linha1,
		linha2,
		....
	]
}

Nota: As coordenadas de início e fim de cada segmento de linha devem ser iguais para formar uma forma fechada.

Forma Composta por um Único Segmento de Linha

{
  type: "Polygon",
  coordinates: [
  		[ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0  ] ] // Pontos de coordenadas do segmento de linha, observe que as primeiras e últimas coordenadas são iguais.
	]
}

Forma Composta por Múltiplos Segmentos de Linha

{
  type : "Polygon",
  coordinates : [
     [ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0 ] ], // Segmento de linha 1
     [ [ 2 , 2 ] , [ 3 , 3 ] , [ 4 , 2 ] , [ 2 , 2 ] ]  // Segmento de linha 2
  ]
}

Índice Geoespacial

O MongoDB suporta dois tipos de índices geoespaciais para acelerar a consulta de dados GeoJSON.

2dsphere

Este é um tipo de índice de geometria esférica, o que significa que ao calcular a distância entre dois pontos, 2dsphere considera a Terra como uma esfera.

Exemplo de criação de um índice 2dsphere:

db.colecao.createIndex( { localizacao : "2dsphere" } )

Cria um índice para o campo de localização.

2d

2D é um tipo de geometria planar usado para calcular a distância entre dois pontos como se estivessem em um plano. Exemplo de criação de um índice 2D:

db.colecao.createIndex( { localizacao : "2d" } )

Isso cria um índice para o campo de localização.

Tipos de Consulta Geoespacial

As consultas geoespaciais estão todas relacionadas a cálculos geométricos. Abaixo estão os tipos de consulta suportados pelo MongoDB:

  • $geoIntersects - Usado para corresponder documentos com a interseção de formas geométricas específicas.
  • $geoWithin - Corresponde a documentos contidos dentro de uma área geométrica especificada.
  • $near - Normalmente usado para consultar documentos mais próximos de um ponto de coordenada específico.

Nota: Para mais informações sobre consultas geoespaciais, consulte os capítulos seguintes.