Pregunta

He detallado mapas del condado de los Estados Unidos, a partir de los href="http://www.census.gov/geo/www/tiger/" rel="noreferrer"> línea del tigre conjuntos de datos

El muestreo podría suceder en el tiempo de procesamiento si que se puede hacer de manera eficiente, o un conjunto de datos en paralelo se puede generada y almacenada. Estoy utilizando PostGIS , y las líneas son multi-polilíneas generados por shp2pgsql - pero cualquier solución en la que se toma una línea serpenteante y reducirla a una línea más suave de más o menos la misma importancia a un intérprete humano sería muy útil.

¿Fue útil?

Solución

El problema con simplemente tirar puntos es que se puede deformar rápidamente la forma del polígono originales. Un mejor enfoque consiste en llegar a ella desde la otra dirección; comenzar con una aproximación básica del polígono y luego refinarlo hacia arriba, hacia su forma compleja.

Un ejemplo excelente de este enfoque es la Douglas-Puecker algoritmo . Se comienza con dos vértices extraídos del polígono completo. Añadir un tercer vértice mediante la selección de la que se encuentra más alejada de un borde trazada entre los dos primeros vértices. Continuar añadiendo puntos hasta que haya algo que se parezca a su polígono suficientemente originales.

Otros consejos

Douglas-Peucker es definitivamente el enfoque correcto. Hay algunas maneras sencillas para acceder a las implementaciones de la misma en PostGIS QGIS y que pensé que iba a añadir aquí para aquellos que vienen con este post con una pregunta similar. El objetivo es comenzar con algo como esto:

text alt

y terminar con algo como esto:

text alt

En PostGIS Douglas-Peucker se implementa como simplify, la sintaxis, detallada rel="noreferrer"> , es una variante de:

SELECT transform(simplify(transform(the_geom, 2249), 500),4326) from the_geo_table

Esto funcionó muy bien, incluso en el conjunto de datos nacional total, con algunos pocos errores que parecen debido a los malos datos subyacentes. También resulta que en QGIS la Tools > Geometry Tools > Simplify Geometries elemento de menú exportará un archivo de forma simplificada de cualquier geometría y añadirlo como una capa a su proyecto actual.

Este es un muy fundamental set de herramientas y me hizo la pregunta a un nivel demasiado bajo, aunque era agradable para aprender la matemática subyacente, hay una buena explicación de que aquí: http://www.mappinghacks.com/code/PolyLineReduction/ , junto con el código de ejemplo que resulta no ser demasiado necesaria

En lugar de QGIS, se sugiere emplear ogr2ogr porque no elimina los polígonos !

ogr2ogr output.shp input.shp -simplify 0.0001

Esto es un simple algoritmo de suavizado iterativo:

por cada tres puntos secuenciales en cualquier ruta, si el punto medio no tiene intersecciones y está dentro de un pequeño ángulo de umbral de la trayectoria directa entre los dos puntos exteriores, eliminarlo.

Repetir hasta que esté satisfecho.

También puede probar el algoritmo de Visvalingam, que elimina de forma iterativa la parte menos perceptible de una línea. Aquí hay una gran explicación de ese algoritmo:

También es posible usar Simplify.js que utiliza una combinación de Douglas-Peucker y algoritmos distancia radial. También hay enlaces a muchos puertos a otros idiomas que aparecen en la github proyecto

Respuesta por @unmounted es correcta, pero me gustaría añadir una sugerencia más.

Siempre use la función ST_SimplifyPreserveTopology en lugar de ST_Simplify en PostGIS. Ambos utilizan el mismo algoritmo subyacente (Douglas-Peucker), pero el primero evita cualquier simplificaciones que resultarían en geometrías no válidos. Por ejemplo, ST_Simplify puede resultar en la geometría que se cruza a sí mismo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top