Estoy interesado en examinar el ancho promedio de un polígono que representa la superficie de la carretera. También tengo la línea central de la carretera como un vector (que a veces no está exactamente en el centro). En este ejemplo, la línea central de la carretera está en rojo y el polígono es azul:
Un enfoque de fuerza bruta en el que he pensado es amortiguar la línea en pequeños incrementos, intersecar el amortiguador con una rejilla de rejilla, intersecar el polígono de la carretera con una rejilla de rejilla, calcular el área intersectada para ambas medidas de intersección y seguir haciendo esto hasta El error es pequeño. Sin embargo, este es un enfoque burdo, y me pregunto si hay una solución más elegante. Además, esto ocultaría el ancho de una carretera grande y una carretera pequeña.
Estoy interesado en una solución que use ArcGIS 10, PostGIS 2.0 o QGIS. He visto esta pregunta y descargué la herramienta de Dan Patterson para ArcGIS10, pero no pude calcular lo que quiero con ella.
Acabo de descubrir la herramienta de geometría de límite mínimo en ArcGIS 10 que me permite producir los siguientes polígonos verdes:
Esto parece una buena solución para carreteras que siguen una cuadrícula, pero no funcionaría de otra manera, por lo que todavía estoy interesado en otras sugerencias.
Respuestas:
Parte del problema es encontrar una definición adecuada de "ancho promedio". Varios son naturales pero diferirán, al menos ligeramente. Para simplificar, considere las definiciones basadas en propiedades que son fáciles de calcular (lo que va a descartar aquellas basadas en la transformación del eje medial o secuencias de buffers, por ejemplo).
Como ejemplo, considere que la intuición arquetípica de un polígono con un "ancho" definido es un pequeño amortiguador (digamos de radio r con extremos cuadrados) alrededor de una polilínea larga y bastante recta (digamos de longitud L ). Pensamos en 2r = w como su ancho. Así:
Su perímetro P es aproximadamente igual a 2L + 2w;
Su área A es aproximadamente igual a w L.
El ancho wy la longitud L pueden recuperarse como raíces de la cuadrática x ^ 2 - (P / 2) x + A; en particular, podemos estimar
Cuando esté seguro de que el polígono es realmente largo y delgado, como una aproximación adicional , puede tomar 2L + 2w para igualar 2L, de donde
El error relativo en esta aproximación es proporcional a w / L: cuanto más delgado sea el polígono, cuanto más cerca esté w / L de cero, y mejor será la aproximación.
Este enfoque no solo es extremadamente simple (solo divide el área por el perímetro y multiplica por 2), con cualquiera de las fórmulas, no importa cómo esté orientado el polígono o dónde está situado (porque tales movimientos euclidianos no cambian ni el área ni el área). perímetro).
Puede considerar usar cualquiera de estas fórmulas para estimar el ancho promedio de cualquier polígono que represente segmentos de calles. El error que comete en la estimación original de w (con la fórmula cuadrática) se produce porque el área A también incluye pequeñas cuñas en cada curva de la polilínea original. Si la suma de los ángulos de curvatura es t radianes (esta es la curvatura absoluta total de la polilínea), entonces realmente
P = 2L + 2w + 2 Pi tw y
A = L w + Pi tw ^ 2.
Conéctelos a la solución anterior (fórmula cuadrática) y simplifique. Cuando se despeja el humo, ¡la contribución del término de curvatura t ha desaparecido! Lo que originalmente parecía una aproximación es perfectamente preciso para los búferes de polilínea que no se cruzan entre sí (con extremos cuadrados). Para polígonos de ancho variable, esta es, por lo tanto, una definición razonable de ancho promedio.
fuente
Aquí muestro poca optimización sobre la solución @whuber, y estoy poniendo en términos de "ancho de búfer", porque es útil para integrar la solución de un problema más general: ¿Hay una función inversa st_buffer, que devuelve una estimación de ancho?
Para este problema, la pregunta acerca @celenius ancho de la calle ,
sw
la solución esdonde
sw
está el "ancho promedio",g1
la línea central deg2
, y la calleg2
es un POLÍGONO . Utilicé solo la biblioteca estándar OGC, probé con PostGIS y resolví otras aplicaciones prácticas serias con la misma función buffer_width.DEMOSTRACIÓN
A2
es el área deg2
,L1
la longitud de la línea central (g1
) deg2
.Suponiendo que podemos generar
g2
porg2=ST_Buffer(g1,w)
, y queg1
es una recta, también log2
es un rectángulo con longitudL1
y ancho2*w
, yNo es la misma fórmula de @whuber, porque aquí
w
hay una mitad delg2
ancho del rectángulo ( ). Es un buen estimador, pero como podemos ver en las pruebas (a continuación), no es exacto, y la función lo usa como una pista, para reducir elg2
área y como un estimador final.Aquí no evaluamos buffers con "endcap = square" o "endcap = round", que necesitan una suma
A2
de un área de un buffer de puntos con el mismow
.REFERENCIAS: en un foro similar de 2005 , W. Huber explica soluciones similares y otras.
PRUEBAS Y RAZONES
Para líneas rectas, los resultados, como se esperaba, son exactos. Pero para otras geometrías, los resultados pueden ser decepcionantes. La razón principal es, quizás, que todo el modelo es para rectángulos exactos, o para geometrías que se pueden aproximar a un "rectángulo de franja". Aquí un "kit de prueba" para verificar los límites de esta aproximación (ver
wfactor
en los resultados anteriores).RESULTADOS
CON RECTÁNGULOS (la línea central es una LÍNEA RECTA):
CON OTRAS GEOMETRÍAS (línea central doblada):
Acerca de
btype
ver la guía ST_Buffer , con buenas ilustraciones y los LINESTRING utilizados aquí.CONCLUSIONES :
w_estim
siempre es mejor quew_near
;g2
geometrías "cercanas a rectangulares" , está bien, cualquierwfactor
wfactor=~0.01
para 1% de error enw_estim
. Hasta este factor de factor, use otro estimador.Precaución y prevención
¿Por qué ocurre el error de estimación? Cuando se utiliza
ST_Buffer(g,w)
, se espera, por el "modelo de tira rectangular", que la nueva área añadida por el buffer de anchow
se trataw*ST_Length(g)
ow*ST_Perimeter(g)
... Cuando no está, por lo general por enchapados (ver líneas cruzadas) o por "labrar", es cuando La estimación de law
falla promedio . Este es el mensaje principal de las pruebas.Para detectar este problema en cualquier rey del búfer , verifique el comportamiento de la generación del búfer:
RESULTADOS
fuente
Si puede unir los datos de su polígono a los datos de su línea central (ya sea espacial o tabular), simplemente sume las áreas de polígono para cada alineación de la línea central y divida por la longitud de la línea central.
fuente
Desarrollé una fórmula para el ancho promedio de un polígono y la puse en una función Python / ArcPy. Mi fórmula se deriva de (pero se extiende sustancialmente) la noción más directa de ancho promedio que he visto discutido en otra parte; es decir, el diámetro de un círculo que tiene la misma área que su polígono. Sin embargo, en la pregunta anterior y en mi proyecto, estaba más interesado en el ancho del eje más estrecho. Además, estaba interesado en el ancho promedio para formas potencialmente complejas, no convexas.
Mi solución fue:
Es decir:
La función es:
Aquí hay un mapa exportado con el ancho promedio (y algunos otros atributos de geometría para referencia) en una variedad de formas usando la función de arriba:
fuente
area / perimeter * 4
.Otra solución con eje medial aproximado:
El resultado seguramente será incorrecto para aquellos polígonos donde el eje medial aproximado no es una sola línea continua, por lo que puede verificarlo antes del paso 1 y regresar
NULL
o algo así.Aquí hay un ejemplo de la función PostgreSQL (nota: necesita instalar extensiones postgis y postgis_sfcgal ):
Desventaja:
Esta solución no funcionará con casos en los que el polígono es casi rectangular y el ser humano puede definir intuitivamente su longitud, pero el eje medial aproximado tiene pequeñas ramas cerca del borde y, por lo tanto, el algoritmo devuelve Ninguno.
Ejemplo:
fuente