5 votos

Error de geometría no válida después de ST_ConvexHull

Tengo una tabla Postgis de alrededor de 80.000 puntos y desea ser capaz de llenar una segunda tabla que resume los datos con los cascos convexos en base a los puntos con un atributo en común.

Por ejemplo, los datos que contiene el intercambio de teléfono que cada punto está asociado con - quiero crear un convex hull para todos los puntos en cada una de las centralitas telefónicas. Se debe crear alrededor de 1000 superposición de polígonos.

He intentado utilizar la normalidad excelente QGis ftools convex hull plugin con la opción de crear cascos basado en un campo de entrada, pero mi equipo pasó de 6 horas maximización de 3 de cuatro núcleos antes de estrellarse de QGis.

Y he intentado hacerlo directamente en sql:

INSERT INTO new_table(exchange_name, the_geom)
SELECCIONE exchange_name, ST_ConvexHull(ST_Collect(the_geom)) Como the_geom
DE primera_tabla
GRUPO POR exchange_name

Pero esta queja acerca de la geometría no válida - he tratado de geometría de las limitaciones de "MULTIPOLÍGONO" y genérico de "GEOMETRÍA" así que no estoy seguro por qué esto debería suceder - la fuente de la tabla de cargas perfectamente en QGis.

La Hierba "de v. casco" de la herramienta sólo crea un convex hull por todos los puntos y no se basa en un atributo.

Cualquier consejo o sugerencia será muy bienvenida!

3voto

Lars Mæhlum Puntos 4569

mi conjetura es que usted consigue no válido polígonos debido a uno o más grupos sólo tienen uno o dos puntos. que no se puede hacer una convexhull polígono.

si ese es el problema, usted puede excluir la problemática de los grupos con algo como

INSERT INTO new_table(exchange_name, the_geom)
SELECT exchange_name, ST_ConvexHull(ST_Collect(the_geom)) As the_geom
FROM first_table
GROUP BY exchange_name 
having count(*)>=3;

si hay filas de la tabla original con multipuntos tendrá que contar los puntos en la colección en su lugar:

INSERT INTO new_table(exchange_name, the_geom)
SELECT exchange_name, ST_ConvexHull(ST_Collect(the_geom)) As the_geom
FROM first_table
GROUP BY exchange_name 
having st_npoints(st_collect(the_geom))>=3;

Yo no soy un programaron para probar, pero creo que debería funcionar.

HTH Nicklas

2voto

Celso Puntos 66

¿Has probado ejecutando los datos de entrada contra ST_IsValid?

Ejemplo: seleccione exchange_name de first_table donde ST_IsValid (the_geom) = false

Si se devuelven las filas tienes geometrías no válidos y deberás arreglarlos o excluirlos de la consulta anterior.

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