Algoritmo para calcular la cobertura + superposiciones de un conjunto de arcos


10

Tengo un archivo de formas que contiene arcos que representan el camino recorrido por un camión que esparce fertilizante en una granja.

Digamos que sé que el ancho de propagación es de 30 m, es decir, el camión puede esparcir fertilizante 15 m a cada lado del vehículo.

Quiero generar un conjunto de polígonos, que muestren:
1) El área total que recibió fertilizante
2) Las áreas de superposición, es decir, donde dos pases separados estaban demasiado juntos, de modo que algunas partes de la granja recibieron el doble de la "dosis correcta" "de fertilizante.

Un enfoque ingenuo es simplemente crear los polígonos de cobertura como amortiguadores alrededor de los arcos. Esto funciona en el caso especial donde las líneas de propagación son distintas entre sí. Sin embargo, el camión podría viajar alrededor de la granja en una espiral en constante disminución, y un simple amortiguador no podría mostrar superposiciones donde dos pasos de la espiral estuvieran demasiado juntos (si la espiral es un solo arco, terminaría con un solo polígono sin partes superpuestas).

Si es relevante, estoy usando TatukGIS VCL DK, pero realmente estoy buscando un algoritmo en lugar de una solución específica.

Algunas aclaraciones en respuesta a la discusión hasta ahora:

1) No puedo confiar en que los datos vectoriales tengan metadatos particulares (por ejemplo, registros de GPS o velocidad de propagación). Permito que el usuario elija una capa y especifique un ancho extendido, luego se ejecuta el informe.

2) El propósito del informe es realmente mostrar al usuario cuán "experto" era el operador del vehículo, donde "experto" significa "logró la mayor cobertura con la superposición más baja".

3) Me siento más cómodo en la tierra de vectores que en la tierra de trama, por lo que preferiré soluciones basadas en vectores.

Gracias,

Darren


1
Me pregunto si esto sería similar a los métodos que predicen la precipitación acumulativa en función de los caminos de tormenta pronosticados.
Kirk Kuykendall

Respuestas:


3

Quizás la solución más simple es dividir la geometría individual en segmentos, y amortiguar esos segmentos individuales: en su caso en espiral, amortiguaría cada arco, luego intersecaría los arcos individuales para obtener un conteo. Tenga cuidado de evitar falsas superposiciones al no almacenar en búfer los extremos de los segmentos, solo a la izquierda y derecha de los segmentos.

Otro enfoque consiste en superponer una cuadrícula de polígonos en los datos y, luego, dentro de cada celda de la cuadrícula, amortiguar cada segmento de línea de intersección por separado. Para ser precisos en esto, querrá tomar la celda de la cuadrícula bajo análisis, almacenarla en un búfer, luego recopilar los segmentos que se intersectan y almacenarlos en el búfer, realizando su análisis dentro de la ventana de la celda original.

Cualquiera de estas opciones debería darle una estimación razonable de superposición, puedo pensar en algunos enfoques más precisos, pero requerirían saber algo sobre los datos.


Gracias. Estaba pensando en la línea de su primera sugerencia: dividir la geometría en segmentos y amortiguarlos. Creo que también necesitaré amortiguar los extremos de los segmentos, de modo que obtenga bordes redondeados en las esquinas. Pensando en el caso en que empiezo con una línea de ángulo recto: si no amortiguo los extremos, terminaré con dos rectángulos superpuestos a los que les falta un cuadrado en el exterior de la esquina (¡difícil de expresar como texto!)
dbruning

Creo que también necesitaré amortiguar los extremos de los segmentos, de modo que obtenga bordes redondeados en las esquinas. Estaba pensando además en intersectar el búfer de cada segmento con el búfer del segmento anterior y luego acumular solo las partes "nuevas" de cada búfer en un búfer maestro. La idea es ignorar las superposiciones con el segmento anterior, pero la recolección se superpone con los segmentos más antiguos.
dbruning

2

No hay solución, pero algunas entradas:

Este problema parece similar al problema de detección de coalescencia de línea en la generalización de mapas . Ocurre cuando se aplica un estilo grande en una línea sinuosa (el símbolo se superpone):

ingrese la descripción de la imagen aquí

Este documento pp. 176 a 180 (en francés ... lo siento) ofrece algoritmos para detectar tales partes auto intersectantes. El principio es, según lo propuesto por scw , usar un búfer lateral único de cada segmento compuesto por un segmento más 0, 1 o 2 arcos circulares. JTS contiene una implementación de este búfer de un solo lado que puede ser útil.


¿Por qué le preocupa detectar las auto intersecciones? ¿Y por qué propones amortiguadores de "un solo lado"? Ninguno de los dos parece estar relacionado con el problema.
whuber

El propósito es detectar dónde el camión esparce fertilizante varias veces, es decir, donde el área de esparcimiento se cruza por sí misma.
julien

2

Una solución vectorial perderá una variable potencialmente crítica : el tiempo y, a través de él, la tasa de difusión. Cuando el tractor se mueve más rápido, se esparce menos fertilizante por unidad de área y cuando se mueve más lento (desacelerando en un giro y acelerando fuera de uno) se esparcirá más fertilizante por área de unidad. Además, si el tractor está esparciendo material mientras gira, el material estará más concentrado hacia el interior del giro y menos concentrado hacia el exterior.

Los datos de tiempo estarían disponibles en un registro GPS del progreso del tractor. Las pendientes (distancia recorrida dividida por el tiempo transcurrido) estimarán las velocidades en cada punto. Alternativamente, uno podría (como una aproximación) asumir una velocidad constante dentro del interior de un campo y una velocidad más lenta dentro de un búfer interno razonable del límite del campo.

Una representación ráster puede manejar estos problemas. Rasteriza el camino del tractor. Esto establece todas las celdas no cruzadas por el tractor en valores NoData (o en cero). Si el tractor se moviera a una velocidad estándar constante, sería suficiente poner un valor constante en cada una de las celdas de datos. Ahora, por ejemplo, si el tractor se moviera al doble de esta velocidad, (presumiblemente) su tasa de aplicación se reduciría a la mitad, y esto puede representarse reduciendo a la mitad el valor en las celdas.

En general, el valor para poner en cualquier celda es la tasa de aplicación por unidad de área . Si el tractor esparce uniformemente x Kg de fertilizante por segundo a 15 m en cada lado mientras viaja a una velocidad de y m / seg, entonces está esparciendo x / y Kg / seg / [m / seg] / (2 * 15 m) = x / (30 y ) Kg / m ^ 2 de fertilizante. Por lo tanto, x / (30 y ) es el valor para poner en cada celda. x se da e y se calcula a partir de los datos del GPS.

Las auto intersecciones no son un problema en principio. Si el camino del tractor se cruza, agregue las contribuciones cada vez que cruza una celda. Puede requerir un procesamiento especial para lograr esto, dependiendo de cómo se está creando la cuadrícula y de las capacidades del software SIG.

Una vez realizada esa preparación, el resto es rápido y fácil: una suma focal de esta cuadrícula, utilizando un vecindario circular con un radio de 15 m, encuentra la cantidad acumulada dispersa por unidad de área en cada celda.


1
Parece que si tuviera una herramienta que permitiera que un núcleo (que representa el tractor) se mueva a lo largo de una ruta (en lugar de a lo largo de cada fila), este problema sería más manejable.
Kirk Kuykendall

@Kirk No hay necesidad de seguir una ruta o filas o lo que sea con un núcleo. Es importante apreciar el cambio en el punto de vista que acompaña a una suma focal: en lugar de considerar el problema como una forma de difundir material desde una ruta de puntos, míralo como una manera de calcular cuánto material se acumula en cada punto del campo . Obviamente es el mismo problema con la misma solución. El enfoque de kernel móvil (y los enfoques de buffering propuestos) toman el primer punto de vista; la suma focal, la segunda. Pero la herramienta de suma focal está disponible; un cálculo de kernel en movimiento no lo es.
whuber

Creo que el enfoque de trama que delinees sería el mejor método si supiéramos la velocidad y la tasa de propagación. Lamentablemente, en este escenario en particular, tampoco lo sabemos. Nuestro usuario final puede elegir cualquier capa como entrada para este informe de cobertura, y no podemos confiar en que la geometría tenga metadatos particulares.
dbruning

@dbruning Este enfoque no parece requerir velocidades conocidas de velocidad / propagación; solo los permite (+ el modelo de realidad más preciso) si los tiene. Sin embargo, también requerirá un cierto umbral de celdas + conteo para obtener las métricas que desea (cobertura de área total; área de superposición) fuera del sistema, y ​​también hay compensaciones de precisión mezcladas allí.
Dan S.

@dbruning Si no conoce la tasa de diferencial, obtendrá una tasa de diferencial relativa. Si no conoce la velocidad, todavía sabe (o debería saber) cómo manejan los tractores las personas y debería poder obtener estimaciones razonables de las velocidades relativas. Si asume velocidades constantes y tasas de propagación constantes, obtendrá respuestas razonables; estarán de acuerdo con las respuestas basadas en el búfer en porciones rectas de las rutas del tractor; y es probable que sean más realistas en las porciones curvas.
whuber

2

No estoy 100% seguro del protocolo StackExchange, así que publico esto como respuesta a mi pregunta. Es la respuesta que terminé usando de todos modos.

El algoritmo básico es:
1. Divida cualquier geometría de la capa en segmentos que no superen la mitad del ancho de propagación.
2. Para cada segmento:
- Cree un "búfer rodante" mirando hacia atrás a lo largo de la forma, y ​​almacenando en búfer todos los segmentos anteriores donde la longitud acumulativa de esos segmentos es menor que el ancho de propagación (radio del búfer = 1/2 ancho de dispersión)
- Crear un "búfer de segmento siguiente" de solo el siguiente segmento (radio del búfer = 1/2 ancho de extensión)
- Reste el "búfer rodante" del "búfer del siguiente segmento" para obtener "nuevo búfer"
- unir todos los "búfer nuevo" polígonos juntos para obtener un solo polígono por forma.

Esencialmente, esto permite que el conductor del vehículo esparcidor gire en ángulo recto (o más ancho) sin penalización por solapamiento, pero si retrocede demasiado bruscamente de modo que se extienda sobre "terreno viejo", comenzamos a solaparnos.

Superposiciones en azul

Espiral parece que quiero que:

espiral

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.