23 votos

Cálculo del porcentaje de área de intersección en la cláusula WHERE

Tengo una tabla de polígonos (grupos de bloques censales) en Postgres. Quiero etiquetar cada grupo de bloques con la ciudad (otra tabla de polígonos) en la que reside principalmente en . ¿Es posible?

Estoy pensando que tendría que crear esencialmente algo como:

select b.*, t.name  
from blockgroups b, towns t  
where (st_area(st_intersection(b.wkb_geometry, t.wkb_geometry))/st_area(b.wkb_geometry)) > .5  

pero esta consulta se eterniza (tengo unos 5.000 grupos de bloques y 375 ciudades...). ¿Alguna sugerencia sobre cómo hacer que esta consulta funcione en absoluto si es incorrecta, o más rápido si es correcta?

35voto

sashkello Puntos 325

La forma en que lo estás haciendo funcionará pero llevará demasiado tiempo, ya que postgis está intentando crear la geometría de la intersección de cada combinación "grupo de bloques vs ciudad", incluso cuando ni siquiera se tocan.

Añada otra comprobación de condiciones a su WHERE para comprobar si las dos geometrías se interceptan, y ponerla antes de la existente:

select b.*,t.name
from blockgroups b, towns t
where st_intersects(b.wkb_geometry, t.wkb_geometry) and    
    (st_area(st_intersection(b.wkb_geometry, t.wkb_geometry)) / 
     st_area(b.wkb_geometry)) > .5

En SQL, si tiene una lista de condiciones en la cláusula WHERE, se comprueban por el orden en que se escriben. Si se devuelve un FALSE en una de las primeras operaciones, la consulta se saltará la comprobación de las demás condiciones, ya que el resultado será siempre FALSE.

Además, asegúrese de que tiene índices espaciales en blockgroups.wkb_geometry y towns.wkb_geometry .

18voto

GinLemon Puntos 1

Además de la muy útil respuesta de Alexandre, si algunas de sus unidades de censo pueden abarcar tres de sus ciudades (y por lo tanto no puede garantizar más del 50% de caídas en cualquier ciudad) puede hacer esto:

select distinct on (b.id)
b.*,t.name,
(st_area(st_intersection(b.wkb_geometry, t.wkb_geometry))/st_area(b.wkb_geometry)) as proportion
from blockgroups b, towns t
where st_intersects(b.wkb_geometry, t.wkb_geometry) 
order by b.id, proportion desc;

Esto básicamente protege contra la siguiente situación - en la que las áreas en azul desaparecerían: enter image description here

-3voto

libogista Puntos 11

Con st_intersects y el operador &&, puede utilizarlo: Calcolo_perc_intersez_postgis

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X