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:
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.
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 comis_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(?), masWHERE 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:
... 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).
Problema: isso vale para células de mesmo nível, falta remover as grandes que cobrem as pequenas.