Skip to content

Problemas

Peter edited this page Jun 22, 2021 · 7 revisions

Compactação

A maioria dos usuários "de recreio" evita baixar a Grade IBGE original pois ela aparenta ser muito pesada, tanto para a visualização de dados como para a transferência e armazenamento. Resolver esse problema também faz parte da proposta deste git.

A grade IBGE original ocupa muito espaço no banco de dados e na sua distribuição. Depois de eliminadas todas as redundâncias no banco de dados, a informação mínima resultou num conjunto bem mais compacto:

  • 194M grade_ibge1km_pop2010.csv (~22 bytes/linha)
    Comparando com os ~5645M de shapefiles abertos temos 3.5% em CSV.
  • 24M grade_ibge1km_pop2010.zip (comparando com os ~850M dos zips originais são 24/850 = 2,8%)

Ou seja, tanto zipado como aberto o consumo cai para ~3% do original. A criação do arquivo foi realizada pelo comando SQL:

copy (select gx,gy, pop, pop_fem_perc, is_urban::int as is_urban from  grade_ibge_1kmcenters)
to '/tmp/grade_ibge1km_pop2010.csv' CSV HEADER;
-- COPY 8860553

Encaixe dos centroides

Durante o desenvolvimento do script step4 tentamos mais de uma alternativa para a construção da geometria, para conferir o comportamento da progeção. A função ótima gera cada uma das coordenadas e garante o "encaixe perfeito".

CREATE FUNCTION ibge_grid_cell( cx int, cy int, d int DEFAULT 500) RETURNS geometry AS $f$
    SELECT ST_GeomFromText( format(
     'POLYGON((%s %s,%s %s,%s %s,%s %s,%s %s))',
          cx-d,cy-d, cx-d,cy+d, cx+d,cy+d, cx+d,cy-d, cx-d,cy-d
     ), 952019) AS geom
$f$ LANGUAGE SQL IMMUTABLE;

A função PostGIS nativa ST_Envelope supostamente geraria o mesmo resultado com base nos mesmos parâmetros,

CREATE FUNCTION ibge_grid_envelope( cx int, cy int, d int DEFAULT 500) RETURNS geometry AS $f$
  SELECT ST_Envelope( ST_Transform(  ST_Buffer(ST_SetSRID(ST_MakePoint(cx,cy),952019),d),  4326 ) )
$f$ LANGUAGE SQL IMMUTABLE;

Mas algumas distorções ocorreram. ERRO: o envelope precisa ser produzido na projeção correta!

CREATE FUNCTION ibge_grid_envelope( cx int, cy int, d int DEFAULT 500) RETURNS geometry AS $f$
  SELECT  ST_Transform(  ST_Envelope( ST_Buffer(ST_SetSRID(ST_MakePoint(cx,cy),952019),d) ),  4326 ) )
$f$ LANGUAGE SQL IMMUTABLE;

PENDENTE: testar novamente com a função correta.

Clone this wiki locally