Introdução aos Dados Geoespaciais no MongoDB
Tags: database, mongodb, nosql, programming
Published: 2023-11-10 18:54:18

> Os dados geoespaciais no MongoDB referem-se a informações associadas a locais específicos na superfície da Terra. Esse tipo de dado é comumente representado usando o formato GeoJSON, que suporta várias geometrias, como pontos, linhas e polígonos. O MongoDB fornece recursos dedicados para trabalhar com dados geoespaciais, permitindo o armazenamento eficiente, recuperação e análise de informações relacionadas à localização.

## Quando devo utilizar?

1. **Aplicações Baseadas em Localização**: Os dados geoespaciais no MongoDB são especialmente úteis para aplicações que dependem de informações de localização, como serviços de mapas, pesquisas baseadas em localização e geofencing. Armazenar e consultar dados geoespaciais permite a construção de aplicativos que oferecem recursos sensíveis à localização.
2. **Pesquisas por Proximidade**: Quando você precisa encontrar locais próximos a um ponto específico, dados geoespaciais são úteis. Isso é benéfico para aplicativos como localizadores de lojas, buscadores de restaurantes ou qualquer serviço que envolva recomendações com base na proximidade.
3. **Análise Espacial**: Se sua aplicação envolve a análise de relacionamentos e padrões em dados espaciais, as capacidades geoespaciais do MongoDB podem ajudar. Por exemplo, você pode analisar a distribuição de pontos, identificar clusters ou realizar cálculos espaciais.
4. **Geofencing**: Geofencing envolve definir limites virtuais no mundo real e acionar ações quando um dispositivo entra ou sai desses limites. Os dados geoespaciais no MongoDB permitem a implementação eficiente de lógica de geofencing.
5. **Otimização de Rotas**: Para aplicativos que exigem planejamento ou otimização de rotas, dados geoespaciais podem ser usados para representar e consultar caminhos, ajudando a encontrar as rotas mais eficientes entre locais.

## Inserindo Dados Geoespaciais
Para inserir dados geoespaciais, você pode usar o tipo de dado GeoJSON e o índice espacial _2dsphere_. Aqui está um exemplo de inserção de um ponto:

```json
  db.locations.insert({
  name: "Centro da Cidade",
  location: {
    type: "Point",
    coordinates: [longitude, latitude]
  }
});
```
## Consulta Básica de Proximidade:
Para encontrar locais próximos a uma coordenada específica, você pode usar o operador _$nearSphere_:
```json
db.locations.find({
  location: {
    $nearSphere: {
      $geometry: {
        type: "Point",
        coordinates: [longitude, latitude]
      },
      $maxDistance: 1000 // Distância máxima em metros
    }
  }
});
```
## Consulta com Polígonos:
Você também pode realizar consultas dentro de áreas definidas usando polígonos. Vamos realizar uma consulta para encontrar todos os locais dentro de um polígono específico. Suponha que o polígono seja definido pelas seguintes coordenadas:
```javascript
const poligono = [
  [-43.200, -22.920],
  [-43.200, -22.900],
  [-43.180, -22.900],
  [-43.180, -22.920],
  [-43.200, -22.920]
];

```
A consulta no MongoDB ficará assim:
```json
db.locations.find({
  location: {
    $geoWithin: {
      $geometry: {
        type: "Polygon",
        coordinates: [poligono]
      }
    }
  }
});
```

## Consulta com LineString
A consulta _LineString_ no MongoDB é uma operação que permite encontrar documentos em uma coleção cujos dados geoespaciais, representados como trajetos contínuos (linhas), intersectam com uma linha específica. É útil para identificar, por exemplo, trajetos que passam por uma determinada rota ou área.

Para realizar essa consulta, utiliza-se o operador _$geoIntersects_ em combinação com o tipo de dado _LineString_ e as coordenadas da linha desejada no formato GeoJSON. Essa funcionalidade é valiosa em aplicações que envolvem análise de trajetos, rotas ou qualquer cenário onde a interseção de linhas geoespaciais seja relevante.

### Exemplo prático de uso do LineString
Suponha que você tenha uma coleção chamada "rotas" que armazena informações sobre diferentes trajetos, cada um representado por um documento com um campo "path" no formato GeoJSON. Vamos criar um exemplo inserindo alguns dados e realizar uma consulta para encontrar rotas que intersectam com uma linha específica.

### Inserindo dados de exemplo
Vamos inserir alguns dados de exemplo, representando as rotas:
```json
db.rotas.insert({
  nome: "Rota A",
  path: {
    type: "LineString",
    coordinates: [
      [-43.200, -22.910],
      [-43.190, -22.905],
      [-43.180, -22.900]
    ]
  }
});

db.rotas.insert({
  nome: "Rota B",
  path: {
    type: "LineString",
    coordinates: [
      [-43.185, -22.915],
      [-43.175, -22.910],
      [-43.165, -22.905]
    ]
  }
});

// Insira outras rotas conforme necessário
```
### Efetuando a consulta com LineString
Agora, vamos realizar uma consulta para encontrar rotas que intersectam com uma linha específica. Suponha que a linha seja definida pelas seguintes coordenadas:
```javascript
const linha = [
  [-43.195, -22.912],
  [-43.185, -22.907],
  [-43.175, -22.902]
];
```
A consulta no MongoDB ficará assim:
```json
db.rotas.find({
  path: {
    $geoIntersects: {
      $geometry: {
        type: "LineString",
        coordinates: linha
      }
    }
  }
});
```
## Resumo
Os dados geoespaciais no MongoDB são um recurso poderoso para lidar com informações baseadas em localização. Eles são benéficos em cenários nos quais compreender e utilizar relacionamentos espaciais aprimoram a funcionalidade e eficiência do seu aplicativo.