¿Cómo lograr el equivalente a Disolver de ArcGIS for Desktop usando ST_Union?

11

Estoy tratando de lograr un equivalente a la herramienta Disolver de ArcGIS for Desktop usando ST_Union de PostGIS pero parece que no estoy obteniendo el resultado esperado.

Tengo una tabla que tiene ciertos atributos con la geometría del polígono. (como FID, Locstat, Loccnt, Shape)

Aquí está mi consulta:

SELECT c.fid, ST_Union(c.boundaryshape) FROM c Group by c.fid,c.boundaryshape;
Dhams
fuente
1
¿Puede explicar qué resultados espera y qué obtiene? Ejecutando: SELECT AsText (ST_Union ...) FROM ... podría ayudar a encontrar el error.
Micha
En la tabla tengo 6842 registros, según los resultados de ArcGIS, debería obtener 1683 registros donde, al usar la consulta, obtengo 6842 registros. También probé ST_Aggr_Union, que me da 742 registros con la geometría nula múltiple.
Dhams

Respuestas:

14

Su problema probablemente se deba a lo que ha incluido en el grupo por campo.

ST_UNION es una función agregada, lo que significa que se está disolviendo en función de lo que especifique como GROUPparámetro.

Esto es lo que ingresó:

SELECT c.fid, ST_Union(c.boundaryshape) FROM c Group by c.fid,c.boundaryshape;

De acuerdo con esto, está agrupando por su fid, que probablemente sea un identificador único, y también por boundaryshape, que es la geometría. El problema con esto es que es muy poco probable que las características que comparten una ID única tengan geometrías idénticas. Por lo tanto, ST_Unionprobablemente terminará con algo como lo siguiente:

Input:   
fid     boundaryshape  
1         11  
1         12  
1         11  
1         13  
2         12  
2         13  
2         12  
3          5  
3          2  
3          4  

Output:  
fid     boundaryshape  
1        (11 + 11)  
1        12  
1        13  
2        (12 + 12)  
2        13  
3        2  
3        4  
3        5

En este caso, solo debe disolverse en función de su identificador único, a menos que en realidad tenga varias geometrías duplicadas con las mismas fid, de las que está tratando de deshacerse. Sin embargo, incluso en esa situación, solo debe agruparse en función de fid, y la unión se encargará de la duplicación de la geometría.

Intentaría lo siguiente:

SELECT c.fid, ST_Union(c.boundaryshape) FROM c GROUP BY c.fid;

Eso debería darle el resultado deseado de disolver todas las características basadas en el atributo común fid.

Aquí está el documento de ayuda en el sitio PostGIS: ST_Union

Vea el primer ejemplo que figura en la parte inferior y observe que no incluye la geometría en el grupo por sección.

Consigue espacial
fuente
1
En algunos casos, es mejor ajustar las geometrías a la cuadrícula antes de hacer la unión: SELECT ST_Union (ST_SnapToGrid (geom, 0.0001)) FROM geo_area group by level_identifier;
Maxim Eliseev