Menu Docs
Página inicial do Docs
/ / /
Driver GO
/

Trabalhar com Dados Geoespaciais

Nesta página

  • Visão geral
  • Armazenar dados geoespaciais
  • GeoJSON
  • Pares de coordenadas legados
  • Índices geoespaciais
  • 2dsphere
  • 2d
  • Consultas geoespaciais
  • Operadores de Consulta
  • Exemplos
  • Query por proximidade
  • Query dentro de um intervalo
  • Recursos adicionais

Neste guia, você pode aprender como trabalhar com dados geoespaciais; formatos de dados, índices e queries. Os dados geoespaciais representam uma localização geográfica na superfície da Terra, ou dados em um plano euclidiano.

Exemplos de dados geoespaciais incluem:

  • Localizações de cinemas

  • Fronteiras de países

  • Rotas de passeios de bicicleta

  • Áreas de exercícios para cães na cidade de Nova York

  • Pontos em um gráfico

Todos os dados geoespaciais no MongoDB são armazenados em um dos seguintes formatos:

  • GeoJSON, um formato que representa dados geoespaciais em uma esfera semelhante à Terra.

  • Par de Coordenadas Legado, um formato que representa dados geoespaciais em um plano Euclidiano.

Utilize GeoJSON para armazenar dados que representam informações geoespaciais em uma esfera semelhante à Terra. O GeoJSON é composto por uma ou mais posições e um tipo.

Uma posição representa um único local na Terra e existe em código como uma array contendo os seguintes valores:

  • Longitude na primeira posição (obrigatório)

  • Latitude na segunda posição (obrigatório)

  • Elevação na terceira posição (opcional)

A seguir, a posição da sede do MongoDB na cidade de Nova York, NY.

[]float64{-73.986805, 40.7620853}

Importante

Longitude e depois latitude

A GeoJSON ordena coordenadas como longitude primeiro e latitude segundo. Isto pode ser surpreendente como convenções do sistema de coordenadas geográficas geralmente listam latitude primeiro e longitude segundo. Certifique-se de verificar qual formato qualquer outra ferramenta com a qual você está trabalhando usa. Ferramentas populares como OpenStreetMap e Google Maps listam coordenadas como latitude primeiro e longitude segundo.

O tipo de objeto GeoJSON determina a forma geométrica que representa. Formas geométricas são compostas por posições.

Aqui estão alguns tipos de GeoJSON comuns e como você pode especificá-los com posições:

  • Point: uma única posição. O seguinte Point representa a localização da sede do MongoDB:

    bson.D{
    {"name", "MongoDB HQ"},
    {"location", bson.D{
    {"type", "Point"},
    {"coordinates", []float64{-73.986805, 40.7620853}},
    }},
    }
  • LineString: uma array de duas ou mais posições que forma uma série de segmentos de linha. Um LineString pode representar um caminho, rota, borda ou quaisquer outros dados geoespaciais lineares. O LineString a seguir representa um segmento da Grande Muralha da China:

    bson.D{
    {"name", "Great Wall of China"},
    {"location", bson.D{
    {"type", "LineString"},
    {"coordinates", [][]float64{
    {116.572, 40.430},
    {116.570, 40.434},
    {116.567, 40.436},
    {116.566, 40.441},
    }}},
    },
    }
  • Polygon: uma array de posições em que a primeira e a última posição são iguais e incluem algum espaço. O seguinte Polygon representa o território da Cidade do Vaticano:

    bson.D{
    {"name", "Vatican City"},
    {"location", bson.D{
    {"type", "Polygon"},
    {"coordinates", [][][]float64{{
    {12.446086, 41.901977},
    {12.457952, 41.901559},
    {12.455375, 41.907351},
    {12.449863, 41.905186},
    {12.446086, 41.901977},
    }}},
    }},
    }

Para saber mais sobre os tipos GeoJSON que você pode usar no MongoDB, consulte a entrada do manual GeoJSON.

Para obter informações sólidas sobre o GeoJSON,consulte a especificação oficial do IETF.

Utilize pares de coordenadas legadas para armazenar dados que representam informações geoespaciais em um plano Euclideano bidimensional.

Seu campo deve conter uma array de dois valores em que o primeiro representa o valor do eixo x e o segundo representa o valor do eixo y.

bson.D{{"center", []int16{0, 0}}}

Para mais informações sobre pares de coordenadas legadas, consulte a página manual do servidor MongoDB sobre pares de coordenadas legadas.

Para habilitar a query em dados geoespaciais, você deve criar um índice que corresponda ao formato de dados. Os seguintes tipos de índice habilitam queries geoespaciais:

  • 2dsphere para dados GeoJSON

  • 2d para pares de coordenadas legadas

Para fazer consulta de dados armazenados no formato GeoJSON, adicione o campo que contém o type e o coordinates a um índice 2dsphere. O exemplo abaixo cria um índice 2dsphere no campo location:

indexModel := mongo.IndexModel{
Keys: bson.D{{"location", "2dsphere"}},
}
name, err := coll.Indexes().CreateOne(context.TODO(), indexModel)
if err != nil {
panic(err)
}

Para dados de consulta armazenados como legacy coordinate pairs, você deve adicionar o campo contendo legacy coordinate pairs a um índice 2d. O exemplo abaixo cria um índice 2d no campo coordinates:

indexModel := mongo.IndexModel{
Keys: bson.D{{"location.coordinates", "2d"}},
}
name, err := coll.Indexes().CreateOne(context.TODO(), indexModel)
if err != nil {
panic(err)
}

Para executar uma query geoespacial, crie um filtro de query com um nome de campo e um operador de query geoespacial. Você pode especificar opções adicionais para determinados operadores de query geoespacial para limitar os documentos retornados.

Se ainda não tiver feito isso, você deverá criar um índice geoespacial para habilitar as queries geoespaciais.

Dica

Operadores suportados

Os índices esféricos (2dsphere) e planos (2d) suportam alguns, mas não todos, dos mesmos operadores de query. Para uma lista completa de operadores e sua compatibilidade de índice, consulte a entrada manual para queries geoespaciais.

Para fazer query de seus dados geoespaciais, utilize um dos seguintes operadores de query:

  • $near

  • $geoWithin

  • $nearSphere

  • $geoIntersects requer um índice de 2dsphere

Ao utilizar o operador $near, você pode especificar os seguintes operadores de distância:

  • $minDistance

  • $maxDistance

Ao utilizar o operador $geoWithin, você pode especificar os seguintes operadores de forma:

  • $box

  • $polygon

  • $center

  • $centerSphere

Para mais informações sobre operadores de query geoespacial, consulte a entrada manual para queries geoespaciais.

Os exemplos seguintes utilizam o conjunto de dados de amostra do MongoDB Atlas. Você pode carregar conjuntos de dados de amostra em seu banco de dados na camada gratuita do MongoDB Atlas seguindo o Guia de Introdução ao Atlas ou pode importar o conjunto de dados de amostra para uma instância local do MongoDB.

Os exemplos utilizam a coleção do theaters no banco de dados do sample_mflix a partir do conjunto de dados de amostra. A coleção theaters contém um índice 2dsphere no campo location.geo.

O exemplo a seguir faz query de documentos com um campo location.geo em um raio de 1.000 metros da sede do MongoDB na cidade de Nova York, NY. Ele retorna documentos do mais próximo para o mais distante.

mongoDBHQ := bson.D{{"type", "Point"}, {"coordinates", []float64{-73.986805, 40.7620853}}}
filter := bson.D{
{"location.geo", bson.D{
{"$near", bson.D{
{"$geometry", mongoDBHQ},
{"$maxDistance", 1000},
}},
}},
}
var places []bson.D
output, err := coll.Find(context.TODO(), filter)
if err = output.All(context.TODO(), &places); err != nil {
panic(err)
}
for _, place := range places {
res, _ := bson.MarshalExtJSON(place, false, false)
fmt.Println(string(res))
}
{"_id":{...},"theaterId":1908,"location":{"address":{...},"geo":{"type":"Point","coordinates":[-73.983487,40.76078]}}}
{"_id":{...},"theaterId":1448,"location":{"address":{...},"geo":{"type":"Point","coordinates":[-73.982094,40.769882]}}}

O exemplo a seguir faz query de documentos com um campo location.geo a uma distância não inferior a 2.000 metros e não superior a 3.000 metros da sede do MongoDB na cidade de Nova York, NY. Ele retorna documentos do mais próximo para o mais distante.

mongoDBHQ := bson.D{{"type", "Point"}, {"coordinates", []float64{-73.986805, 40.7620853}}}
filter := bson.D{
{"location.geo",
bson.D{
{"$nearSphere", bson.D{
{"$geometry", mongoDBHQ},
{"$minDistance", 2000},
{"$maxDistance", 3000},
}},
}},
}
var places []bson.D
output, err := coll.Find(context.TODO(), filter)
if err = output.All(context.TODO(), &places); err != nil {
panic(err)
}
for _, place := range places {
res, _ := bson.MarshalExtJSON(place, false, false)
fmt.Println(string(res))
}
{"_id":{...},"theaterId":482,"location":{...},"geo":{"type":"Point","coordinates":[-73.99295,40.74194]}}}
  • Para mais informações sobre trabalhar com dados geoespaciais, consulte a entrada manual para dados geoespaciais.

  • Para mais informações sobre tipos GeoJSON suportados, consulte a entrada manual GeoJSON.

  • Para mais informações sobre operadores de query geoespacial, consulte a entrada manual para queries geoespaciais.

  • Para obter mais informações sobre como trabalhar com índices com o driver Go, consulte oguia de índice .

← Criptografia em execução