Skip to content
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

Algortimo para obter a numeração predial #2

Open
ppKrauss opened this issue Apr 27, 2019 · 1 comment
Open

Algortimo para obter a numeração predial #2

ppKrauss opened this issue Apr 27, 2019 · 1 comment

Comments

@ppKrauss
Copy link
Contributor

ppKrauss commented Apr 27, 2019

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
Copy link
Contributor Author

ppKrauss commented Apr 27, 2019

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:

  • amostragem de numeração predial oficial (ou homologada) maior: nos trechos de maior sinuosidade;
  • linestring merge: trechos consecutivos de uma via fragmentada não devem ser unidos se as respectivas taxas de sinuosidade forem muito diferentes.
    (exemplo de regra heurística: se a diferença de sensibilidade dos trechos é maior do que ~15% então melhor manter como fragmentos separados).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant