osm-codes / spec

OSM.CODES specifications and abstract models
0 stars 0 forks source link

Algortimo para obter a numeração predial #2

Open ppKrauss opened 5 years ago

ppKrauss commented 5 years ago

Dado um ponto (geo URI) e o via_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:

(What's the correct way of adding house numbers to buildings?) It depend on how much information you have. If you know only first and last numbers (or even only one and direction) - you'd probably use interpolation. If you know that some address is in some building - put node somewhere in it. ...

ppKrauss commented 5 years ago

Testes com rodovias SP

Como as implementações iniciais terão como foco BR-SP, pode-se eleger algumas amostras de
planet_br_line_listref?ref_prefix=SP.

Demanda por merge de linestrings

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.

Demanda por correção pela sinuosidade

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: