osmc:Metodologia/Algoritmo SQL/Issues: mudanças entre as edições
(Criou página com 'Issues e discussões conceituais, antes de se partir para a implementação. == Issue 01 - Uso ótimo do hInt64 == Nesta issue buscamos garantir melhor ocupação nos 57 disponíveis de geocódigo hInt64. Os blocos hierárquicos de bits seriam os seguintes, concatenados: : <code>$country$L0$grid</code> * O bloco <code>$grid</code> não pode ser otimizado. Possui como principal requsito a garantia de um número par de b...') |
|||
Linha 17: | Linha 17: | ||
=== Bloco L0 === | === Bloco L0 === | ||
Se a cobertura do país for exatamente uma célula quadrada, pode ser ausente, mas em geral sua geometria precisa ser otimizada, para mais de | Se a cobertura do país for exatamente uma célula quadrada, pode ser ausente, mas em geral sua geometria precisa ser otimizada, para mais de 45% da área de L0 ser ocupada pelo polígono do território. Sem essa exigência de ocupação as aplicações de abrangência global perdem performance. As interseções entre países precisam ser minimizadas. | ||
<syntaxhighlight lang="sql"> | |||
WITH m as ( | |||
select pais, case when count(*)>16 then 16 else count(*) end*max(area_km2) as mx | |||
from report.v001_osmc_coverage_l0_list group by 1 | |||
) | |||
SELECT v.pais, count(*) n, sum(v.area_km2) as km2, round(100.0*sum(v.area_km2/m.mx))::text||'%' perc_coberto | |||
FROM report.v001_osmc_coverage_l0_list v INNER JOIN m ON m.pais=v.pais | |||
GROUP BY 1; | |||
</syntaxhighlight> | |||
<pre> | |||
pais| n | km2 | perc_coberto | |||
BR | 18 | 8729499 | 50% | |||
CM | 14 | 466041 | 48% | |||
CO | 16 | 1886770 | 44% | |||
</pre> | |||
No caso do Brasil a codificação L0 ... | O máximo de células é 16, o mínimo 2 (em países com fronteiras instáveis o mais seguro é forçar reserva). Em países com ilhas e células de cobertura com baixo percentual de uso (e possibilidade de representação com uma só célula-filha) pode-se adotar mais que 16 células de cobertura, emulando um nível L0 com mosaico de pedaços, como no caso do Brail. Vamos discutir os três casos a seguir. <br /> A questão principal é se vai permitir ou não quantidade ímpar de células. | ||
No caso do Brasil a codificação L0 requer 2 conjuntos de ilhas, depois das 16 coberturas territoriais. Basta 1 bit para codificar se é uma "falsa célula" ou não. O extremo sul do Brasil, que recebeu o rótulo <code>f</code>, teve sua área subdivida em mosaico para comportar as "falsas células" <code>10=g</code> e <code>11=h</code>. Na prática são todas <code>f</code>, e o geocódigo só "assume sua representação concreta" a partir do segundo dígito: <code>fT</code> para o território extremo sul, <code>fN</code> para as ilhas ao sul e <code>fP</code> para Fernando de Noronha. | |||
[[Arquivo:BR-L0coverSci-f.png|miniaturadaimagem|420px|Goecódigo científico do Brasil. Geometria concreta das células-filhas de "f". Apenas a partir de <code>fT</code> (e eventualmente seus vizinhos fY, fZ e fS), <code>fP</code> e <code>fN</code> que a grade existe.]] | |||
{| | |||
|- | |||
|<pre> | |||
pais | b16h | area_km2 | |||
------+------+---------- | |||
BR | 00 | 275241 | |||
BR | 01 | 757637 | |||
BR | 02 | 645014 | |||
BR | 03 | 132780 | |||
BR | 04 | 619969 | |||
BR | 05 | 1075008 | |||
BR | 06 | 1099512 | |||
BR | 07 | 1054743 | |||
BR | 08 | 103225 | |||
</pre> | |||
|<pre> | |||
pais | b16h | area_km2 | |||
------+------+---------- | |||
BR | 09 | 333725 | |||
BR | 0a | 1099383 | |||
BR | 0b | 723005 | |||
BR | 0c | 19403 | |||
BR | 0d | 714206 | |||
BR | 0e | 54071 | |||
BR | 0f | 17440 | |||
BR | 10 | 1519 | |||
BR | 11 | 3618 | |||
</pre> | |||
|} |
Edição das 20h53min de 26 de maio de 2024
Issues e discussões conceituais, antes de se partir para a implementação.
Issue 01 - Uso ótimo do hInt64
Nesta issue buscamos garantir melhor ocupação nos 57 disponíveis de geocódigo hInt64. Os blocos hierárquicos de bits seriam os seguintes, concatenados:
$country$L0$grid
- O bloco
$grid
não pode ser otimizado. Possui como principal requsito a garantia de um número par de bits, já que inicia em 1 m2 e não pode (?) finalizar em retângulo, sua L0 precisa ser também quadrada.
- o bloco
$L0
contém a cobertura de nível L0 do país. Como o máximo são 16 células L0, podemos manter com reserva seus 4 bits. Podem surgir casos onde zero bits são necessários, ou casos onde mais de 16 células são necessárias, para usar algumas células de tamanho variável.
- o bloco
$contry
já foi otimizado. Os códigos de país já foram reduzidos de 10 para 8 bits. Por exemplo Brasil era id_country=76, agora será id_country=1.
A decisão de descartar ou não 1 bit recai sobre o bloco L0. Temos 8 bits de country e o máximo de Lmax níveis hierárquicos depois de L0 para chegar na célula de 1 m2 do país, portanto, Lmax*2 bits.
Pensando em dígitos hexadecimais, são 2 dígitos para $country, Lmax/2 dígitos para $grid e o restante para totalizar 14 no L0 (4 bits do dígito hexa vezes 14 resulta em 56 bits). No caso do Brasil são mais 20 níveis depois do L0, ou seja, vai até o L20, portanto Lmax*2 = 20*2 = 40 bits. 56-40-8 = 8 bits para L0. No caso da Colômbia são 19 níveis.
Bloco L0
Se a cobertura do país for exatamente uma célula quadrada, pode ser ausente, mas em geral sua geometria precisa ser otimizada, para mais de 45% da área de L0 ser ocupada pelo polígono do território. Sem essa exigência de ocupação as aplicações de abrangência global perdem performance. As interseções entre países precisam ser minimizadas.
WITH m as (
select pais, case when count(*)>16 then 16 else count(*) end*max(area_km2) as mx
from report.v001_osmc_coverage_l0_list group by 1
)
SELECT v.pais, count(*) n, sum(v.area_km2) as km2, round(100.0*sum(v.area_km2/m.mx))::text||'%' perc_coberto
FROM report.v001_osmc_coverage_l0_list v INNER JOIN m ON m.pais=v.pais
GROUP BY 1;
pais| n | km2 | perc_coberto BR | 18 | 8729499 | 50% CM | 14 | 466041 | 48% CO | 16 | 1886770 | 44%
O máximo de células é 16, o mínimo 2 (em países com fronteiras instáveis o mais seguro é forçar reserva). Em países com ilhas e células de cobertura com baixo percentual de uso (e possibilidade de representação com uma só célula-filha) pode-se adotar mais que 16 células de cobertura, emulando um nível L0 com mosaico de pedaços, como no caso do Brail. Vamos discutir os três casos a seguir.
A questão principal é se vai permitir ou não quantidade ímpar de células.
No caso do Brasil a codificação L0 requer 2 conjuntos de ilhas, depois das 16 coberturas territoriais. Basta 1 bit para codificar se é uma "falsa célula" ou não. O extremo sul do Brasil, que recebeu o rótulo f
, teve sua área subdivida em mosaico para comportar as "falsas células" 10=g
e 11=h
. Na prática são todas f
, e o geocódigo só "assume sua representação concreta" a partir do segundo dígito: fT
para o território extremo sul, fN
para as ilhas ao sul e fP
para Fernando de Noronha.
pais | b16h | area_km2 ------+------+---------- BR | 00 | 275241 BR | 01 | 757637 BR | 02 | 645014 BR | 03 | 132780 BR | 04 | 619969 BR | 05 | 1075008 BR | 06 | 1099512 BR | 07 | 1054743 BR | 08 | 103225 |
pais | b16h | area_km2 ------+------+---------- BR | 09 | 333725 BR | 0a | 1099383 BR | 0b | 723005 BR | 0c | 19403 BR | 0d | 714206 BR | 0e | 54071 BR | 0f | 17440 BR | 10 | 1519 BR | 11 | 3618 |