6 votos

Golpeando los límites de memoria de PostGIS ST_ConcaveHull / Envoltura de contracción incompleta

Estoy tratando de usar PostGIS 2.0 en Postgres 8.4 para hacer algunos mapas. Estoy trabajando con los Shapefiles de la NOAA, específicamente su archivo de Estados y Territorios de los Estados Unidos ubicado aquí:

http://www.nws.noaa.gov/geodata/catalog/national/html/us_state.htm

La aplicación que estoy construyendo necesita hacer pruebas de polígono en polígono, y pruebas de punto en polígono (PiP). Los shapefiles tal como están son demasiado detallados, y las consultas están tomando demasiado tiempo. Estoy tratando de conseguir que PostGIS simplifique las complejas formas de los estados, quiero lograr una alta calidad de envoltura de cada estado, de modo que los ríos y las bahías se incluyen en los estados, pero las pequeñas islas costeras u otras masas terrestres diminutas se ignoran . Mi objetivo es tener dos tablas: tanto la tabla de geometrías crudas de los estados para situaciones de salida de alta calidad, y también una tabla separada states_simple donde puedo usar geometrías pre-comprimidas para acelerar las pruebas PiP.

Finalmente he descubierto cómo implementar correctamente ST_Concavehull, pero me encuentro con los límites del hardware del servidor, o la configuración de postgres.

Aquí hay una imagen para ilustrar el problema que me encuentro:

ConcaveHull vs Raw Geometry

El procesamiento de estados "cuadrados" como Oklahoma mediante el proceso ConcaveHull es rápido y sin problemas. Los estados que tienen ALGUNAS islas costeras/complejidad como Georgia procesan un poco más lento, pero razonablemente rápido y salen de una manera que será útil para la prueba PiP (es decir, una envoltura apretada):

ConcaveHull Georgia

Sin embargo, algunos estados como Nueva Jersey están mostrando algunos de los mismos problemas que tiene Florida al utilizar ConcaveHull:

ConcaveHull New Jersey

La parte superior e inferior de Nueva Jersey son EXACTAMENTE lo que quiero, pero la gran parte de Pensilvania, incluida Filadelfia, y la inclusión de Staten Island básicamente hacen que esta geometría sea inútil para mis propósitos.

Así que ahora mismo la consulta que estoy utilizando para recuperar estos polígonos es la siguiente (el ejemplo es FL):

SELECT ST_AsGeoJSON(ST_ConcaveHull(ST_Union(geom),.4)) as geom  FROM states WHERE id = 11;

tl;dr:

Si reduzco la tolerancia de 0,4 a algo así como 0,6, el estado sale como un triángulo gigante. 0,4 parece ser el límite inferior de ConcaveHull, cualquier cosa inferior a eso y las consultas se ejecutan durante más de 3 minutos sin devolver resultados.

He estado siguiendo este artículo para obtener consejos y pasos para aumentar el rendimiento de Postgres y PostGIS:

http://postgis.net/workshops/postgis-intro/tuning.html

Cambios que he hecho en postgresql.conf:

  • shared_buffers = 256MB
  • work_mem = 16MB
  • wal_buffers = 1MB
  • segmentos_de_control = 6
  • coste_de_página_aleatorio = 2,0

El servidor en el que se está ejecutando todo esto es un servidor LAPP Linux llave en mano que se ejecuta en una instancia de Amazon EC2 Medium M1 (64 bits, 1cpu, 3.75gb RAM)

¿Estoy haciendo todo mal? ¿Hay algún otro conjunto de estados CONUS "más suaves" que pueda utilizar? Tengo la teoría de que el tamaño relativo (léase: enorme) de las geometrías de los estados es lo que está atascando a PostGIS/Postgres... pero no estoy muy seguro de cómo diagnosticar o supervisar eso más allá de ejecutar

ps aux | grep ^ postgres

y ver el tiempo que tardan las consultas en ejecutarse.

Mis principales preguntas:

  1. ¿Cómo puedo controlar mejor el uso de recursos de este proceso?
  2. ¿Estoy utilizando las funciones correctas de PostGIS para lograr este objetivo?
  3. ¿Es cuestión de bajar la tolerancia de ConcaveHull, y aumentar los límites del sistema?

5voto

Mintx Puntos 2627

ST_Simplify ¡!

ST_SimplifyPreserveTopology, en particular, está pidiendo que se utilice en esta situación; reduciendo los datos de alta resolución o complejos a un nivel más manejable.

Puede que tenga que preprocesar estos datos primero calculando áreas y desechando pequeñas masas de tierra, pero luego utilice la función Simplificar con varias tolerancias hasta que encuentre una que le parezca correcta.

Es posible que ni siquiera necesite la función ConcaveHull, pero si lo hace, definitivamente se ejecutará más rápido en los datos simplificados.

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