50 votos

¿Cuál es la mejor manera de unir un montón de pequeños polígonos para formar un polígono más grande?

Tengo el siguiente capa con SRID 27700 en postgis:

enter image description here

Cada región administrativa del reino unido, y (como se puede ver en el color de la agrupación) de cada uno de ellos tiene un campo de texto especificando el condado se encuentran en.

Lo que me gustaría hacer es hacer más grande del condado de los polígonos de los más pequeños en un país dado, así por ejemplo, en la imagen, sobre todo el color verde azulado de los polígonos que forman un gran polígono de el único anillo exterior que contiene todos los polígonos en los que el color, como el sabio púrpura, marrón, rosa, gris, etc, todas deben formar un polígono.

Ya he intentado lo siguiente:

insert into parishesmerged (geometry)
select astext(multi(ST_Union(the_geom))) as the_geom from parishes
group by county_name

Pero se mantiene la generación de geometrías rotas que tengo grandes problemas en el procesamiento posterior.

Si alguien tiene más Ideas que se agradece.

Estoy esencialmente tratando de hacer un simple nivel de condado mapa con las principales áreas de salida.

Las soluciones no tienen que ser en Postgis bien, tengo la plena OS4Geo pila instalada la última versión de QGis y más utils que me puede sacudir un palillo en.

Lo único que no tengo son los chicos grandes como ArcGis (Aunque yo tengo un Viejo Mapinfo por ahí en algún lugar)

Saludos

Shawty

------======== Actualización : 22/8/2012 ========------

Gracias a todos por las respuestas hasta ahora, me iré y examinar cada uno, a ver qué pasa, a continuación, volver y documentar los resultados de mis investigaciones.

Para el registro, el conjunto de datos estoy tratando de crear es para acompañar un SIG libro que estoy escribiendo objetivo .NET programadores que desean escribir aplicaciones SIG utilizando .NET

Yo sé lo que necesita saber acerca de algo relativamente sencillo en Postgis como Espacial de Consulta y recopilación de Estadísticas y si el editor me permitirá que me la intención de hablar de los sig.stackexchange y todos aquellos que frecuentan aquí :-)

Estaré de vuelta pronto....

Saludos

Shawty

------======== Actualización : 25/8/2012 ========------

Bien después de vagar de nuevo en el ciber espacio y tratando de las sugerencias a continuación, el que trabajó el mejor fue el 'Pablo Ramseys" solución. Gracias Pablo.

Ahora tengo un bonito simplificado condados y condados de archivo que sólo lo suficientemente simple para mi libro, pero lo suficientemente complejo para que me demuestran algo muy interesante, geo-espacial de SQL.

Aunque la solución de Pablo en última instancia, fue el único que funcionó para mí, yo también se basó en las otras respuestas para cosas como la simplificación de los polígonos del mapa y la reducción de la complejidad adicional.

En cosa que me hizo observar mientras se hace esto, sin embargo, mientras que ST_Collect es de hecho más rápido que ST_Union, ejecutar para ejecutar también fue el principal responsable de geometrías rotas. Mi conjetura es que el aumento de velocidad se obtiene a expensas de una menor precisión en la función principal.

0 votos

Este proceso se conoce como "disolución". No tengo experiencia con PostGIS, pero creo que se puede utilizar el ST_Union realiza la disolución.

0 votos

Hola dmahr, gracias por la aclaración, no estaba seguro de cómo se llamaba, sin embargo si lees mi pregunta verás que ya lo intenté :-)

0 votos

Oops, lo siento... no lo había visto. ¿Has probado la sentencia select sin el astext(multi()) ¿parte? Sólo me baso en lo que veo en otros ejemplos de disolución de PostGIS.

52voto

NilObject Puntos 7874

ST_Union funcionaría, pero es casi seguro que su trabajo de línea no es limpio. Así que los límites de sus cositas no son todos perfectamente como arriba. Puedes ajustarlos suavemente a una cuadrícula para intentar aumentar las probabilidades de que los vértices se alineen, pero apuesto a que seguirás teniendo algunos casos que no funcionan. O bien estarán más allá de la tolerancia o, lo que es más probable, habrá lugares en los que los vértices no estén emparejados, de modo que haya una línea en un lado y un vértice en el otro.

 CREATE TABLE merged AS
 SELECT ST_Union(ST_SnapToGrid(the_geom,0.0001)) 
 FROM parishes
 GROUP BY county_name;

Si tienes PostGIS 2.0, la construcción de una estructura topológica con una tolerancia podría llevarte a la respuesta que buscas, si tienes algo de suerte.

0 votos

Buena pista para la corrección de las geometrías, pero sobre "... un gran polígono del único anillo exterior que contiene todos los polis..."?

0 votos

No sabía lo de 'SnapTo', lo probaré :-) Gracias. Desgraciadamente, no, todavía no utilizo PG 2, aunque la actualización está en proyecto.

0 votos

No estoy seguro de que tu sintaxis sea correcta. Por postgis.net/docs/ST_Union.html no hay ninguna firma que acepte un número en el segundo parámetro.

12voto

Erik Öjebo Puntos 6937

ST_Collect es una función "agregada" en la terminología de PostgreSQL

" SELECT ST_Collect(GEOM) FROM GEOMTABLE GROUP BY ATTRCOLUMN " devolverá una GEOMETRYCOLLECTION distinta para cada valor distinto de ATTRCOLUM

http://postgis.net/docs/ST_Collect.html

Nota: ST_Collect es mucho más rápido que ST_Union

3 votos

Lo intenté y obtuve resultados ligeramente diferentes, sin embargo, ¿es una colección de geometría lo que necesito? Esencialmente estoy tratando de hacer un gran polígono, opcionalmente con agujeros en él (Específicamente en Derbyshire y nottinghamshire donde ambos derby y Nottingham forman distritos separados justo en el centro. Sin embargo, he observado la diferencia de velocidad, así que eso es kewl.

8voto

Iznogood Puntos 143

Usted dice que necesita "... formar un gran polígono a partir del único anillo exterior que contiene todos los polis...". El ST_ExteriorRing hace esto,

SELECT ST_MakePolygon(ST_ExteriorRing(ST_Union(GEOM)))
FROM GEOMTABLE GROUP BY ATTRCOLUMN

Puede utilizar ST_Union(), como se sugiere, o probar con ST_Collection().


NOTAS: para evitar pequeños bucles o "geometrías rotas" puede utilizar st_convexhull y/o ST_Simplify para cada geom,

SELECT ST_MakePolygon(ST_ExteriorRing(ST_union(ST_Simplify(GEOM,0.5))))
FROM GEOMTABLE GROUP BY ATTRCOLUMN

y comprobar sus geometrías,

SELECT * FROM (
   SELECT gid, ST_IsValid(geom) as valid, ST_IsSimple(geom) as simple 
   FROM GEOMTABLE) AS t  
WHERE NOT(valid AND simple);

0 votos

Perdón por la confusión: Lo que quería decir con mi descripción era un polígono más grande creado a partir de los más pequeños, me doy cuenta de que dependiendo del contexto "Anillo exterior" puede significar cosas diferentes para diferentes personas, mi intención era describir un solo polígono creado a partir de la frontera presente alrededor de cada grupo de polígonos.

2voto

mblsha Puntos 305

Por su pregunta, supongo que está utilizando el producto Boundary-Line de Ordnance Survey. Si es así, ya incluye un conjunto de datos a nivel de condado, por lo que no es necesario que intente generarlo usted mismo a partir de áreas parroquiales de nivel inferior.

Si no está utilizando Boundary-Line, le recomiendo que lo haga, ya que es gratuito bajo la licencia OS OpenData y tiene un nivel de condado como un archivo shape que puede cargar directamente en PostGIS.

2 votos

¿Qué tal si proporcionas un enlace para los que no lo conocen? gracias.

1 votos

Hola CHEnderson usted es de hecho correcto, sí estoy usando el conjunto de datos de la capa de límites de OS Opendata, por desgracia, los límites del condado no son completos, el archivo de forma del condado real sólo incluye los que se nombran como condados, los distritos de Londres contiene las áreas alrededor de Londres, y otros archivos todos tienen algunas partes en, algunos niveles más bajos y más pequeños que los demás. El único archivo que contiene todo el contorno del Reino Unido y, por lo tanto, cualquier posibilidad de extraer todos los condados de nivel superior y los límites municipales en una capa es la capa de las parroquias, por lo que estoy tratando de hacerlo.

0 votos

Para aquellos que estén interesados, pueden descargar los límites del condado y más, aquí: ordnancesurvey.co.uk/oswebsite/products/os-opendata.html

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