Esta breve introdução a vários conceitos de dados geoespaciais abrange bancos de dados espaciais, indexação espacial e uso de dados GeoJSON em NoSQL.
O que são dados espaciais?
Dados espaciais são tipos de dados (arquivos, bancos de dados, serviços da Web) que codificam informações geográficas para uso em aplicativos com reconhecimento de local.
Quando escrevi um livro sobre mapeamento baseado na Web há 15 anos, meus leitores foram forçados a aprender uma pilha de tecnologias, em sua maioria novas. Os geógrafos tiveram que aprender a tecnologia e os desenvolvedores tiveram que aprender o domínio. Isso incluía servidores da Web, aplicativos SQL e um pouco de PHP. Mas a grande "novidade" era usar dados espaciais. Embora seja mais comum atualmente, os desenvolvedores de aplicativos ainda precisam entender como trabalhar com esse tipo de dados espaciais específico do domínio.
O que são sistemas de informações geográficas (GIS)?
A cartografia é tão antiga quanto a própria civilização. Desde a travessia de oceanos até o planejamento de cidades, as informações foram coletadas e transcritas para o papel.*
Assim como digitalizamos textos e números, os cartógrafos começaram a colocar dados de pontos, linhas e polígonos em sistemas digitais.
Isso criou a Sistemas de informações geográficas (GIS) domínio. Os dados espaciais podiam ser desenhados como uma camada gráfica em um mapa, mas também analisavam características geográficas e relações de localização. O gerenciamento florestal, o planejamento do uso da terra, o transporte, o levantamento topográfico e muito mais, todos aproveitaram esses sistemas.

1900 (est.) Mapa da Universidade de Stanford por C. O. Taylor, de DavidRumsey.com item 1345400.
São elas vetor porque são construídos a partir de pontos de dados (pense em coordenadas x, y, z) e uma direção que os conecta. Junte vários pontos em uma linha ou feche o loop e crie uma área de polígono.
Os dados raster, por outro lado, são feitos de imagens ou grades de valores digitais na forma de pixels - por exemplo, imagens de satélite, modelos de elevação etc. Esse tipo de dados está fora do escopo deste artigo.
* O pessoal da Bay Area é incentivado a conferir os mapas antigos no Coleção de mapas de David Rumsey on-line alojado em Stanford com ativos físicos
O espaço era especial
Os sistemas de gerenciamento de bancos de dados relacionais ofereciam suporte a objetos espaciais, mas eram amplamente usados por analistas espaciais. Esses tipos especiais de dados vetoriais e bancos de dados eram um tanto esotéricos para desenvolvedores de aplicativos e da Web.
Era preciso ter conhecimento especial para usar dados especiais de um software GIS especial. Os dados tinham de ser carregados em um banco de dados espacial para análise posterior e conectividade de aplicativos.
É claro que, quando o Google Maps foi lançado, as pessoas começaram a se conscientizar mais sobre o que são dados espaciais, e a tendência passou a ser a integração de dados de mapas de terceiros, mas isso é outra história.
Em geral, os geógrafos usavam o software de mapeamento de desktop da ESRI para criar imagens de mapas (estáticas) e PDFs. (Mais recentemente, o projeto QGIS.org, gratuito e de código aberto, tomou o mundo de assalto). Eles também podem exportar esses dados para serem usados em um banco de dados totalmente diferente. Os desenvolvedores da Web poderiam importar esses dados para um banco de dados espacial e, em seguida, consultá-los com uma camada de aplicativo de mapeamento da Web com reconhecimento de local para gerar imagens para seus usuários.

Mapa de distribuição do vírus e da população pelo QGIS autor Kurt Menke.
O que é um banco de dados espacial (geoespacial)?
Um banco de dados espacial, também conhecido como "banco de dados geoespacial", é criado para capturar e armazenar pontos, linhas e áreas de informações cartográficas que chamamos de dados espaciais. Muitas vezes, esses bancos de dados eram bastante comuns, mas tinham extensões para lidar com objetos binários (BLOBs) em um de seus campos - SQL Server, Oracle, PostgreSQL, Ingres, SQLite, todos têm complementos espaciais.
Os problemas se tornaram mais complexos à medida que os volumes de dados cresciam e os fluxos de trabalho se transformavam. Em vez de apenas produzir e compartilhar dados, os desenvolvedores estavam sendo pressionados a produzir mais informações e conhecimento a partir dos dados. Havia também um impulso para a interoperabilidade e a eficiência.
Isso apresentou novas oportunidades para criar padrões para serviços geoespaciais otimizados para a Web - para compartilhar imagens de mapas ou dados tabulares brutos a serem usados em outro aplicativo com reconhecimento de local. Embora os formatos baseados em arquivos da ESRI (shapefiles, geodatabase) eram populares para usuários de desktop, muitos desenvolvedores da Web queriam dados em um banco de dados corporativo como o PostgreSQL que tem sido o principal banco de dados espacial de código aberto há anos.
Quando os dados estavam em um banco de dados, os desenvolvedores podiam ter mais controle sobre o fluxo de trabalho. Da mesma forma, um número crescente de analistas espaciais começaram a usar a funcionalidade espacial dos sistemas de banco de dados.
O que é GeoJSON?
Com a evolução de padrões ainda mais técnicos para dados espaciais na Web, os desenvolvedores usaram o formato JSON (JavaScript Object Notation) com padrões de codificação geográfica incorporados. GeoJSON nasceu e podia conter campos de dados de atributos juntamente com pares de coordenadas de pontos para definir pontos vetoriais, linhas e polígonos. Baseado em JSON, que permite vários objetos incorporados, listas e mapeamentos de chave/valor, ele era adequado para dados geográficos.
Aqui está um exemplo de uma linha básica com dois campos de dados de atributo:
1 2 3 4 5 6 7 8 9 10 11 |
<extensão classe="s2">"tipo"</extensão><extensão classe="o">:</extensão> <extensão classe="s2">"Recurso"</extensão><extensão classe="p">,</extensão> <extensão classe="s2">"geometria"</extensão><extensão classe="o">:</extensão> <extensão classe="p">{</extensão> <extensão classe="s2">"tipo"</extensão><extensão classe="o">:</extensão> <extensão classe="s2">"LineString"</extensão><extensão classe="p">,</extensão> <extensão classe="s2">"coordenadas"</extensão><extensão classe="o">:</extensão> <extensão classe="p">[</extensão> <extensão classe="p">[-</extensão><extensão classe="mf">121.0</extensão><extensão classe="p">,</extensão> 49<extensão classe="mf">.0</extensão><extensão classe="p">],</extensão> <extensão classe="p">[-</extensão><extensão classe="mf">103.0</extensão><extensão classe="p">,</extensão> 52<extensão classe="mf">.0</extensão><extensão classe="p">],</extensão> <extensão classe="p">[45</extensão><extensão classe="mf">.0</extensão><extensão classe="p">,</extensão> 51<extensão classe="mf">.0</extensão><extensão classe="p">],</extensão> <extensão classe="p">[</extensão><extensão classe="mf">10.0</extensão><extensão classe="p">,</extensão> 46<extensão classe="mf">.0</extensão><extensão classe="p">]</extensão> <extensão classe="p">]</extensão> <extensão classe="p">},</extensão> <extensão classe="s2">"propriedades"</extensão><extensão classe="o">:</extensão> <extensão classe="p">{</extensão> <extensão classe="s2">"tipo"</extensão><extensão classe="o">:</extensão> <extensão classe="s2">"flightpath"</extensão><extensão classe="p">,</extensão> <extensão classe="s2">"distância"</extensão><extensão classe="o">:</extensão> 3400<extensão classe="mf">0.0</extensão> <extensão classe="p">}</extensão> |
Os desenvolvedores sabem que o JSON é uma maneira de obter dados de um arquivo simples ou banco de dados de seus colegas geógrafos. Quando solicitado, um banco de dados espacial converte de um formato tabular para JSON antes de enviá-lo para o aplicativo de consumo.
Alinhamento de NoSQL
O bom de Bancos de dados NoSQL é que eles foram criados para usar JSON diretamente. Com o Couchbase, com o qual estou mais familiarizado, o esquema flexível também é um bônus: não é necessário validar o esquema de uma estrutura tabular rígida como parte de um aplicativo. Isso facilita o ajuste conforme necessário, especialmente durante as fases de prototipagem em que os tipos de dados e os esquemas podem estar mudando.
Nem todos os dados espaciais estão em um formato tabular, nem faria sentido que estivessem, então por que forçá-los? Por exemplo, um perfil de usuário para um aplicativo pode querer ter dados hierárquicos em que um endereço é um objeto opcional na tabela Modelo de dados NoSQL. Ou talvez haja a opção de ter vários números de telefone, mas nem todos podem ter um. Nesses casos, você não quer manter colunas vazias em uma tabela por precaução.
Quando você começar a pensar nos dados espaciais como apenas outro objeto com uma lista de coordenadas, verá como eles se alinham bem com os bancos de dados NoSQL.
A natureza de computação distribuída do NoSQL sempre acrescenta luxo ao seu uso em aplicativos geoespaciais, pois eles são criados para lidar com cargas de trabalho difíceis. Ao usar a computação baseada em cluster, os dados espaciais podem crescer com o tempo e mais recursos de consulta podem ser prontamente adicionados conforme necessário.
Esses são apenas alguns motivos por que as empresas escolhem os dados NoSQL plataformas.
Funções do banco de dados geoespacial
Desenho de mapas
A função mais comum para os desenvolvedores que acessam dados espaciais é criar um mapa, seja on-line, em um aplicativo móvel ou em um desktop. Isso pode assumir algumas formas, mas é principalmente uma solicitação de um conjunto específico de registros de documentos que o aplicativo renderiza para o usuário.
A renderização de mapas é um domínio por si só, mas a maioria das APIs on-line que ajudam a fazer isso (por exemplo, MapBox, Leaflet) tem alguns padrões básicos que permitem que os usuários comecem a trabalhar rapidamente. Para ser honesto, a maioria dos mapas on-line mostra apenas alguns marcadores de pontos em cima de uma imagem. Portanto, esse é um caso de uso para dados de mapas, mas não é realmente o que os usuários de GIS escolheriam ao realizar uma análise.
Além de apenas solicitar um conjunto de documentos, um banco de dados espacial precisa permitir a filtragem de recursos/documentos específicos com base em uma consulta. Naturalmente, o uso de linguagens SQL que fornecem uma cláusula WHERE ajuda a tornar isso possível. Existem formas geográficas mais avançadas de filtrar dados (por exemplo, para uma região/área específica), que também serão abordadas.
Indexação espacial
Para fazer uma filtragem espacial mais avançada para desenhar mapas, ou até mesmo para fazer o que é chamado de junções espaciais (junção de registros com base em sua localização próxima, como uma loja dentro de uma região), é necessário ter os dados geográficos indexados. Assim como você indexaria outros campos em um banco de dados, há métodos especiais de indexação para tipos de campos geoespaciais.
Em geral, os bancos de dados espaciais calculam um retângulo em torno de cada um dos recursos em um conjunto de dados e o utilizam como um índice aproximado para consultas. Isso também é conhecido como retângulo mínimo delimitador (MBR) e é um tipo de Índice R-Tree também é usado.
A consulta de dados usa esses índices para encontrar os recursos espaciais que se sobrepõem ou estão a uma distância de outro local. Eles usam o MBR para ver o quão próximos os recursos podem estar uns dos outros, para que possam ignorar aqueles que não estão próximos o suficiente para serem importantes.
O Couchbase cria índices espaciais usando seu pesquisa de texto completo serviço. Ao especificar qual campo contém dados geográficos, o índice saberá que tipo de índice deve ser criado. As solicitações de pesquisa subsequentes com um componente geoespacial usarão esses índices, embora o usuário nunca precise vê-los ou interagir com eles diretamente.

Configuração de um tipo de ponto geográfico na GUI da Web de pesquisa do Couchbase. O campo "geo" contém dados de ponto GeoJSON. Clique para ver o blog que mostra isso sendo usado.
Linguagem de consulta espacial
Os aplicativos de mapeamento são excelentes para ocultar consultas espaciais mais complexas que estão sendo usadas nos bastidores. Por exemplo, quando um usuário ativa ou desativa uma camada, o aplicativo deve alterar as consultas que estão sendo executadas, ignorando os dados de que não precisa. Da mesma forma, quando um usuário aumenta o zoom em um mapa, a janela do mapa muda e as consultas subjacentes solicitam dados somente para essa nova janela do mapa. Se um aplicativo solicitasse todos os dados, o tempo todo, ele seria inutilizável.
As próprias consultas usam funções que recebem alguns tipos diferentes de variáveis:
- caixa delimitadora ou área para a consulta
- nomes de camadas ou tabelas a serem incluídos
- distância de um determinado ponto à consulta
- coordenadas de um polígono que define a área de consulta
Os bancos de dados relacionais fazem isso por meio das consultas SQL subjacentes. Os sistemas NoSQL variam em suas abordagens. O Couchbase, por exemplo, pode fazer a solicitação de documentos usando a linguagem baseada em N1QL/SQL para consultas NoSQL.
Em seguida, os aplicativos downstream podem usar os objetos geoespaciais diretamente. Este blog, por exemplo, mostra como o Linguagem de programação R solicita dados facilmente e usa o pacote de mapeamento Leaflet para obter resultados. Não foi necessário nenhum processamento avançado, apenas uma solicitação N1QL/SQL básica.
Porém, quando você deseja fazer mais consultas relacionadas a geoespacialidade, o Couchbase usa um conjunto de solicitações de pesquisa geoespacial (do serviço de pesquisa de texto completo) usando uma distância radial de um ponto, dentro de uma área retangular e dentro de uma forma de polígono fornecida. Isso permite a extração apenas dos documentos/registros de interesse, sem a necessidade de bibliotecas ou ferramentas espaciais adicionais.
Operações espaciais avançadas
Mas as consultas são apenas metade da batalha! Aplicativos GIS e bancos de dados espaciais completos têm muito mais funções de geração de dados. Isso inclui o cálculo do ponto central (centroide) de polígonos, operações booleanas entre várias formas sobrepostas (interseção, diferença, união) e conversão para diferentes formatos de serialização (binário, texto, XML, JSON).
O Open Geospatial Consortium (OGC) mantém as especificações para todos esses recursos sob o título de Recursos simples para SQL. Há muitos tipos e funções de recursos espaciais diferentes nessa especificação. Aqui está uma amostra.

Lista de tipos e funções de recursos geoespaciais simples da OGC em comparação com outros padrões. Em https://www.ogc.org/standards/sfs
As uniões espaciais também são muito populares para conectar, por exemplo, um conjunto de pontos e encontrar os polígonos nos quais eles se enquadram. Ou conectar uma camada de polígonos a outra camada de recursos. Em seguida, os campos de ambos os conjuntos de dados podem ser usados em mapas ou relatórios.
Todos eles são muito avançados e úteis para os analistas. No entanto, os índices espaciais ajudam apenas em partes das consultas. A parte mais complexa é fazer a geometria computacional para calcular novos recursos. Não há uma maneira fácil de fazer isso, portanto, o gerenciamento de recursos (e uma boa cafeteira) é muito importante.
Conclusão
Esta foi uma introdução muito breve a muitos conceitos diferentes. Espero que isso lhe dê alguns pontos de contato para aprender mais sobre o domínio do banco de dados espacial. Aqui estão mais alguns blogs e recursos geoespaciais do Couchbase.
Faça o download do banco de dados NoSQL do Couchbase gratuitamente. Desenvolva em um laptop e implemente facilmente na nuvem quando estiver pronto para escalar. Instale e acompanhe estes tutoriais:
- Programação em R com consultas e mapas NoSQL do Couchbase (folheto)
- Pesquisa geoespacial com ASP.NET Core, Aurelia e Google Maps
- Consultas geoespaciais: Usando Python para pesquisar cidades
- Uso do NoSQL para pesquisa geoespacial sem um banco de dados espacial