-
Notifications
You must be signed in to change notification settings - Fork 0
Description
A vantagem da busca por células interiores (is_inner) é que a busca pode se restringir à BBOX (operador &&), sem conferir a interseção com o polígono. O número de células marcadas com is_inner, todavia, na maior parte dos países, não passa de 30%.
... Esquecemos que o ponto para "estar no município X" não precisa estar "dentro do polígono do município X", basta estar na sua cobertura. Usando essa propriedade podemos trocar o flag por is_not_shared (ou "is_unique"). No Brasil isso significa incluir todas as células de cobertura de litoral e fronteiras, acrescentando mais uns 20% de células municipais.
Conclusão: com a simples troca de flag chegamos nos 50% de comparações por BBOX, e excluimos elas das comparações por interseção.
Importante: a indexação GIST precisaria ser pela operação da busca, is_not_shared OR ST_Intersects(?), mas
WHERE pt_geom && cell_geom AND (is_not_shared OR ST_Intersects(pt_geom,cell_geom)).
... testar com dois indices, um com outro sem o flag:
- CREATE INDEX mytable_geom_idx1 ON t USING GIST (geom) WHERE is_not_shared;
- CREATE INDEX mytable_geom_idx2 ON t USING GIST (geom);
... Ver https://gis.stackexchange.com/q/487330/7505
Toda célula interior é is_not_shared, mas precisamos expandir. Construção do flag is_not_shared para as células de cobertura municipal (não overlay).
UPDATE t SET is_not_shared=true
WHERE gid IN (SELECT gid FROM cobertura_municipal GROUP BY 1 HAVING COUNT(*)=1)Problema: isso vale para células de mesmo nível, falta remover as grandes que cobrem as pequenas.