¿Cómo acelerar la partición del espacio en postgis?


9

Tengo un montón de polígonos superpuestos y estoy tratando de dividir el espacio para evitar que se superpongan. Creo que mi problema es bastante simple. Utilizando algún producto ESRI y http://arcscripts.esri.com/details.asp?dbid=16700, mi compañero de trabajo lo calculó en 48 segundos.

Estoy tratando de hacerlo con postgis usando http://s3.opengeo.org/postgis-power.pdf#page=24 (adivinando los detalles, usando http://trac.osgeo.org/postgis/wiki/UsersWikiSimplifyPreserveTopology como inspiración) pero es tan lento que no puedo hacerlo con más de 10 polys (tengo 800 para dividir). La parte lenta es la ST_Union, probé varias cosas, pero ninguna fue exitosa, aquí está el estado actual de las cosas:

select geom from
(select st_linemerge(st_union(geom)) as geom from
    (select st_exteriorring((st_dumprings((st_dump(t.geom)).geom)).geom) as geom from
        (SELECT geometry AS geom, id
               FROM tt
              WHERE campaign_id = 204
              ORDER BY id limit 200) t) t2) t3

esto ha estado computando durante 26 minutos (el linemerge () en realidad no lo es). Los polys son MultiPolygons en caso de que st_dump te moleste.

¿Tienes algún consejo? El st_union () de la línea es la parte muy lenta.

Gracias,

Nico

PD: aquí hay algunos números: 852 multipolígonos, que conducen a 14880 polígonos, que conducen a 21467 cadenas lineales que suman 315513 vértices.


Si nadie responde, puede probar la lista de correo postGIS.
GIS-Jonathan

Realmente no soy fanático de las listas de correo, además, también podría ser un problema GEOS, que podría quejarse de JTS, bueno, prefiero mantener el problema abierto.
nraynaud

Al recopilar la línea y hacer una unión con una geometría vacía, puedo hacerlo en 800: st_union (st_collect (geom), st_setsrid (geomfromtext ('POINT EMPTY'), 900913)) que es casi 20 veces más lento que el material ESRI.
nraynaud

1
de memoria, intente soltar st_union de st_linemerge (st_union ...) si ayuda
simplexio

Respuestas:


3

Es posible que esta respuesta no ayude a @nraynaud directamente, pero con suerte arrojará algo de luz sobre el tema.

Hay un problema similar en spatiaLite <4.0 debido a un problema con GEOS. Vea este enlace para una discusión del tema.

La solución alternativa es reemplazar la función ST_Union () con ST_UnaryUnion (ST_Collect ()). Desafortunadamente, ST_UnaryUnion no está disponible hasta postGIS 2.0 (por lo que puedo decir).


1

¿Qué versión de PostGIS estás usando? La unión es mucho más lenta si está utilizando PostGIS <1.4 o GEOS <3.2. Se introdujo una unión mucho más rápida en 1.4, pero también requiere GEOS 3.2+. Primero, si está usando una versión inferior a 1.4, actualizaría a al menos 1.5.

SELECT postgis_full_version();

Verificar.

También es su intención mantener los bordes originales de los polígonos. Si solo quiere disolver áreas superpuestas,

SELECT ST_Union(geom) FROM tt WHERE campaign_id = 204;

Haría el truco.


hola, aquí está el resultado: "POSTGIS =" 1.5.3 "GEOS =" 3.3.2-CAPI-1.7.2 "PROJ =" Rel. 4.8.0, 6 de marzo de 2012 "LIBXML =" 2.7.3 "USE_STATS". No pude encontrar ninguna adición relevante a la unión en GEOS recientemente. Encontré una aceleración en las uniones de polígonos, pero no estoy fusionando polígonos, y esta aceleración parece controvertida. Absolutamente no quiero unir mis polígonos ya que tengo que agregar valores para polígonos superpuestos.
nraynaud
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.