Skip to content
Peter edited this page Sep 10, 2018 · 8 revisions

TESTE SIMPLES

VER https://wiki.openstreetmap.org/wiki/WikiProject_Brazil/Utiliza%C3%A7%C3%B5es_Governamentais/De_precis%C3%A3o

Teste de carga de cidades LIXO

((peraí que faremos algo mais simples, não precisava fazer carga dos 5570 municípios nem sequer precisa ser um polígono complexo, basta uma reta, circulo ou retângulo))

Usando poligonos brasileiros... Antes de testar com lotes, testando as próprias cidades, pois o erro em áreas e perímetros seria logo destacado. Usando arquivos GeoJSON de simplificação média, já coletados do OSM, disponíveis em
http://datasets.ok.org.br/city-codes (exemplo de Sampa)

  1. Git clone no servidor.. Por exemplo em /opt: cd /opt/gits; git clone https://github.com/datasets-br/city-codes.git

  2. Conferir se psql adequado e entrar: psql --version= 10, por exemplo, psql postgres://postgres:postgre@localhost:5432/osm_tests

  3. CREATE EXTENSION postgis; SELECT PostGIS_version(); = 2.2 ou maior

  4. script de instalação abaixo.

CREATE TABLE cidade(id serial, nome text, geom geometry);
 
CREATE EXTENSION IF NOT EXISTS plpythonu;
CREATE FUNCTION readfile(p_file text, p_content text) RETURNS text AS $$
  o=open(args[0],"r")
  o.write(args[1])
  o.close()
  return "ok"
$$ LANGUAGE PLpythonU;

INSERT INTO cidade(id,nome,geom) VALUES (1,'SP/SaoPaulo',ST_AsText(ST_GeomFromGeoJSON( 
   readfile('/opt/gits/city-codes/data/dump_osm/SP/SaoPaulo.geojson')
)));
INSERT INTO cidade(id,nome,geom) VALUES (2,'RS/PortoAlegre',ST_AsText(ST_GeomFromGeoJSON( 
   readfile('/opt/gits/city-codes/data/dump_osm/RS/PortoAlegre.geojson')
)));

-- Auditoria do dado pela área conhecida:
SELECT id, nome, round(st_area(geom,true)::numeric/(1000.0^2),1) area FROM cidade;

-- Teste que do vai-e-vem na conversão:
with cmp as (
  SELECT id, nome, geom geom_wgs84, ST_Transform(ST_SetSRID(geom,4674),4326) geom_sirgas
  FROM cidade
) 
  SELECT nome, st_area(geom_wgs84,true) area, st_perimeter(geom_wgs84,true) perimeter
         ,st_area(geom_wgs84,true) - st_area(geom_sirgas,true) area_diff
         ,st_perimeter(geom_wgs84,true) - st_perimeter(geom_sirgas,true) perimeter_diff
  FROM cmp;

Resultados:

id nome st_area
1 SP/SaoPaulo 1523.7
2 RS/PortoAlegre 492.5

SaoPaulo deveria dar área de ~1521 km², POA ~496 km² ... tá dentro pois JSON foi simplificado.

Comparando a conversão forçada para SIRGAS (supondo WSG84=SIRGAS) depois de volta para WSG84:

nome area perimeter area_diff perimeter_diff
SP/SaoPaulo 1523671995.99569 327921.926630942 -0.000148534774780273 2.82307155430317e-08
RS/PortoAlegre 492507031.435683 182572.495870427 -0.000117897987365723 -7.62520357966423e-09

Diferenças desprezíveis, com cara de erro de ponto flutuante.

PS: se trocarmos o SRID do st_transform pelo do SAD60 (4618) vamos confirmar que o teste funciona, e destaca com clareza quando existem diferenças.

Clone this wiki locally