Brazil/Grade Estatística Oficial
- Dica 1: filminho introdutório sobre a grade IBGE, mais rapido e leve do que ler o PDF,
- Dica 2: no navegador não funciona baixar direto o PDF, navegue primeiro por http://geoftp.ibge.gov.br/recortes_para_fins_estatisticos/grade_estatistica/censo_2010 depois clique em "grade_estatistica.pdf".
Apesar de sua relevância, o Brasil só foi estabelecer a sua Grade Estatística em 2015, quando o IBGE lançou a sua proposta de grade com os dados do censo de 2010. A proposta foi bem aceita e hoje pode-se considerar como a "grade oficial", ou seja, a grade a ser utilizada em diversas outras aplicações, que não apenas a disseminação de dados do Censo. A grade com dados de população pode ser baixada do ftp do Censo 2010 do IBGE.
Carga no PostGIS
Por exemplo baixando o "quadrante 25". Supondo terminal Linux Debian (facilmente adaptavel para terminais DOS-Windos, MacOS, e outros Linux).
Todos os arquivos podem ser baixados via protocolo FTP ou HTPP. No caso de FTP entrar na pasta
geoftp.ibge.gov.br/recortes_para_fins_estatisticos/grade_estatistica/censo_2010
no caso de HTTP pode-se por exemplo usar o comando wget,
Em seguida qualquer aplicativo para expandir "arquivo ZIP padrão" ("MIME application/zip" e desde 2015 padrão ISO 21320-1). No Linux é default da distribuição (antigo Info-ZIP), basta rodar:
unzip grade_id25.zip
Por fim o aplicativo que transforma arquivos Shape em SQL do PostGIS é o `shp2pgsql`, que pode rodar gravando um arquivo, ou direto "em pipe" com o psql:
shp2pgsql -s 4326 grade_id25.shp | psql postgres://postgres:_senha_@localhost/ibge_sandbox -q
Na instrução acima a opção "-s" indica SRID 4326, que é o código do Datum WGS 84. O comando `psql` tem diversas maneiras de ser chamado, use a que julgar mais apropriada (a opção "-q" solicita apenas "modo quieto" para evitar rolagem de tela).
Testes rápidos
Os dados IBGE são fornecidos com o campo shape_area calculado no SIG do IBGE, que serve de referência para conferir se o seu sistema foi instalado corretamente e oferece a mesma precisão.
SELECT SUM(shape_area) by_shp, SUM(st_area(geom)) by_geom,
SUM( abs(shape_area - st_area(geom)) ) as diff
FROM grade_id25 where pop>0; -- total by ~6.84403272259541 | diff ~2e-12
O valor total serve como checksum. A diferença acumulada pode ser considerada zero, tendo em vista que surge depois da décima segunda casa decimal, e que os dados do arquivo shape são eventualmente truncados pelas limitações de tamanho do arquivo.
Para teste de visualização pode-se fazer uso da união de células menores formando uma única quadícula na região do estado de SP, por exemplo a célula quadrada de 10km denominada 10KME5480N8500
:
SELECT ST_UNION(geom) as celula10km
FROM grade_id25 where nome_10km='10KME5480N8500';
Nota: para gravar arquivo GeoJSON basta usar psql -c
e ST_AsGeoJSON(ST_UNION(geom))
.
Interpretação
O FTP do IBGE infelizmente não foneceu README com a semântica dos dados, mas a interpretação é simples e será homologada junto ao IBGE.
Cada arquivo zip corresponde a um dos quadrantes indicados na imagem, e o nome de tabela será o nome do arquivo. O final do nome é o identificado da célula (ex. grade_id25
é o quadrante id25).
Coluna | Tipo | Collation | Nullable | Default/Descrição |
---|---|---|---|---|
gid
|
integer | not null | nextval('grade_id25_gid_seq'::regclass) | |
id_unico
|
character varying(50) | mesmo que nome_1km em área rural, senão prefixo "200M" indica célula menor.
| ||
nome_1km
|
character varying(16) | Rótulo da célula de 1km de lado | ||
nome_5km
|
character varying(16) | Rótulo da célula de 5km de lado | ||
nome_10km
|
character varying(16) | Rótulo da célula de 10km de lado | ||
nome_50km
|
character varying(16) | |||
nome_100km
|
character varying(16) | |||
nome_500km
|
character varying(16) | |||
quadrante
|
character varying(50) | |||
masc
|
integer | população masculina | ||
fem
|
integer | população feminina | ||
pop
|
integer | população total | ||
dom_ocu
|
integer | |||
shape_leng
|
numeric | perimetro nominal | ||
shape_area
|
numeric | área nominal | ||
geom
|
geometry(MultiPolygon,4326) | Geometria da célula, trazida da projeção Albers |
Precisão na área
As medições de área apresentam o seguinte comportamento no quadrante id25, com relação a média e desvio padrão:
SELECT tipo, AVG(a) area_med, stddev_pop(a) area_desvpad, count(*) as n
FROM (
SELECT st_area(geom,true) a, substring(id_unico,1,4) tipo
FROM grade_id25
) t
GROUP BY tipo;
tipo | area_med | area_desvpad | n |
---|---|---|---|
1KME | 1000000.00138881 | 0.116134666311307 | 176347 |
200M | 40000.0000025662 | 0.00717275168996917 | 665800 |
Quadrantes em outras latitudes podem apresentar comportamento ligeiramente diferente. A dependência com a latitude pode ser detectada com a seguinte consulta:
CREATE VIEW grade_id25_1kmfull AS
SELECT nome_1km FROM grade_id25
GROUP BY nome_1km HAVING count(*)=25
;
CREATE VIEW grade_id25_10kmfull AS
SELECT nome_10km
FROM (
SELECT * FROM grade_id25
WHERE nome_1km IN (SELECT nome_1km FROM grade_id25_1kmfull)
) t
GROUP BY nome_10km HAVING count(*)=2500
;
SELECT nome_10km,
round( SUM(st_area(geom,true))*1000 )/1000 AS area_tot,
ST_Y( ST_CENTROID( ST_UNION(geom) ) ) AS lat,
COUNT(*)
FROM grade_id25
WHERE nome_10km IN (SELECT nome_10km FROM grade_id25_10kmfull)
GROUP BY nome_10km
ORDER BY 2 desc;
Resulta em uma tabela de 30 linhas, aqui resumida. Há uma certa flutuação mas nítida dependência da área com a latitude.
nome_10km | area_tot | lat |
---|---|---|
10KME5720N8690 | 100000000.154 | -23.6086869947273 |
10KME5730N8690 | 100000000.100 | -23.6063784312733 |
10KME5770N8710 | 100000000.088 | -23.4153701623054 |
10KME5780N8750 | 100000000.076 | -23.0503452407344 |
10KME5760N8690 | 100000000.060 | -23.5992632459115 |
10KME5720N8710 | 100000000.059 | -23.4272128378060 |
... | ... | ... |
10KME5730N8700 | 99999999.940 | -23.5156281498224 |
10KME5650N8790 | 99999999.932 | -22.7176379630557 |
10KME5780N8740 | 99999999.926 | -23.1409428928998 |
10KME5790N8750 | 99999999.923 | -23.0478571749575 |
10KME5760N8680 | 99999999.887 | -23.6900384997493 |
10KME5740N8690 | 99999999.867 | -23.6040382842096 |
10KME5720N8700 | 99999999.865 | -23.5179351551436 |
10KME5710N8770 | 99999999.843 | -22.8857479585162 |