J'ai un fichier de formes contenant des arcs représentant le chemin parcouru par un camion d'épandage d'engrais sur une ferme.
Disons que je sais que la largeur d'épandage est de 30 m, c'est-à-dire que le camion peut épandre de l'engrais sur 15 m de chaque côté du véhicule.
Je veux générer un ensemble de polygones, qui montrent:
1) La superficie totale qui a reçu de l'engrais
2) Les zones de chevauchement, c'est-à-dire où deux passes distinctes étaient trop rapprochées, de sorte que certaines parties de la ferme ont reçu deux fois la «dose correcte» "d'engrais.
Une approche naïve consiste simplement à créer les polygones de couverture sous forme de tampons autour des arcs. Cela fonctionne dans le cas particulier où les lignes de propagation sont distinctes les unes des autres. Cependant, le camion pourrait éventuellement voyager autour de la ferme dans une spirale toujours décroissante, et un simple tampon ne montrerait pas les chevauchements où deux passages de la spirale étaient trop proches l'un de l'autre (si la spirale est un seul arc, je finirais avec un seul polygone sans parties superposées).
Si c'est pertinent, j'utilise le TatukGIS VCL DK, mais je recherche vraiment un algorithme plutôt qu'une solution spécifique.
Quelques clarifications en réponse à la discussion jusqu'à présent:
1) Je ne peux pas compter sur les données vectorielles ayant des métadonnées particulières (par exemple, les journaux GPS ou le taux de propagation). J'autorise l'utilisateur à choisir une couche et à spécifier une largeur de diffusion, puis le rapport s'exécute.
2) Le rapport a vraiment pour but de montrer à l'utilisateur à quel point le conducteur du véhicule était "qualifié", où "qualifié" signifie "atteint la couverture la plus élevée avec le plus faible chevauchement".
3) Je suis plus à l'aise dans les terrains vectoriels que dans les terrains matriciels, je préférerai donc les solutions vectorielles.
Merci,
Darren.
la source
Réponses:
La solution la plus simple est peut-être de diviser la géométrie unique en segments et de tamponner ces segments individuels: dans votre cas en spirale, vous tamponneriez chaque arc, puis couperiez les arcs individuels pour obtenir un compte. Veillez à éviter les faux chevauchements en ne tamponnant pas les extrémités des segments, uniquement à gauche et à droite des segments eux-mêmes.
Une autre approche consiste à superposer une grille polygonale sur les données, puis à l'intérieur de chaque cellule de la grille, tamponner séparément chaque segment de ligne se croisant. Pour être précis, vous voudriez prendre la cellule de la grille en cours d'analyse, la tamponner, puis collecter les segments qui se croisent et les tamponner, en effectuant votre analyse dans la fenêtre de cellule d'origine.
L'une ou l'autre de ces options devrait vous donner une estimation raisonnable du chevauchement, je peux penser à quelques approches plus précises, mais elles nécessiteraient de savoir quelque chose sur les données.
la source
Pas de solution, mais quelques entrées:
Ce problème semble similaire au problème de détection de coalescence de ligne dans la généralisation de cartes . Cela se produit lorsqu'un grand style est appliqué sur une ligne sinueuse (le symbole se chevauche automatiquement):
Ce document pp. 176 à 180 (en français ... désolé) donne des algorithmes pour détecter de telles parties auto-entrecroisées. Le principe est, comme proposé par scw , d'utiliser un seul tampon latéral de chaque segment composé d'un segment plus 0, 1 ou 2 arcs de cercle. JTS contient une implémentation de ce tampon simple côté qui peut être utile.
la source
Une solution vectorielle va manquer une variable potentiellement critique : le temps et, à travers elle, le taux de propagation. Lorsque le tracteur se déplace plus rapidement, moins d'engrais est répandu par unité de surface et lorsqu'il se déplace plus lentement (décélérant dans un virage et accélérant hors d'un), il épandra plus d'engrais par unité de surface. De plus, si le tracteur épand du matériau pendant le virage, le matériau sera plus concentré vers l'intérieur du virage et moins concentré vers l'extérieur.
Les données de temps seraient disponibles dans un enregistrement GPS de la progression du tracteur. Les pentes (distance parcourue divisée par le temps écoulé) estimeront les vitesses en chaque point. Alternativement, on pourrait (en tant qu'approximation) supposer une vitesse constante à l'intérieur d'un champ et une vitesse plus lente dans un tampon interne raisonnable de la limite du champ.
Une représentation raster peut gérer ces problèmes. Rastérisez la trajectoire du tracteur. Cela définit toutes les cellules non traversées par le tracteur sur des valeurs NoData (ou sur zéro). Si le tracteur devait se déplacer à une vitesse standard et constante, il suffirait de mettre une valeur constante dans chacune des cellules de données. Maintenant, par exemple, si le tracteur se déplaçait à deux fois cette vitesse, (vraisemblablement) son taux d'application serait divisé par deux, et cela peut être représenté en divisant par deux la valeur dans les cellules.
En général, la valeur à mettre dans n'importe quelle cellule est le taux d'application par unité de surface . Si le tracteur distribue uniformément x Kg d'engrais par seconde sur 15 m de chaque côté tout en se déplaçant à une vitesse de y m / sec, il épand de x / y Kg / sec / [m / sec] / (2 * 15 m) = x / (30 y ) Kg / m ^ 2 d'engrais. Ainsi, x / (30 y ) est la valeur à mettre dans chaque cellule. x est donné et y est calculé à partir des données GPS.
Les auto-intersections ne posent en principe aucun problème . Si le chemin du tracteur se croise, ajoutez les contributions chaque fois qu'il recroise une cellule. Cela peut nécessiter un traitement spécial pour ce faire, selon la façon dont la grille est créée et les capacités du logiciel SIG.
Après avoir fait cette préparation, le reste est rapide et facile: une somme focale de cette grille, en utilisant un voisinage circulaire avec un rayon de 15 m, trouve la quantité cumulée répartie par unité de surface dans chaque cellule.
la source
Je ne suis pas sûr à 100% du protocole StackExchange, donc je poste ceci comme une réponse à ma question. C'est la réponse que j'ai finalement utilisée de toute façon.
L'algorithme de base est le suivant:
1. Décomposer toute géométrie du calque en segments ne dépassant pas la moitié de la largeur de propagation.
2. Pour chaque segment:
- Créez un "tampon de défilement" en regardant en arrière le long de la forme et en tamponnant tous les segments précédents où la longueur cumulée de ces segments est inférieure à la largeur d'étalement (rayon du tampon = 1/2 largeur d'étalement)
- Créez un "tampon de segment suivant" uniquement du segment suivant (rayon du tampon = 1/2 largeur de propagation)
- Soustrayez le "tampon de roulement" du "tampon de segment suivant" pour obtenir le "nouveau tampon"
- joignez tous les "nouveau tampon" polygones ensemble pour obtenir un seul polygone par forme.
Essentiellement, cela permet au conducteur du véhicule épandeur de faire des virages à angle droit (ou plus larges) sans pénalité de chevauchement, mais s'ils reviennent trop brusquement pour se propager sur "l'ancien terrain", nous commençons à obtenir des chevauchements.
La spirale ressemble à ce que je veux:
la source