Open ppKrauss opened 5 years ago
Como as implementações iniciais terão como foco BR-SP, pode-se eleger algumas amostras de
planet_br_line_listref?ref_prefix=SP
.
A rodovia SPA 291/055 é das mais fragmentadas, ao passo que trechos vizinhos da SP-055 possuem dimensão razoável. Queries de avaliação:
select osm_id, st_length(way,true)
from planet_osm_line where tags->>'ref'='SPA 291/055'
order by 2 desc;
select osm_id, st_length(way,true)
from planet_osm_line where tags->>'ref' like 'SP-055%'
order by 2 desc;
O trecho mais longo da estrada SPA 291/055 tem da ordem de 600 metros, de modo que demandaria merge com outros trechos para se adequar à modelagem de streamlines orientadas à numeração predial.
Vejamos agora um trecho sinuoso da SP-055, a way 255783073, comparado com um trecho reto, vizinho a ele, a way 178354639.
-- SELECT osm_id, m, u, tags
SELECT tolerance, osm_id, m, m_simp, round(1000*m_simp/m)/10 || '%' simp_perc
FROM (
SELECT *, 0.001 tolerance, st_length(way) u, round(st_length(way,true)) m,
round(st_length(ST_Simplify(way,0.001,true),true)) m_simp
FROM planet_osm_line
WHERE osm_id IN(255783073,178354639)
) t;
osm_id | km | u | tags |
---|---|---|---|
178354639 | 2.502 | 0.023125603 | ref: SP-055;BR-101 , highway: trunk , surface:asphalt |
255783073 | 17.828 | 0.170049419 | ref:SP-055;BR-101 , highway:primary , surface:paved |
onde a coluna u é o comprimento medido em unidades geográficas (graus do WSG84), para avaliar o parâmetro de tolerância na função ST_Simplify()
.
tolerance | osm_id | m | m_simp | simp_perc |
---|---|---|---|---|
0.0001 | 178354639 | 2502 | 2499 | 99.9% |
0.0001 | 255783073 | 17828 | 17696 | 99.3% |
0.001 | 178354639 | 2502 | 2495 | 99.7% |
0.001 | 255783073 | 17828 | 16599 | 93.1% |
0.05 | 178354639 | 2502 | 2495 | 99.7% |
0.05 | 255783073 | 17828 | 12026 | 67.5% |
Há uma rápida convergência do trecho reto, e notável sensibilidade do trecho sinuoso. Esse seria o principal indicativo de demanda por um polinômio de maior grau na way/255783073. Disso podemos inferir recomendação mais gerais:
Dado um ponto (
geo
URI) e ovia_id
(identificador da via) onde será projetado (por ST_ClosestPoint), retorna-se a metragem da via para aquele ponto de projeção.A metragem tem como referência o valor de ST_LineLocatePoint, mas não pode ser inferida diretamente disto: a solução do problema requer justamente a convenção de um modelo matemático (polinômio de ajuste) minimamente razoável para manter em cache de cada linha representativa de via.
A obtenção dos dados do polinômio depende da amostragem de numeração predial oficial (ou tabela de dados do odômetro no percurso da estrada), e do grau de sinuosidade da linha (ex. comparação dos ajustes com e sem simplificação de linha).
PS: quanto mais distante do marco zero, maior o peso da amostra na regressão (fit do polinômio) tendo em vista que erros relativos à sinuosidade da linha vão sendo acumuldados.
Convenções
Na modelagem o ideal é ter uma só linestring por via, mas o algoritmo deve comportar também fragmentos de via, ou seja, linestrings que não começam no marco zero. A fragmentação pode eventualmente ser recomendada, como no caso de uma estrada como a Anchieta-SP, que sobe a serra: três polinômios distintos (antes, durante e depois da serra) podem modelar melhor do que ajustando-se um só.
Caso geral da obtenção de ID da via e numeração predial
Complemento do algoritmo requisitado pela issue #1. O caso geral tem solução mais precisa no meio rural, onde a probabilidade de "endereço de esquina" é menor.
Referências e estudos de caso
Caberia uma pesquisa mais detalhada, informalmente o algoritmo de numeração predial e pode ser descrito conforme essa discussão de forum: