2 583
edições
Sem resumo de edição |
mSem resumo de edição |
||
(17 revisões intermediárias por 3 usuários não estão sendo mostradas) | |||
Linha 1: | Linha 1: | ||
== Cobertura-base == | == Resumo das conclusões == | ||
Na verdade é um conjunto de regras heurísticas. Aplica-se à grade associada ao geocódigo logístico | Dos estudos e evidências a seguir, concluíu-se para Brasil e Colômbia o seguinte: | ||
* Foram '''mantidas como estavam''': na comparação com o novo algoritmo deram todos o mesmo resultado, exceto Altamira que possuia antes uma "poeira", | |||
** http://test.osm.codes/BR-PA-Altamira | |||
** http://test.osm.codes/BR-SP-RioClaro | |||
** http://test.osm.codes/BR-SP-SaoCarlos | |||
** http://test.osm.codes/BR-SP-SaoPaulo | |||
** http://test.osm.codes/BR-SP-MogiCruzes | |||
** http://test.osm.codes/BR-SP-Campinas | |||
** http://test.osm.codes/BR-RJ-RioJaneiro | |||
** http://test.osm.codes/CO-BOY-Tunja | |||
* Cobertura base de '''L 1 km''' (1m -> 5 digitos) e cobertura-overlay: L181m (1m -> 4 digitos) (encode overlay com problema!). Exemplos: | |||
** http://test.osm.codes/BR-SP-SaoCaetanoSul | |||
** http://test.osm.codes/BR-MG-SantaCruzMinas | |||
** http://test.osm.codes/BR-SP-AguasSaoPedro | |||
** http://test.osm.codes/CO-ANT-Sabaneta | |||
** http://test.osm.codes/BR-SP-Poa | |||
* Cobertura base de '''L 5.7 km''' (1m -> 6 digitos) e cobertura-overlay: L1km (1m -> 5 digitos). Exemplos: | |||
** http://test.osm.codes/CO-ANT-Medellin | |||
** http://test.osm.codes/CO-CAL-Aguadas | |||
** http://test.osm.codes/BR-PI-Parnaiba | |||
** http://test.osm.codes/BR-CE-Pacoti | |||
* Cobertura base de '''L 32 km''' (1m -> 7 digitos) e cobertura-overlay: L5.7km (1m -> 6 digitos). Exemplos: | |||
** http://test.osm.codes/CO-ANT-Yarumal | |||
** http://test.osm.codes/CO-BOL-Morales | |||
** http://test.osm.codes/BR-RS-SantaMaria | |||
** http://test.osm.codes/BR-MG-Serro | |||
* Cobertura base de '''L 185 km''' (1m -> 8 digitos) e cobertura-overlay: L5.7km (1m -> 6 digitos). Exemplos: | |||
** http://test.osm.codes/CO-GUV-SanJoseGuaviare | |||
** http://test.osm.codes/CO-AMA-PuertoSantander | |||
** http://test.osm.codes/BR-AM-AtalaiaNorte | |||
** http://test.osm.codes/BR-PA-SaoFelixXingu | |||
* Exemplos com poeira: área do município menor que 100 m2 que será eliminada [[Arquivo:OSM-Cover-poeira.png|miniaturadaimagem|Exemplo de poeira de menos de 100m2 eliminada da fronteira, [https://test.osm.codes/BR-SE-SaoCristovao~6BPBN8 BR-SE-SaoCristovao~6BPBN8]. <br/>Como é sobre o rio, pode ficar como "ponto cego".]] | |||
** http://test.osm.codes/BR-SE-SaoCristovao | |||
** http://test.osm.codes/BR-GO-Edealina | |||
** http://test.osm.codes/CO-VAC-Dagua | |||
** http://test.osm.codes/CO-HUI-Tarqui | |||
== CoberturaBase == | |||
Na verdade é um conjunto de regras heurísticas. Aplica-se à grade associada ao geocódigo logístico. Em geral a '''base32''' em uso: vamos assumir a seguir apenas casos com base32, fica pendente o desenvolvimento similar para base16. | |||
Objetivo: | Objetivo: | ||
# Minimizar '''tamanho do geocódigo''' cientifico da cobertura, minimizando o '''tamanho das células''' de cobertura-base. | # Minimizar '''tamanho do geocódigo''' cientifico da cobertura, minimizando o '''tamanho das células''' de cobertura-base. | ||
Possibilidades, | Possibilidades, ''p''=quantidade total de células na cobertura | ||
# | # ''CoberturaBase'' com ''p=1''; (dispensa indexação se nao houver demanda ''overlay'') | ||
# | # ''CoberturaBase'' com ''p>1''; | ||
# | # ''CoberturaBase'' + ''coberturaOverlay''. | ||
Limitantes: | Limitantes: | ||
# '''p < | # '''p < 31'''; | ||
# '''32-p = q,''' onde | # '''32-''p'' = ''q'',''' onde 1 < ''q'' < 32. q é a reserva. | ||
# Level<sub> | # Level<sub>coberturaBase</sub> - Level<sub>coberturaOverlay</sub> = 2.5 | ||
Casos: | Casos: | ||
Linha 24: | Linha 62: | ||
## qual o valor de p da cobertura que resulta em códigos curtos do tamanho que defini? dado q, 32-p>=q? Se sim, usar a cobertura-base encontrada; | ## qual o valor de p da cobertura que resulta em códigos curtos do tamanho que defini? dado q, 32-p>=q? Se sim, usar a cobertura-base encontrada; | ||
## Se 32-p<q, reduzir 1 digito na cobertura encontrada mantendo as células da cobertura anterior que interceptarem o perímetro urbano. A quantidade de células nessa nova cobertura satisfaz 32-p'>=q? Se sim, usar cobertura-base + overlay. Se não satisfaz, reduzir um digito da definição de 'curto' utilizada e repetir. | ## Se 32-p<q, reduzir 1 digito na cobertura encontrada mantendo as células da cobertura anterior que interceptarem o perímetro urbano. A quantidade de células nessa nova cobertura satisfaz 32-p'>=q? Se sim, usar cobertura-base + overlay. Se não satisfaz, reduzir um digito da definição de 'curto' utilizada e repetir. | ||
=== Algumas estatísticas sobre não indexação: === | === Algumas estatísticas sobre não indexação: === | ||
A consulta | A consulta | ||
< | <syntaxhighlight lang="sql"> | ||
SELECT * | SELECT * | ||
FROM optim.jurisdiction | FROM optim.jurisdiction | ||
Linha 35: | Linha 72: | ||
AND (info->'area_km2')::int <= 1 | AND (info->'area_km2')::int <= 1 | ||
AND (info->'area_km2')::int > 0; | AND (info->'area_km2')::int > 0; | ||
</ | </syntaxhighlight> | ||
não produz resultados em Brasil e Colômbia. Produz resultados no Uruguai. Porém, geometrias de jurisdições no Uruguai ainda não estão boas. Então, não foi testado se jurisdições cabem numa célula de 1km de lado. Que produziriam, sem indexação, geocódigos de tamanho 4. | não produz resultados em Brasil e Colômbia. Produz resultados no Uruguai. Porém, geometrias de jurisdições no Uruguai ainda não estão boas. Então, não foi testado se jurisdições cabem numa célula de 1km de lado. Que produziriam, sem indexação, geocódigos de tamanho 4. | ||
Já a consulta | Já a consulta | ||
< | <syntaxhighlight lang="sql"> | ||
SELECT * | SELECT * | ||
FROM optim.jurisdiction | FROM optim.jurisdiction | ||
Linha 48: | Linha 84: | ||
AND (info->'area_km2')::int > 0 | AND (info->'area_km2')::int > 0 | ||
AND jurisd_base_id IN (76,170) | AND jurisd_base_id IN (76,170) | ||
</ | </syntaxhighlight> | ||
resulta em 51 municípios em Brasil e Colômbia. | resulta em 51 municípios em Brasil e Colômbia. | ||
Linha 54: | Linha 90: | ||
No entanto, apenas 1 município cabe dentro de uma célula com lado 5.7km: | No entanto, apenas 1 município cabe dentro de uma célula com lado 5.7km: | ||
< | <syntaxhighlight lang="sql"> | ||
SELECT * | |||
FROM | FROM ( | ||
( | |||
SELECT isolabel_ext, | SELECT isolabel_ext, | ||
Linha 72: | Linha 107: | ||
) r | ) r | ||
WHERE st_containsproperly IS TRUE; | WHERE st_containsproperly IS TRUE; | ||
-- isolabel_ext | st_containsproperly | |||
-- | -- BR-MG-SantaCruzMinas | t | ||
BR-MG-SantaCruzMinas | t | |||
(1 row) | (1 row) | ||
</ | </syntaxhighlight> | ||
Avançando mais um pouco, considerando células de 32km de lado, a consulta | Avançando mais um pouco, considerando células de 32km de lado, a consulta | ||
< | <syntaxhighlight lang="sql"> | ||
SELECT * | SELECT * | ||
FROM | FROM | ||
( | ( | ||
SELECT isolabel_ext, | SELECT isolabel_ext, | ||
ST_ContainsProperly(ST_GeomFromGeoJSON(((CASE split_part(isolabel_ext,'-',1) | ST_ContainsProperly(ST_GeomFromGeoJSON(((CASE split_part(isolabel_ext,'-',1) | ||
WHEN 'BR' THEN osmc.encode_scientific_br(ST_Transform(ST_PointOnSurface(geom),952019),19000,0) | WHEN 'BR' THEN osmc.encode_scientific_br(ST_Transform(ST_PointOnSurface(geom),952019),19000,0) | ||
WHEN 'CO' THEN osmc.encode_scientific_co(ST_Transform(ST_PointOnSurface(geom), 9377),19000,0) | WHEN 'CO' THEN osmc.encode_scientific_co(ST_Transform(ST_PointOnSurface(geom), 9377),19000,0) | ||
END)->'features')[0]->'geometry'),geom) | END)->'features')[0]->'geometry'),geom) | ||
FROM optim.vw01full_jurisdiction_geom | FROM optim.vw01full_jurisdiction_geom | ||
WHERE isolevel=3 | WHERE isolevel=3 | ||
Linha 98: | Linha 130: | ||
) r | ) r | ||
WHERE st_containsproperly IS TRUE; | WHERE st_containsproperly IS TRUE; | ||
</ | </syntaxhighlight> | ||
Resulta que 603 municípios brasileiros e colombianos têm área que cabem dentro de uma célula de 32km de lado. Se não houver indexação os geocódigos resultantes teriam tamanho 6 em 1m. Aproximadamente, menos de 10% dos municípios. | Resulta que 603 municípios brasileiros e colombianos têm área que cabem dentro de uma célula de 32km de lado. Se não houver indexação os geocódigos resultantes teriam tamanho 6 em 1m. Aproximadamente, menos de 10% dos municípios. | ||
Evidente que esses municípios podem ser cobertos por células de 5,7km de lado com indexação, onde teríamos os mesmos 6 dígitos. | Evidente que esses municípios podem ser cobertos por células de 5,7km de lado com indexação, onde teríamos os mesmos 6 dígitos. | ||
A consulta a seguir mostra que, de fato, 467 municípios estão dentro de uma célula com código de 3 dígitos na base 32nvu. | A consulta a seguir mostra que, de fato, 467 municípios estão dentro de uma célula com '''código de 3 dígitos na base 32nvu''' (ou seja, '''código base16h convertido em 32nvu.'''). | ||
< | |||
<syntaxhighlight lang="sql"> | |||
drop table lix; create table lix as SELECT * FROM osmc.tmpvwcellContainsProperly; | drop table lix; create table lix as SELECT * FROM osmc.tmpvwcellContainsProperly; | ||
select * from lix where length(cellcontainsproperly)>=3 order by 1; | select * from lix where length(cellcontainsproperly)>=3 order by 1; | ||
</syntaxhighlight> | |||
<pre> | |||
... | ... | ||
BR-MG-SantaCruzMinas | C1J9 | BR-MG-SantaCruzMinas | C1J9 | ||
Linha 132: | Linha 167: | ||
CO-SAN-Guapota | D7W | CO-SAN-Guapota | D7W | ||
(467 rows) | (467 rows) | ||
</pre> | |||
=== Algumas estatísticas sobre cobertura-base com p próximo de 30 e geocódigos de 5 dígitos em 5.7m === | |||
Para em um município termos geocódigos de 5 dígitos em 5.7m, considerando indexação, a sua cobertura-base deve ser composta de células de 5.7km (4 dígitos). | |||
A tabela osmc.tmp_coverage_citynew3 possui cobertura geradas automaticamente. | |||
As consultas a seguir mostram que aproximadamente 4009 municípios brasileiros e colombianos podem ser cobertos com coberturas de células de 5.7km de lado, considerando q=30. | |||
Além disso, em 94 coberturas foram removidas poeiras. | |||
= | <syntaxhighlight lang="sql"> | ||
SELECT split_part(isolabel_ext,'-',1) AS country, length_cell, count(*) | |||
FROM | |||
( | |||
-- seleciona cobertura com células de mais digitos | |||
SELECT isolabel_ext, MAX(length_cell) AS length_cell | |||
FROM osmc.tmp_coverage_citynew3 | |||
WHERE number_cells < 31 -- 2 sobras | |||
GROUP BY isolabel_ext | |||
)f | |||
GROUP BY split_part(isolabel_ext,'-',1), length_cell | |||
ORDER BY 1,2 | |||
; | |||
country | length_cell | count | |||
---------+-------------+------- | |||
BR | 2 | 67 | |||
BR | 3 | 2255 | |||
BR | 4 | 3244 | |||
BR | 5 | 4 | |||
CO | 2 | 5 | |||
CO | 3 | 350 | |||
CO | 4 | 760 | |||
CO | 5 | 1 | |||
(8 rows) | |||
SELECT length_cell, count(*) | |||
FROM | |||
( | |||
-- seleciona cobertura com células de mais digitos | |||
SELECT isolabel_ext, MAX(length_cell) AS length_cell | |||
FROM osmc.tmp_coverage_citynew3 | |||
WHERE number_cells < 31 -- 2 sobras | |||
GROUP BY isolabel_ext | |||
)f | |||
GROUP BY length_cell | |||
ORDER BY 1 | |||
; | |||
length_cell | count | |||
-------------+------- | |||
2 | 72 | |||
3 | 2605 | |||
4 | 4004 | |||
5 | 5 | |||
(4 rows) | |||
SELECT count(*) | |||
FROM | |||
-- | ( | ||
-- seleciona cobertura com células de mais digitos | |||
SELECT isolabel_ext, MAX(length_cell) AS length_cell | |||
FROM osmc.tmp_coverage_citynew3 | |||
WHERE flag_poeira IS TRUE AND number_cells < 31 -- 2 sobras | |||
GROUP BY isolabel_ext | |||
)f | |||
; | |||
count | |||
------- | |||
87 | |||
(1 row) | |||
SELECT count(*) | |||
FROM | FROM | ||
( | ( | ||
-- seleciona cobertura com células de mais digitos | |||
SELECT isolabel_ext, MAX(length_cell) AS length_cell | |||
FROM osmc.tmp_coverage_citynew3 | |||
) | WHERE unioncontainsproperly IS false AND number_cells < 31 -- 2 sobras | ||
GROUP BY isolabel_ext | |||
)f | |||
; | |||
count | count | ||
------- | ------- | ||
7 | |||
(1 row) | (1 row) | ||
-- percentil 75 , 90 : | |||
SELECT percentile_cont(0.75) within group (order by number_cells asc) as percentile_75, | -- percentil 25, 50, 75 , 90, 95, 100 : | ||
percentile_cont(0.90) within group (order by number_cells asc) as percentile_90 | SELECT percentile_cont(0.25) within group (order by number_cells asc) as percentile_25, | ||
percentile_cont(0.50) within group (order by number_cells asc) as percentile_50, | |||
percentile_cont(0.75) within group (order by number_cells asc) as percentile_75, | |||
percentile_cont(0.90) within group (order by number_cells asc) as percentile_90, | |||
percentile_cont(0.95) within group (order by number_cells asc) as percentile_95, | |||
percentile_cont( 1) within group (order by number_cells asc) as percentile_100 | |||
FROM | FROM | ||
( | ( | ||
SELECT | SELECT a.* | ||
FROM osmc. | FROM osmc.tmp_coverage_citynew4 a | ||
WHERE | INNER JOIN | ||
) a | ( | ||
-- seleciona cobertura com células de mais digitos | |||
percentile_75 | percentile_90 | SELECT isolabel_ext, MAX(length_cell) AS length_cell | ||
---------------+--------------- | FROM osmc.tmp_coverage_citynew4 | ||
WHERE number_cells < 31 -- 2 sobras | |||
GROUP BY isolabel_ext | |||
) b | |||
ON a.isolabel_ext = b.isolabel_ext AND a.length_cell = b.length_cell | |||
) c | |||
order by 1; | |||
percentile_25 | percentile_50 | percentile_75 | percentile_90 | percentile_95 | percentile_100 | |||
---------------+---------------+---------------+---------------+---------------+---------------- | |||
6 | 11 | 18 | 25 | 27 | 30 | |||
(1 row) | (1 row) | ||
</syntaxhighlight> | |||
=== Poeira === | |||
ATENCAO: uma vez estabelecido o "critério de poeira do país", não derá mais ser mudado, pois isso comprometeria todo o esquema de indexação. | |||
A consulta a seguir retorna as células de cobertura (base ou overlay) que possuem area menor que cem metros quadrados: | |||
<syntaxhighlight lang="sql"> | |||
select round(st_area(geom)/10)*10 area_m2, count(*) n, round(avg(length(kx_prefix)),1) as prefix_len_avg from osmc.tmpvwpoeira group by 1; | |||
-- 75 total | |||
</syntaxhighlight> | |||
<pre> | |||
area_m2 | n | prefix_len_avg | |||
---------+----+---------------- | |||
0 | 22 | 3.9 | |||
10 | 6 | 3.8 | |||
20 | 8 | 3.9 | |||
30 | 9 | 3.9 | |||
40 | 3 | 4.0 | |||
50 | 3 | 4.0 | |||
60 | 5 | 4.0 | |||
70 | 12 | 3.9 | |||
80 | 3 | 4.0 | |||
90 | 2 | 3.5 | |||
100 | 2 | 3.5 | |||
</pre> | </pre> | ||
Pelo menos 22 podem ser eliminados. Para os restantes há que se estabelecer o ''critério de precisão'', que resultada do produto de dois fatores: imprecisão técnica dos polígonos originais de jurisdição no OSM, e imprecisão legislativa no país de origem. | |||
Baseado no fator de precisão, duas estratégias são possíveis: | |||
# recortar os polígonos, de maneira análoga a um "snap to grid" | |||
## Cobrir município; | |||
## Remover poeira; | |||
### reindexar?? | |||
## Atualizar jurisdição do município; | |||
### Criar chave em info para indicar que foi '''removida''' poeira e atualizada geometria | |||
## Atualizar jurisdição dos municípios lindeiros: | |||
### Absorver poeira do vizinho; | |||
### Atualizar geometria das células de cobertura; | |||
### Criar chave em info para indicar que foi '''absorvida''' poeira e atualizada geometria; | |||
# ajustar o comportamento da interface nas bordas, quando à validade e detecção das judisdições. | |||
Para os eliminados: | |||
# Remover células de cobertura | |||
## reindexar?? | |||
# Não atualizar jurisdição | |||
# Criar chave em info para indicar que foi removida poeira | |||
[[Categoria:OSMcodes]] | [[Categoria:OSMcodes]] |
edições