2009-12-04 6 views
49

Tengo mapas detallados de los condados de EE. UU., A partir de los conjuntos de datos TIGER LINE. ¿Cómo podría muestrear, suavizar o degradar los datos para obtener formas más rectas, más cuadradas y menos "ruidosas" para representar las características geográficas, en este caso solo los límites del condado y las líneas estatales, pero tal vez también en el caso general?Cómo degradar o suavizar de forma inteligente los datos de GIS (simplificación de polígonos)?

El muestreo puede ocurrir en el tiempo de renderizado si eso se puede hacer de manera eficiente, o se puede generar y almacenar un conjunto de datos paralelo. Estoy usando PostGIS, y las líneas son multi-polilíneas generadas por shp2pgsql, pero cualquier solución en la que tome una línea ondulada y la reduzca a una línea más uniforme de aproximadamente el mismo significado para un intérprete humano sería muy útil.

Respuesta

29

El problema con simplemente tirar puntos es que puede distorsionar rápidamente la forma del polígono original. Un mejor enfoque es llegar desde la otra dirección; comience con una aproximación básica del polígono y luego refíncelo hacia arriba hacia su forma compleja.

Un excelente ejemplo de este enfoque es el Douglas-Puecker algorithm. Comienzas con dos vértices extraídos del polígono completo. Agregue un tercer vértice seleccionando el que se encuentra más alejado de un borde dibujado entre los dos primeros vértices. Continúa agregando puntos hasta que tengas algo que se parezca lo suficiente al polígono original.

8

Aquí 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, y eliminar .

Repita hasta que esté satisfecho.

58

Douglas-Peucker es definitivamente el enfoque correcto. Hay algunas formas simples de acceder a las implementaciones en PostGIS y QGIS que pensé que agregaría aquí para aquellos que encuentren esta publicación con una pregunta similar. El objetivo es comenzar con algo como esto:

alt text

y terminar con algo como esto:

alt text

En PostGIS Douglas-Peucker se implementa como simplify, la sintaxis y detallada here at bostongis.org, es una variante de:

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

Esto funcionó muy bien incluso en todo el conjunto de datos nacionales, con algunos errores que parecen deberse a datos subyacentes incorrectos. También resulta que en QGIS el elemento de menú Tools > Geometry Tools > Simplify Geometries exportará un shapefile simplificado de cualquier geometría y lo agregará como una capa a su proyecto actual.

Este es un conjunto de herramientas bastante fundamental y hice la pregunta en un nivel demasiado bajo, aunque fue bueno aprender las matemáticas subyacentes, hay una buena explicación de eso here: http://www.mappinghacks.com/code/PolyLineReduction/, junto con el código de muestra que resulta no ser demasiado necesario!

+5

Nice. ¿Hay alguna manera de hacerlo mientras se mantienen los bordes comunes con Otros polígonos? p.ej. países simplificados en Europa, con fronteras comunes. – naught101

+0

otras opciones de generalización de polígono con QGIS en [Cómo suavizar/generalizar un polígono en qgis] (http://gis.stackexchange.com/questions/25914/how-to-smooth-generalize-a-polygon-in-qgis) en el sitio de hermana GIS-SE. –

+2

genial, pero ¿cómo manejar múltiples polígonos cuando están uno al lado del otro? como cuando tienes formas de diferentes áreas de código postal? – Gerwald

7

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

17

En lugar de QGIS, se sugiere emplear ogr2ogr porque does not delete polygons!

ogr2ogr output.shp input.shp -simplify 0.0001 
+3

¿Las unidades simplifican las unidades de la proyección? Por ejemplo, tal vez esos son lat o grados largos? –

+0

Parece que las unidades son de hecho las unidades utilizadas para las coordenadas en el archivo. –

4

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

Cuestiones relacionadas