-
Notifications
You must be signed in to change notification settings - Fork 2
Testes
((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)
-
Git clone no servidor.. Por exemplo em /opt:
cd /opt/gits; git clone https://github.com/datasets-br/city-codes.git
-
Conferir se psql adequado e entrar:
psql --version
= 10, por exemplo,psql postgres://postgres:postgre@localhost:5432/osm_tests
-
CREATE EXTENSION postgis; SELECT PostGIS_version();
= 2.2 ou maior -
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.