-
Notifications
You must be signed in to change notification settings - Fork 5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Agrupamento de segmentos de road #28
Comments
Para a criação de um banco de endereços, é bom que se faça a filtragem das vias por nome, e não por ref. Eu não me apoiaria em refs a não ser para "tampar buraco" nos casos de rodovias sem nome. Digo o porquê: A tag E ainda há as rotas estaduais e municipais. Em São Paulo (estado), a SP-300 é composta pela Rodovia Dom Gabriel Paulino Bueno Couto, Rodovia Marechal Rondon e por uma série de ruas e avenidas nos trechos urbanos: https://www.openstreetmap.org/relation/9245672#map=14/-23.2539/-47.2919 (zoom na cidade de Itu onde a SP-300 muda várias vezes de nome) Em Piracicaba (município), a PIR-260 é composta por cerca de 3 estradas e uma rua urbana: https://overpass-turbo.eu/s/RrC Casos com ref=XX-001;XX-002Há casos em que duas ou mais rotas rodoviárias de mesmo nível compartilham a mesma rodovia. É o caso das SP-191 e SP-304: https://www.openstreetmap.org/#map=13/-22.5706/-48.0169 (ref=SP-304;SP-191). A SP-191 vem pelo leste e a SP-304 vem pelo Sudeste; e juntam em São Pedro; seguem para o oeste; e se separam em Santa Maria da Serra; a SP-191 segue para sudoeste e a SP-304 para noroeste. Também pode ocorrer de ref nacionais se sobreporem ref estaduais. Exemplo BR-262: https://www.openstreetmap.org/#map=12/-20.7953/-51.6474 Casos com barra no refVendo alguns lugares, a barra pode ser uso incorreto ou pode indicar ramal rodoviário. Exemplo errado: Uma rodovia com ref=BR-070/163/364 (https://www.openstreetmap.org/way/33745763) é certeza que o ref foi digitado errado. O certo seria ref=BR-070;BR-163;BR-364 (como aqui: https://www.openstreetmap.org/way/180523426, também acho estranho colocar isso numa rotatória). Exemplo certo: Uma rodovia com ref=SPA-253/300 significa rodovia de Acesso do km 253 da SP-300, como pode ser visto aqui http://www.der.sp.gov.br/WebSite/Arquivos/MalhaRodoviaria/codificacao.pdf, nas páginas 12 e 13. Neste caso aqui https://www.openstreetmap.org/way/102050575, é certo que quem colocou o ref esqueceu de colocar SPA ao invés de SP. Compare com imagem do DataGEO-SP Código de prefixo estadual de duas e três letrasCostuma-se usar a sigla do estado de duas letras (DF, SP, MG, RS, AM etc) como prefixo para indicar que a rota rodoviária é estadual e do tipo "eixo", uma forma técnica de dizer "troncal". Já nas demais rotas rodoviárias "ramais", ou seja, as rodovias de acesso, trevos, (inter)ligações, marginais etc, se usa uma sigla de três letras.
Verifica-se que o formato de ref para rodovias "ramais" varia conforme o estado. Também não confundir o código de três letras dos estados com o código municipal que é também de três letras. Exemplos: PIR = Piracicaba/SP; URA= Uberaba/MG; CDR = Caçador/SC etc. |
Obrigado @IgorEliezer, fica então pendente tarefa minha de tentar agrupar vias federais e estaduais da melhor forma possível, e então publicar apenas um ou dois trechos em GeoJSON simplificado para avaliarmos. Se for consistente, fazemos para todo o resto. Se não, deixamos para versões futuras, depois de avaliar melhoras no Stable de 2020 (bom lembrar que ainda estamos analisando 2018) e interagir com a comunidade no sentido de pedir que corrijam e conferir se todos tem o mesmo entendimento. |
Antes de sair sujando o nosso repositório git com dados de teste, alguns resultados mais para discutir ou homologar decisões. Estatisticas da BR-116Na tabela abaixo (e depois sumarizo no git a estatística) percebemos que a hipótese que colocou não se confirma: a grande maioria tem ref, inclusive ref sem name. Para testar o inverso farei uma gambiarra que explico no final, e que comprova que "name sem ref" é muito raro nas rodovias mais conhecidas, tais como a BR-116... Lemrbando que estas estatísticas só serão feitas para escala federal e estadual. Abaixo uma amostra de dados que descreve o que se passa com a BR-116, conforme a consulta SELECT uf, tags->>'name' AS name, tags->>'ref' AS ref,
count(*) n, min(osm_id) osm_id_amostra
FROM stable.vw01_osm_roads_city_inside -- sem UF basta planet_osm_roads
WHERE tags->>'ref' ~ '^BR\-116($|;)' group by 1,2,3 order by 1,2,3;
A tabela acima mostra todos os nomes consistentes com ref="BR-116", a menos de alguns que filtrariamos como "Freeway". Segmentos de "Anel Rodoviário" criam geometria diferente da linha unica, mas por hora deixamos assim pois não afeta o GeoJSON. Mesmo a estranha "Rua Uruguai" está correta, é o rabicho da BR-116 que interliga a rota do Brasil com a rota do Uruguai. Apesar de complexo é factivel puxar uma lista de nomes. A cado estado (UF), todos aqueles que iniciam por "Rodovia", são os mais frequentes. -- create table t as
SELECT DISTINCT uf || '/'|| (tags->>'name') AS name_br116
FROM stable.vw01_osm_roads_city_inside
WHERE tags->>'ref' ~ '^BR\-116($|;)' AND tags->>'name' iLIKE 'Rodovia%' order by 1; BA/Rodovia Régis Bittencourt; BA/Rodovia Santos Dumont; BA/Rodovia Santos Dumont / BR-116; BA/Rodovia Santos-Dumont Por fim, resultado estatístico de segmentos "só com ref" e "só com name": SELECT COUNT(*) n_com_name_sem_ref
FROM stable.vw01_osm_roads_city_inside
WHERE NOT(tags?'ref')
AND uf || '/'|| (tags->>'name') IN (select name_br116 FROM t)
; -- resultaram apenas 17
SELECT COUNT(*) n_com_ref
FROM stable.vw01_osm_roads_city_inside
WHERE tags->>'ref' ~ '^BR\-116($|;)'
; -- total 2733
SELECT COUNT(*) ngeral_com_ref
FROM planet_osm_roads
WHERE tags->>'ref' ~ '^BR\-116($|;)'
;-- total 3018 Apenas 17 segmentos nesta condição ( Conclusão: para gerar uma geometria simplificada (resumo visual) das rodovias federais, se seguirem o comportamento da BR-116, poderemos desprezar os segmentos sem ref. PS: o objetivo dos dados do OSM-Stable não é a perfeição, é apenas filtrar o que desejamos controlar como "supostamente bom e estável", e dar um histórico rastreável das melhoras conquistadas a cada nova versão. |
Estatisticas da SP-191 e SP-304Abaixo uma amostra de dados que descreve o que se passa com ambos, SP-191 e SP-304, conforme a consulta SELECT tags->>'name' AS name, tags->>'ref' AS ref,
count(*) n, min(osm_id) osm_id_amostra
FROM planet_osm_roads
WHERE tags->>'ref' ~ '^SP\-(191|304)($|;)' group by 1,2 order by 1,2;
O total na coluna n é 447. Novamente juntando só nomes de "Rodovia": -- create table t as
SELECT DISTINCT tags->>'name' AS name
FROM planet_osm_roads
WHERE tags->>'ref' ~ '^SP\-(191|304)($|;)' AND tags->>'name' iLIKE 'Rodovia%'
ORDER BY 1; Rodovia Cassio Primiano; Rodovia Deputado Amauri Barroso de Souza; Rodovia Deputado Leônidas Pacheco Ferreira; Rodovia Doutor Antônio Piva; Rodovia Dr. Antônio Piva; Rodovia Geraldo de Barros; Rodovia Jornalista José Willibaldo de Freitas; Rodovia Luiz de Queiroz; Rodovia Luís de Queiroz; Rodovia Luíz de Queiroz; Rodovia Wilson Finardi. Por fim, resultado estatístico de segmentos "só com ref" e "só com name": SELECT COUNT(*) n_com_name_sem_ref
FROM stable.vw01_osm_roads_city_inside
WHERE uf='SP' AND NOT(tags?'ref')
AND (tags->>'name') IN (select name FROM t)
; -- resultou em apenas 1 caso! num total de 447, são 0.2% Conclusão: na escala estadual também podemos ignorar segmentos sem ref. Outra conclusão é que não precisamos nos preocupar com as sobreposições, pois parecem já existir segmentos duplicados onde necessário (ver na tabela o nome "Rodovia Geraldo de Barros")... Ou duplicamos por algorirmo (função geradora do GeoJSON simplificado) quando vierem listados por PS: claro que com toda essa análise vale fazer sugestões para a comunidade corrigir, por isso, principalmente na publicação de "versão testing" os relatórios (arquivos e pastas prefixo |
Descrição técnica do experimento final, para postar no branch testing do git. Resultados já na forma definitiva de GeoJSON sugerido. --- nova stored procedure:
CREATE or replace FUNCTION stable.rota_tags2lexname(p_tags jsonb) RETURNS text AS $f$
SELECT x FROM (
SELECT stable.name2lex(coalesce(p_tags->>'official_name',p_tags->>'name'),true,true,true)
) t(x) WHERE substring(x,1,7) IN ('rodovia','estrada')
$f$ LANGUAGE SQL IMMUTABLE;
COMMENT ON FUNCTION stable.rota_tags2lexname
IS 'Normaliza nome de rodovia conforme sintaxe URN LEX.';
--- novas views:
CREATE VIEW stable.vw01item_roads_rota_federal AS
SELECT ref, count(*) n,
array_agg(DISTINCT osm_id) AS members_osm_id,
array_agg(DISTINCT lexname) AS members_lexname
FROM (
SELECT osm_id,
trim(regexp_split_to_table(tags->>'ref', ';')) AS ref,
stable.rota_tags2lexname(tags) AS lexname
FROM planet_osm_roads
WHERE tags->>'ref' ~ 'BR\-\d\d\d'
) t
WHERE ref ~ '^BR\-\d\d\d$'
GROUP BY 1 ORDER BY 1
;
COMMENT ON VIEW stable.vw01item_roads_rota_federal
IS 'Isola rodovias de federais de planet_osm_roads com rótulo oficial de rota BR.'
;
CREATE MATERIALIZED VIEW stable.mvw01lexname_rota_federal AS
SELECT * FROM (
SELECT DISTINCT
ref AS rota_ref,
unnest(members_lexname) as lexname
FROM stable.vw01item_roads_rota_federal
where members_lexname is not null
) t
where lexname is not null
;
CREATE VIEW stable.vw01lexnames_rota_federal AS
select rota_ref, array_agg(DISTINCT lexname) as members_lexname
from stable.mvw01lexname_rota_federal
group by 1 order by 1
;
CREATE MATERIALIZED VIEW stable.mvw02geom_roads_rota_federal AS
SELECT
f.ref AS rota_ref,
ST_SimplifyPreserveTopology(
ST_Union( r.way ),
0.0000005
) AS geom,
count(*) members_n,
round( SUM(ST_Length(r.way,true))/1000 ) comprimento_km,
array_agg(r.osm_id) members_osm_id,
min(r.osm_id) members_id_min,
max(r.osm_id) members_id_max,
(SELECT members_lexname FROM stable.vw01lexnames_rota_federal s where s.rota_ref=f.ref) as members_lexname
FROM planet_osm_roads r INNER JOIN (
SELECT ref, unnest(members_osm_id) osm_id
FROM stable.vw01item_roads_rota_federal
) f
ON f.osm_id=r.osm_id
GROUP BY 1
ORDER BY 1
; -- 156 rotas
COMMENT ON MATERIALIZED VIEW stable.mvw02geom_roads_rota_federal
IS 'Isola rodovias de federais de planet_osm_roads com rótulo oficial de rota BR.'
;
/*
-- depois de git clone --single-branch --branch "test2018-10-02A" stable.git
SELECT file_put_contents(
'/tmp/pg_io/_rotas/'||rota_ref||'.geojson',
jsonb_pretty(
ST_AsGeoJSON(geom,6)::JSONb
|| jsonb_build_object('properties', jsonb_build_object(
'name',rota_ref, 'comprimento_km',comprimento_km,
'members_osm_id',members_osm_id ', 'members_lexnames',members_lexnames
))
) -- falta properties
) as put
FROM stable.vw03geom_roads_rota_federal
;
*/ |
Pendências para encerrar análise e padronização das rotas federais:
|
Já estou dando uma olhada nas rotas rodoviárias. E adianto algo: A BR-116 está faltando o trecho do estado de São Paulo onde há dois refs (e.g. BR-116;SP-260). Os trechos onde há só BR-116 foram importados. |
@IgorEliezer obrigado, não parece ser falha das refs, vou revisar a consulta do split ( |
Bug da "ref com BR no meio" resolvido, publicarei os mapas novamente. Não eram poucos os segmentos nesta situação:
Entre estes ~4300 casos temos "SP-060;BR-116", "SP-015;BR-116", etc. Foi a convenção adotada por mapeadores do estado de SP. A correção já está aplicada acima no post do SQL.
Estas outras não foram eliminadas mas são suspeitas (lembrando que é mapa de 2018 e pode ter sido corrigido), por não terem mais de 10 km ou 2 membros.
|
Para registro: |
Para encerrar esse issue, deixo para registro:
|
Com relação aos nomes (ver em sumário), acredito que rodovia.br são as rodovias sem nome definido no OpenStreetMap, não é? |
Cada rua, ferrovia ou rodovia do OSM é composta de centenas de segmentos, cada qual com respectivas tags de name, ref, etc. repetidos. Por exemplo a Rodovia Raposo Tavares tem da ordem de 750 segmentos, repetindo ref="SP-270" em todos eles; e a rota BR-116 tem mais de 3000.
A tabela
planet_osm_roads
gerada peloosm2pgsql
é uma reprodução fiel dessa estrutura de segmentos construída pelos mapeadores do OSM, e formalizada no modelo XML OpenStreetMap com os elementos tipo way.Neste repositorio git os segmentos foram armazenados em arquivos GeoJSON nas pastas dos municípios, com alguns poucos segmentos (menos de 0,01%) se repetindo quando participam da fronteira entre municípios, ou cruzam as mesmas.
Neste repositório tambem adotamos a estratégia de uso de caches para representações alternativas e para estatísticas, nas escalas estadual e federal:
contagens gerais são listasdas em arquivos
kx_sumario.csv
da respectiva escala;"geometrias resumidas" (descritas abaixo) são representadas sob pasta
kx_roads
,kx_hidro
oukx_regions
para que se possa conferir visualmente a abrangência espacial destas entidades, que na prática só existem por um critério de rotulação uniforme nas tags.Copia/cola das convenções para nome de arquivo da issue 15:
Nome de arquivo de roads. Dentro do path do município, diversos arquivos na forma
data/${uf}/${municipio}/${roadTypeLabel}-${prefGeohash}.csv
.Exemplo:
data/PR/Curitiba/highway-6gky.geojson
.- O rótulo de
roadTypeLabel
é determinado pelas keys disjuntas highway e railway, concatenando-se à key layer quando presente. Exemplos:highway
,highway_layer
,railway
.- O prefixo Geohash da road (
prefGeohash
) é determinado pelo ST_PointOnSurface, que depois é aplicado a ST_Geohash, truncado nos 1 a 4 primeiros dígitos. No exemplo:6gky
. Eventualmente agrupamentos geohash podem representar intervalos (ex.6g9-6gx
) para balancear o tamanho dos arquivos.Nome de arquivo cache de road estadual. Dentro do path do estado (jurisdição estadual), diversos arquivos na forma
data/${uf}/kx_roads/${roadTypeLabel}-${nome}.csv
.Exemplo:
data/PR/kx_roads/highway-PR-012.geojson
.Nome de arquivo cache de road federal. Dentro do path raiz (jurisdição federal), diversos arquivos na forma
data/kx_roads/${roadTypeLabel}-${nome}.csv
.Exemplo:
data/kx_roads/highway-BR-116.geojson
.A seguir as sugestões de convenção a adotar nos algoritmos de cada caso.
Algoritmo para agrupamento de roads em quadrantes
Conforme convencionado o prefixo Geohash da road é determinado pelo valor
prefGeohash
, com 1 a 4 dígitos. O agrupamento em um mesmo arquivo GeoJSON do tipo collection se dá pelos seguintes critérios e ordem de precedência, supondo que o limite do número de itens na collection sejamax_itens
e o número de dígitos compatível com esse limite:Segmentso de via distintos dentro da mesma collection são ordenados conforme seu
osm_id
, primeiro os IDs de relation depois os IDs de way.Se os valores de
prefGeohash
forem iguais, são agrupados no mesmo arquivo.Se os valores de
prefGeohash
forem vizinhos (segue sequência relativa aos demais no último dígito), e o número de itens menor quemax_itens
, então agrupar;Se existir valor de
prefGeohash
com dígito a menos (quadrante pai), e o número de itens menor quemax_itens
, então agrupar com o pai;A sequência de decisões pode se repetir recursivamente até que todos os arquivos tenham mais de um valor
min_itens
de itens.Algoritmo para simplificação das roads estaduais e federais
Em SQL foi sugerido o seguinte algoritmo, que satisfaz todas os requisitos, supondo por exemplo a generalização da rodovia BR-116:
Se houverem muitas falhas de conectividade, algo como
ST_ApproximateMedialAxis( ST_Union( ST_Buffer(way,r) ) )
... Enfim, será empirico conforme amostragens, outros algorimos podem ser sugeridos, o mais razoável pode ser adotado como padrão, de modo a manter uma geometria estável nas próximas atualiações.The text was updated successfully, but these errors were encountered: