/BR_IBGE_new

New Brazilian Hierarchical Grid

Primary LanguagePLpgSQLApache License 2.0Apache-2.0

Geohash adaptado à Grade Estatística IBGE

STATUS: EM CONSTRUÇÂO - ajuste fino com BR_IBGE.

SUMÁRIO:


A grade estatística oficial de um país é um mosaico de polígonos regulares e de igual-área que cobre todo o seu território. Sendo definida por uma norma oficial e estável, a grade não muda com o tempo. Por ser espacialmente regular, permite a conversão automática entre grandezas extensivas (ex. população de um município) e intensivas (ex. densidade populacional num ponto), entre geo-objetos e geo-campos.

A grade é tão importante que não pode ficar restrita a apenas um tipo de uso, a Grade Estatística do IBGE pode manter suas características originais, suprindo as necessidades do Censo, e ir além: através das adaptações propostas ela conquistaria outros nichos de uso, contemplando múltiplas finalidades. Por exemplo o uso da grade em dados oficiais da Saúde ou do Meio Ambiente, ou os identificadores da grade (geocódigos) para a localização de endereços postais em operações logísticas e no agroneǵócio.

A proposta de "Nova Grade IBGE" do Instituto AddressForAll teve por objetivo:

  1. preservar a soberania do país, sobre os seus geocódigos e sua infraestrutura de dados espaciais, e a do cidadão, no seu direito à interoperabilidade, à transparência e ao acesso a dados públicos.
    (portanto fazer uso apenas de tecnologia aberta e consensual)

  2. reutilizar a "grade de 1 km" (com células de 1 km de lado) da Grade Estatística do IBE;

  3. incluir mais níveis hierárquicos entre as grades de 500 km e de 1km;

  4. proporcionar um sistema de geocódigos hierárquicos e compactos sobre a grade;

  5. fazer uso de tecnologias de alta performance, tanto na indexação (bancos de dados) como na resolução (tradução do geocódigo da célula em localização no mapa).

A solução de geocódico encontrada foi o algortimo Geohash, com pequenas adaptações denominadas Geohash Generalizado. O restante do processo de desenvolvimento da Nova Grade foi orientado pela tentativa de se preservar outras caracterísicas interessantes da grade IBGE, tais como a projeção cartográfica e a escolha do recorte sobre a América do Sul.

Por fim, satisfeitos todos os 5 requisitos acima, propomos o teste de mais um, o item 6: mais níveis, para obter resolução inferior ao 1 km e ampliar o uso dos geocódigos da grade proposta.

Geocódigos compactos, como o Geohash, podem ir mais além na conquista de aplicações para a grade: servir de CEP, um novo código postal que localiza efetivamente o endereço até a porta de casa.

Por isso na solução proposta está sendo também prevista extensão de níveis hierárquicos até a ordem de metro ou dezena de metro.

Apresentação das decisões de projeto

A Grade Estatística IBGE é distribuída livremente em grade_estatistica/censo_2010, do site IBGE.gov.br. Neste link você pode encontrar a "articulação", que é o mosaico de células do nível hierárquico mais grosseiro da grade. Em outras palavras, é a "grade IBGE nível zero", L0. Ela é composta quadrados de 500 km de lado, apelidados de quadrantes, e cada um com seu identificador numérico, do 04 ao 93.

Quando sobrepomos a articulação original à nossa proposta (numa primeira tentativa centramos no quadrante 45), percebemos que são muito parecidas.

A "grade" do IBGE é na verdade um conjunto hierarquizado de grades. Cada quadrante da grade IBGE original é subdividio em quadrados com lado medindo 1/5 ou 1/2 do seu tamanho para formar a grade seguinte, de maior resolução. A grade seguinte à L0, a L1, tem quadrados com 500/5 km = 100 km de lado; a seguinte L2 com 100/2 km = 50 km; L3 com 50/5 km = 10 km; L4 com 10/2 km = 5 km; L6 com 5/5 km = 1 km.

O ponto de partida na adaptação foi "reutilizar a grade de 1 km" (item 1 dos objetivos), que é a grade IBGE L6. Nesta reutilização está implícito também o reuso da Projeção Cônica de Albers padronizada pelo IBGE.

A Nova Grade tem a liberdade de ser um pouco maior, mas idealmente sua grade mais grosseira (L0) estaria ainda "encaixada" na articulação dos quadrantes da grade L0 do IBGE. No sistema Geohash Generalizado as células da grade do nível seguinte são particionadas em 4, de modo que a cada nível o tamanho de lado da célula é dividido por 2, conforme a ilustração abaixo.

Como nosso ponto partida foi a grade de 1 km, devemos multiplicar por 2 sucessivamente até chegar num tamanho próximo de 500 km, e elegendo o mesmo como nível zero, L0, da Nova Grade.

Na tabela acima, da nossa proposta, os quadrantes L0 "engordaram" dos 500 km da garde original para 512 km. Uma boa aproximação, pois 90% das células de 1 km podem permamencer com identificador de quadrante compatível com a articulação original.

Apesar de pouco acréscimo na grade final, percebemos que, a cada célula, os 6 km maiores nas 4 direções poderiam ser suficientes para ampliar a grade ao norte, a ponto de eliminar a necessidade dos quadrantes 92 e 93. Decidimos então encaixar a grade L0 pelo quadrante 25, que cobre a cidade de São Paulo. O resultado foi o acréscimo de 7*6 km = 43 km ao norte, garantindo (com folga de 1km) essa eliminação:

Um zoom na expansão ao norte mostra as porções dos quadrantes 92 e 93 que na nova grade foram incorporados aos quadrantes 82 e 83.

O conceito de "grade completa" e "cobertura Brasil", bem como a distorção espacial acarretada pela Projeção Cônica, podem ser melhor percebidos de longe, no contexto continental:

Graças à projeção os quadradinhos traçados na grade possuem todos a mesma área, e portanto seus dados (ex. população por célula) podem ser comparados. Isso amplia enormemente o leque de aplicações da grade e dos geocódigos baseados nela. Em coordenadas da projeção Albers, XY, a posição do ponto inferior esquerdo da grade proposta é (x0_min,y0_min)=(2734000,7320000).

A grade mais importante para os dados do IBGE, a de 1 km, continua a mema. Se olharmos com zoom para o extremo Sul, no interior do quadrante 04 da Nova Grade, usando a estratégia de descartar células que não cobrem o território nacional, encontraremos em verde a grade não-descartada dos dados originais do Censo de 2010:

Mais níveis e geocódigos hierárquicos

As células de uma Grade Geográfica Discreta (global ou de um país) podem ser identificadas de forma única por suas coordenadas matriciais ij, ou por um só número, dito identificador. Esse número, que pode ser expresso através de caracteres alfanuméricos, tal como uma placa de carro, é designado geocódigo.

Um importante objetivo da Nova Grade, listado acima como item 3, foi proporcionar um sistema de geocódigos hierárquicos e compactos sobre a grade. Além disso, conforme item 2, essa hierarquia deveria apresentar mais níveis. Para tanto adotamos o algoritmo Geohash Generalizado, e mais de uma opção de representação dos seus geocódigos (bases 16, 16h e 32), todos partindo da representação com 2 dígitos no nível L0 dos quadrantes.

O algoritmo Geohash está fundamentado na partição uniforme e recorrente de células quadriláteras em 4 sub-células, indexando as células através da Curva de Morton. Abaixo ilustrando com base 16h, que apresenta geocódigos consistentes também para os níveis intermediários, como o L1:

Seguindo com mais partições recorrentes, que resultam em quadados de lado 256 km, 128 km, 64 km, ... chegamos ao 1 km depois da 9ª partição. São portanto 9 níveis, ao invés dos 6 da grade original, e podemos seguir indefinidamente até por exemplo ~1 m, com a mesma regra.

Em termos de representação por geocódigo hierárquico as grades podem ainda ser representadas por um sistema distorcido, com células retangulares, para acomodar o dobro de níveis (9*2=18) entre 512 km e 1 km. Como diferentes aplicações exigem diferentes graus de compactação no Geocódigo, são oferecidas as seguintes opções de padronização, conforme tipo de aplicação:

Notação e suas aplicações Níveis hierárquicos
(bits no geocódigo)
Dígitos p. ~1km / Exemplos
Base 4
Didáticas e Computacionais
todos os níveis
(cada 2 bits)
9 dígitos (nível 9) em 1 km;
10 dígitos (nível 10) em 500 m.
/ Debug no banco de dados
Base 16h
Científicas gerais
todos níveis
(bit a bit),
inclusive níveis-meios
(ex. 2½)
4+1 dígitos (nível 9) em 1 km;
5 dígitos (nível 10) em 500 m;
5+1 dígitos (nível 11) em 250 m; ...
7+1 dígitos (nível 15) em 15,6 m; ...
8+1 dígitos (nível 17½) em ~3 m;
9 dígitos (nível 18) em 2,0 m.
/ Visualização de dados em geral.
Base 16 (hexadecimal)
Científicas padronizadas
níveis pares
(cada 4 bits)
5 dígitos (nível 10) em 500 m;
8 dígitos (nível 16) em 7,8 m;
9 dígitos (nível 18) em 2,0 m.
/ Nova Grade Estatítica do IBGE.
Base 32
Gerais
cada 2½ níveis
(cada 5 bits)
4 dígitos (nível 10) em 500 m;
6 dígitos (nível 15) em 15,6 m;
7 dígitos (nível 17½) em ~3 m.
/ Novo CEP, escolas e usos oficiais

  Nota: as representações são ilustradas didaticamente em Geohash Generalizado.

Geocódigos curtos ou mnemônicos

Uma das funções implementadas de encode/decode da proposta, é a que confere "encurtamento pelo contexto" ao gecódigo proposto.

Na ilustração as células com geocódigos 820821, 822, 823826 cobrem o polígono contextualizador chamado XXX, que pode ser imaginado como um nome popular e já conhecido por todos os habitantes das vizinhanças. Como o prefixo 82 é comum a todas as células da cobertura, os geocódigos podem ser reescritos conforme seu apelido, XXX‑0XXX‑1, XXX‑2, XXX‑3, e XXX‑6. Dessa forma os habitantes da região, que já sabem decor o que significa XXX, podem lembrar dos geocódigos mais facilmente do que o número aleatório 82. Idem para o polígono da localidade popular YYY.

Casos especiais:

  • Se duas localidades ocupam partes de uma mesma célula, elas compartilharão o uso do seu sufixo, e a resolução entre porções de uma ou outra se derá pelo polígono. Na ilustração a célula 826 é comportilhada, ou seja, coexistem as localizações XXX-6 e YYY-6 na mesma célula.

  • Se a célula não cabe na "caixa" do prefixo, mas cabe em uma caixa de mesmo tamanho, não tem problema, os identificadores não se repetem. Por convenção adota-se como prfixo de referência a "caixa" que contém o centróide do polígono.

Os prefixos mnemônicos XXX e YYY, quando padronizados por um país, são geocódigos nominais, pois de fato nomeam o polígono que representa a respectiva localidade. A estratégia de encurtamento através deles cria um geocódigo misto, onde o prefixo é nominal e o sufixo é um identificador de célula de grade (por exemplo XXX-3 tem prefixo XXX e sufixo 3). No software de resolução dos geocódigos os prefixos nominais são também designados "prefixos seletores de grade", pois invocam não só um contexto mas um polígono específico com a sua grade específica.

No Projeto OSM Codes, que segue a proposta de expansão da norma RFC 5870, os prefixos nominais são também hierárquicos e não são nomes arbitrários, partem da norma ISO 3166‑2. Por exemplo o nome do polígono que define o município de SP/Piracicaba é a hierarquia de siglas BR‑SP‑PIR.

Máxima resolução e tratamento vetorial

O armazenamento de grades em bancos de dados requer limites e estratégias para armazenar diferentes tipos de informação. População estimada na célula e perinência ao país ou ao município são informações típicas.

Matematicamente o geocódigo hierarquico não tem limite de resolução, mas recomenda-se estabelecer um limite razoável dentro do qual perderia precisão e utilidade prática. Como a principal aplicação do geocódigo seria a localização de endeços, emerge dela a noção de "resolução razoável". Foram sugeridas resoluções da ordem de 15 metros para endereços do meio rural, e da ordem de 3 ou 5 metros para meio urbano.

A discriminação entre portas vizinhas com resolução da ordem de 3 metros se confirma em diferentes espaços urbanos e diferentes partes do mundo. Tem sido de fato adotada como referência para a maioria dos geocódigos que se propõe a localizar endereços.

Já a verificação vetorial de pertinência no território nacional (polígono do Brasil), pode ser realizada em células da ordem de 5 km — por questões de otimização do algoritmo de exclusão de fronteira, e pelo fato de células da escala inferior ao km serem sumarizadoras, mantendo nelas apenas as informações de uso geral. Por exemplo células 100KM da fronteira contém muito menos de 2500 células de 1KM. O algoritmo de pertinência só precisa ser disparado em células de fronteira, portanto um indicador boolean de "solicitar resolução de fronteira" (ou array de bits com outros tais como bacias ou municípios) é suficiente.

REFERÊNCIAS

Outros subsídios para o tema:


INSTALAÇÃO

Use make para ver instruções e rodar targets desejados. O software foi testado com as seguintes versões e configurações:

  • PostgreSQL v12 ou v13, e PostGIS v3. Disponível em localhost como service. Rodar make com outra pg_uri se o usuário não for postgres
  • psql v13. Configurado no makefile para rodar já autenticado pelo usuário do terminal .
  • pastas default: rodar o make a partir da própria pasta git, /src/BR_new. Geração de arquivos pelo servidor local PostgreSQL em /tmp/pg_io.

Para testes pode-se usar git clone https://github.com/AddressForAll/grid-tests.git ou uma versão específica zipada, por exemplo wget -c https://github.com/AddressForAll/grid-tests/archive/refs/tags/v0.1.0.zip. Em seguida, estes seriam os procedimentos básicos para rodar o make em terminal bash:

cd grid-tests/src/BR_new
make

O make sem target vai apnas listar as opções. Para rodar um target específico usar make nomeTarget. Para rodar com outra base ou outra URI de conexão com PostreSQL server, usar por exemplo
make db=outraBase pg_uri=outraConexao nomeTarget.

DADOS

Os dados da Nova Grade, quando forem publicados, serão mantidos em /data/BR_new. Eles podem ser utilizados para conferir se a sua instalação está consistente, ou ainda para outros usos independentemente de ter instalado ou não o software.

FUNÇÔES

A biblioteca SQL Lib_BR contém a implementação da proposta. Ela depende de outras bibliotecas, notadamente a genérica de grade s e geocódigos OsmCodes, e a de uso geral do AddressForAll. O código-fonte das dependências foi trazido para garantir instalação standalone. Deve-se instalar na sequência, conforme steps: step1-libPub.sql, step2-lib_OsmCodes.sql, step3-lib_BR.sql e step4-BR_tests.sql. O último script contém alguns testes e exemplos de uso.

Funções especializadas do schema osmcodes_br:

  • xy_to_ggeohash(x,y,precisao,base_bitsize) - Geocódigo de um ponto. Entradas: as coordenadas XY Albers do ponto, o número de dígitos desejados e a notação desada.

  • ggeohash_to_xybounds() - Transforma geocódigo em descritor da diagonal do retângulo da célula.

  • ggeohash_to_xy() - Transforma geocódigo em ponto central da célula. Supondo "snap do grid" seria a função inversa de xy_to_ggeohash().

  • ij_to_xy(quadrante_ij) - Coordenadas Albers do canto inferior esquerdo (minX,minY) do quadrante, conforme seu identificador ij (j0,i0) fornecido.

  • quadrant_to_xybounds(quadrante_ij) - Extremidades da diagonal do quadrante_ij, expressas em Albers (mínXY e maxXY).

  • cellgeom_from_ij(quadrante_ij) - Geometria do quadrante ij expressa em projeção Albers. Quadrantes são as células do nível zero.

  • cellgeom_xy(x, y, r) - Geometria da célula com centro em (x,y) e raio inscrito r. Entrada e saída expressas em projeção Albers.

  • cellgeom_xy_bycorner(cx, cy, s) - Geometria da célula com canto inferior esqerdo em (cx,cy) e lado s (side size). Entrada e saída expressas em projeção Albers.