4 votos

Consulta PostGIS para recuperar el polígono más grande para multi-polígonos mediante la agrupación en el campo de atributos

Estoy trabajando con los datos de polígonos de Natural Earth 10m Admin 1 States Provinces. Este conjunto de datos contiene multi-polígonos para cada estado / provincia en todo el mundo. Lo que me gustaría hacer es agarrar el polígono más grande para cada estado / provincia, a continuación, crear un centroide que está dentro de ese polígono para fines de etiquetado en la cartografía web.

Seguí adelante y calculé el área de cada polígono utilizando ST_Area(geom::geography) para el conjunto de datos y hasta ahora mi consulta PostGIS tiene el siguiente aspecto, que devuelve el polígono más grande para un solo estado/provincia:

SELECT area, name, ST_Centroid(geom) geom
FROM ne_10m_admin_1_states_provinces
WHERE area IN (
      SELECT area
      FROM ne_10m_admin_1_states_provinces 
      WHERE name = 'state province name' 
      ORDER BY area DESC
      LIMIT 1
)

Sin embargo, no estoy seguro de cómo determinar la mejor manera de iterar sobre todas las características en el conjunto de datos para agarrar el polígono de cada estado / provincia con la mayor área. ¿La mejor manera de hacerlo sería crear una función en PGSQL? ¿O hay una forma más sencilla a través de SQL?

6voto

NilObject Puntos 7874

Quieres que sea de un solo paso, usando el ST_Dump para obtener los subcomponentes...

WITH geoms AS (
    SELECT name, (ST_Dump(geom)).geom AS geom 
    FROM ne_10m_admin_1_states_provinces
)
SELECT DISTINCT ON (name) name, ST_Centroid(geom) AS geom
FROM geoms
ORDER BY name ASC, ST_Area(geom) DESC;

El volcado extrae los componentes individuales. El orden por establece la relación en un buen orden para que el distintivo en puede recoger la primera entrada de cada categoría (nombre) que nos importa.

2voto

Craig Puntos 28

Creo que se puede hacer todo en una sola consulta PostGIS.

En primer lugar, hay que crear una consulta que divida los polígonos múltiples en polígonos simples. Esto se puede hacer con algo como:

SELECT gid,
    ST_GeometryN(geom, generate_series(1, ST_NumGeometries(geom))) AS geom
FROM ne_10m_admin_1_states_provinces;

gid es un identificador único (clave primaria u otro campo único).

Entonces puedes calcular el área de todos los polígonos simples, y quedarte sólo con el más grande con algo así:

SELECT DISTINCT ON (gid) A.*, ST_Area(geom) area FROM 
    (SELECT gid,
        ST_GeometryN(geom, generate_series(1, ST_NumGeometries(geom))) AS geom
     FROM ne_10m_admin_1_states_provinces) A
ORDER BY gid, area desc;

con la consulta anterior de antes como subconsulta.

Por último, sólo hay que calcular el centroide de cada una de ellas, lo que también puede hacerse mediante una subconsulta:

SELECT gid, ST_Centroid(geom) AS centroid FROM
(SELECT DISTINCT ON (gid) A.*, ST_Area(geom) area FROM 
    (SELECT gid,
        ST_GeometryN(geom, generate_series(1, ST_NumGeometries(geom))) AS geom
     FROM ne_10m_admin_1_states_provinces) A
ORDER BY gid, area desc) B;

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