osmc:Convenções/Coberturas municipais/Algoritmos: mudanças entre as edições

De Documentação
Sem resumo de edição
Sem resumo de edição
Linha 24: Linha 24:
## 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:
A consulta
<pre>
SELECT *
FROM optim.jurisdiction
WHERE isolevel=3
    AND (info->'area_km2')::int <= 1
    AND (info->'area_km2')::int >  0;
</pre>
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
<pre>
SELECT *
FROM optim.jurisdiction
WHERE isolevel=3
    AND (info->'area_km2')::int <= 36 -- lado 5.7km
    AND (info->'area_km2')::int >  0
    AND jurisd_base_id IN (76,170)
</pre>
resulta em 51 municípios em Brasil e Colômbia.
No entanto, apenas 1 município cabe dentro de uma célula com lado 5.7km:
<pre>
SELECT *
FROM
(
    SELECT isolabel_ext,
            ST_ContainsProperly(ST_GeomFromGeoJSON(((CASE split_part(isolabel_ext,'-',1)
            WHEN 'BR' THEN osmc.encode_scientific_br(ST_Transform(ST_PointOnSurface(geom),952019),3000,0)
            WHEN 'CO' THEN osmc.encode_scientific_co(ST_Transform(ST_PointOnSurface(geom),  9377),3000,0)
            END)->'features')[0]->'geometry'),geom)
           
    FROM optim.vw01full_jurisdiction_geom
    WHERE isolevel=3
        AND (info->'area_km2')::int <= 36
        AND (info->'area_km2')::int >  0
        AND jurisd_base_id IN (76,170)
) r
WHERE st_containsproperly IS TRUE;
    isolabel_ext    | st_containsproperly
----------------------+---------------------
BR-MG-SantaCruzMinas | t
(1 row)
</pre>
Avançando mais um pouco, considerando células de 32km de lado, a consulta
<pre>
SELECT *
FROM
(
    SELECT isolabel_ext,
            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 'CO' THEN osmc.encode_scientific_co(ST_Transform(ST_PointOnSurface(geom),  9377),19000,0)
            END)->'features')[0]->'geometry'),geom)
           
    FROM optim.vw01full_jurisdiction_geom
    WHERE isolevel=3
        AND (info->'area_km2')::int <= 1024
        AND (info->'area_km2')::int >  0
        AND jurisd_base_id IN (76,170)
) r
WHERE st_containsproperly IS TRUE;
</pre>
Resulta que 603 municípios brasileiros e colombianos cabem dentro de uma célula de 32km de lado. Se não houver indexação os geocódigos resultantes teriam tamanho 6. 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.
Algumas estatísticas sobre cobertura-base com p próximo de 30 e geocódigos de 5 digitos em 5.7m:
...

Edição das 17h36min de 19 de maio de 2023

Cobertura-base

Na verdade é um conjunto de regras heurísticas. Aplica-se à grade associada ao geocódigo logístico, ou seja, base32 caso em uso.

Objetivo:

  1. Minimizar tamanho do geocódigo maximizando o tamanho do lado das células de cobertura-base.

Possibilidades:

  1. Cobertura-base, p=1;
  2. Cobertura-base, p>1;
  3. Cobertura-base + cobertura-overlay em parte da área do município;

Limitantes:

  1. p <= 32, onde p=quantidade total de células na cobertura;
  2. 32-p = q, onde 0<q<32
  3. Levelcélula cobertura-base - Levelcélula cobertura overlay = 2.5

Casos:

  1. Municípios com uma célula (extraído de email): A heurística é a seguinte: se além de estar contido em uma célula dessas, o município tem área abaixo da mediana, então precisa usar a cobertura de uma célula. Nos demais casos há que se considerar área urbana para saber quanto de overlay resolveria ou não o problema dele. Heurística final: para ampliar o percentil de 50% (mediana) para 75%, deveríamos filtrar as geometrias com área grande (entre 40% e 75%) e elongation_factor grande.
  2. Sem perímetro urbano: cobertura base
    1. dado q, encontrar maior Level tal que 32-p>=q. Outra forma de pensar: se quero geocódigos de 5 dígitos, devo responder se p da cobetura-base de Level5792,6 satisfaz 32-p>=q. Aqui q codifica o entendimento de quantas reservas devem existir.
  3. Com perímetro urbano
    1. 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;
    2. 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:

A consulta

SELECT *
FROM optim.jurisdiction
WHERE isolevel=3
     AND (info->'area_km2')::int <= 1
     AND (info->'area_km2')::int >  0;

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

SELECT *
FROM optim.jurisdiction
WHERE isolevel=3
     AND (info->'area_km2')::int <= 36 -- lado 5.7km
     AND (info->'area_km2')::int >  0
     AND jurisd_base_id IN (76,170)

resulta em 51 municípios em Brasil e Colômbia.

No entanto, apenas 1 município cabe dentro de uma célula com lado 5.7km:

 SELECT *
FROM
(
    SELECT isolabel_ext,

            ST_ContainsProperly(ST_GeomFromGeoJSON(((CASE split_part(isolabel_ext,'-',1)
            WHEN 'BR' THEN osmc.encode_scientific_br(ST_Transform(ST_PointOnSurface(geom),952019),3000,0)
            WHEN 'CO' THEN osmc.encode_scientific_co(ST_Transform(ST_PointOnSurface(geom),  9377),3000,0)
            END)->'features')[0]->'geometry'),geom)
            
    FROM optim.vw01full_jurisdiction_geom
    WHERE isolevel=3
        AND (info->'area_km2')::int <= 36
        AND (info->'area_km2')::int >  0
        AND jurisd_base_id IN (76,170)
) r
WHERE st_containsproperly IS TRUE;
     isolabel_ext     | st_containsproperly 
----------------------+---------------------
 BR-MG-SantaCruzMinas | t
(1 row)

Avançando mais um pouco, considerando células de 32km de lado, a consulta

SELECT *
FROM
(
    SELECT isolabel_ext,

            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 'CO' THEN osmc.encode_scientific_co(ST_Transform(ST_PointOnSurface(geom),  9377),19000,0)
            END)->'features')[0]->'geometry'),geom)
            
    FROM optim.vw01full_jurisdiction_geom
    WHERE isolevel=3
        AND (info->'area_km2')::int <= 1024
        AND (info->'area_km2')::int >  0
        AND jurisd_base_id IN (76,170)
) r
WHERE st_containsproperly IS TRUE;

Resulta que 603 municípios brasileiros e colombianos cabem dentro de uma célula de 32km de lado. Se não houver indexação os geocódigos resultantes teriam tamanho 6. 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.


Algumas estatísticas sobre cobertura-base com p próximo de 30 e geocódigos de 5 digitos em 5.7m: ...