-
Notifications
You must be signed in to change notification settings - Fork 0
Trazendo dados pertinentes do OSM e dumps
Peter edited this page Sep 6, 2021
·
1 revision
Apenas os municípios em uso requerem dados do OSM. O próprio OSM requer uma versão mais atualizada para se obter seus dados.
Ver também https://github.com/AddressForAll/geoterm/wiki e Cruzando dados novos com os do OSM e correios.
Levando a optim.jurisdiction para a base dl01t_osm e conferindo municípios disponíveis.
#psql dl03t_main -- building
#psql dl01t_osm -- dump OSM Planet
pg_dump --format plain --verbose --file "/tmp/pg_io/transport01.sql" --table optim.jurisdiction \
--table optim.donor --table optim.auth_user --table optim.donatedPack \
dl03t_main
psql dl01t_osm < "/tmp/pg_io/transport01.sql"select count(*)
from planet_osm_polygon p inner join optim.jurisdiction j
ON -p.osm_id=j.osm_id and p.tags->'IBGE:GEOCODIGO' ~ '^\d+$'
and (p.tags->'IBGE:GEOCODIGO')::bigint=jurisd_local_id
;
CREATE TABLE osm_city AS
select j.*, hstore_to_jsonb_loose(p.tags) || jsonb_build_object('z_order',p.z_order) as jtags, p.way as geom
from planet_osm_polygon p inner join optim.jurisdiction j
ON -p.osm_id=j.osm_id and p.tags->'IBGE:GEOCODIGO' ~ '^\d+$'
and (p.tags->'IBGE:GEOCODIGO')::bigint=jurisd_local_id
;
select (jtags->'admin_level')::int as admin_level, count(*) n from osm_city group by 1;
-- 4 | 27 -- estados?
-- 8 | 5467 -- municipios
-- 7 | 1 -- brasilia?Agora que temos as geometrias dos municipios, trazer todos municípios de optim.origin (a resgatar da base em uso) e interseções com respectivas BBOX.
-- na outra base, select array_agg(distinct jurisd_osm_id) from optim.origin; -- resulta em array abaixo
CREATE VIEW vw01_osm_city AS
SELECT * FROM osm_city
WHERE osm_id IN ( -- positivo
select unnest('{242324,242397,242595,296625,296650,297533,297564,297599,297611,297687,297897,297919,297968,297991,297995,298019,298216,298227,298253,298285,298413,298424,298426,298442,298470,303585,314856,326253,334022,368782,368786,1825815,1825817,1826737,2220782,2220789}'::bigint[]) as osm_id);-- DROP TABLE osm_road_lixo; DROP TABLE osm_point; DROP TABLE osm_poly; DROP TABLE osm_road; DROP TABLE osm_road_quadra;
CREATE TABLE osm_road_lixo AS
select DISTINCT p.osm_id, c.osm_id as jurisdiction_osm_id,
(hstore_to_jsonb_loose(p.tags) -'osm_user' -'osm_version' -'osm_changeset') || jsonb_build_object('z_order',p.z_order) as jtags,
p.way as geom
from planet_osm_roads p inner join vw01_osm_city c
ON p.way && c.geom and st_intersects(p.way,c.geom)
; -- trazendo poucos casos, baixa confiabilidade.
CREATE TABLE osm_point AS
select DISTINCT p.osm_id, c.osm_id as jurisdiction_osm_id,
(hstore_to_jsonb_loose(p.tags) -'osm_user' -'osm_version' -'osm_changeset') || jsonb_build_object('z_order',p.z_order) as jtags,
p.way as geom
from planet_osm_point p inner join vw01_osm_city c
ON p.way && c.geom and st_intersects(p.way,c.geom)
;
CREATE TABLE osm_poly AS
select DISTINCT p.osm_id, c.osm_id as jurisdiction_osm_id,
(hstore_to_jsonb_loose(p.tags) -'osm_user' -'osm_version' -'osm_changeset') || jsonb_build_object('z_order',p.z_order) as jtags,
p.way as geom
from planet_osm_polygon p inner join vw01_osm_city c
ON st_area(p.way,true)<300000000 AND (p.way && c.geom) AND st_contains(c.geom,p.way)
-- mais usado = p.tags?'building'
;
CREATE TABLE osm_road AS
select DISTINCT p.osm_id, c.osm_id as jurisdiction_osm_id,
hstore_to_jsonb_loose(p.tags) || jsonb_build_object('z_order',p.z_order) as jtags,
p.way as geom
from planet_osm_line p inner join vw01_osm_city c
ON p.way && c.geom and st_intersects(p.way,c.geom)
WHERE p.tags?'highway' AND not(p.tags?'boundary')
AND p.tags->'highway' !~ '^(footway|path|cycleway|raceway|track|bridleway|footway)$'
-- "highway=pedestrian" é calçadão, que vale como via
;
CREATE TABLE osm_road_quadra AS
select DISTINCT p.osm_id, c.osm_id as jurisdiction_osm_id,
hstore_to_jsonb_loose(p.tags) || jsonb_build_object('z_order',p.z_order) as jtags,
p.way as geom
from planet_osm_line p inner join vw01_osm_city c
ON p.way && c.geom and st_intersects(p.way,c.geom)
WHERE NOT(p.tags?'boundary' OR p.tags?'highway') AND (p.tags?'waterway' OR p.tags?'railway')
;Distinct é redundante, haverão duplicações por conta dos elementos comuns de fronteira.
#rm "/tmp/pg_io/transport02.sql"
pg_dump --format plain --verbose --file "/tmp/pg_io/transport02.sql" \
-t osm_city -t osm_road_lixo -t osm_point -t osm_poly -t osm_road -t osm_road_quadra \
dl01t_osm
psql dl03t_main < "/tmp/pg_io/transport02.sql"Para indexar na base dl03t_main:
CREATE INDEX on osm_road_lixo USING GIN(jtags);
CREATE INDEX on osm_point USING GIN(jtags);
CREATE INDEX on osm_poly USING GIN(jtags);
CREATE INDEX on osm_road USING GIN(jtags);
CREATE INDEX on osm_road_quadra USING GIN(jtags);
CREATE INDEX ON osm_city USING GIST (geom);
CREATE INDEX ON osm_road USING GIST (geom);
CREATE INDEX ON osm_poly USING GIST (geom);(wiki temporária!)