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
fuente
Respuestas:
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.
fuente
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):
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.
fuente
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.
fuente
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.
Espiral parece que quiero que:
fuente