J'ai ce que j'espère être une question intéressante. Je travaille sur une mission pour une introduction au cours SIG qui utilise des données sur les déversements d'hydrocarbures dans le Golfe pour introduire des méthodes d'analyse spatiale communes basées sur des vecteurs (tampons, superpositions, etc.). J'ai une classe d'entités surfaciques qui contient les limites de la marée noire de Deepwater Horizon un jour donné, et je simule son expansion avec des tampons.
Il fait le travail pour illustrer le concept, mais ne fournit certainement pas de résultats réalistes. Cela m'a fait réfléchir à la façon dont cela pourrait être fait de manière à fournir des résultats moins uniformes, imitant / simulant l'effet des courants dirigeant l'huile dans diverses directions à mesure qu'elle se dilate.
Dans un sens général, je recherche un flux de travail qui accomplirait les tâches suivantes étant donné une entité polygone en entrée:
- Créer une nouvelle entité polygonale plus grande que l'original par une zone spécifiée (comme 10 km2) ou peut-être un facteur spécifié (comme 5%)
- La nouvelle entité polygonale aurait une forme arbitraire, avec la réserve que ...
- La nouvelle entité polygonale contiendrait l'entité polygonale d'origine (ce point n'est pas un facteur de rupture, mais ce serait bien d'avoir)
Toute solution du monde réel devrait impliquer la modélisation des courants océaniques, de la dynamique des fluides, etc., ce qui va bien au-delà de la portée de ce que j'essaie de faire (bien que des solutions incorporant cela soient certainement les bienvenues et seraient intéressantes à voir), mais l'idée a piqué ma curiosité au sujet du problème spatial sous-jacent et je suis curieux de savoir quelles solutions existent. J'ai une solution en tête, mais j'aimerais savoir quelles solutions les autres peuvent avoir.
Je travaille dans le monde ESRI, mais les solutions qui impliquent d'autres packages / plates-formes sont certainement les bienvenues (bien que je ne puisse pas les tester). Les algorithmes généraux, le pseudocode et le code sont également très bien.
Réponses:
Bonjour
Ici, je pense que c'est une façon amusante de le faire dans PostGIS. Je pense que cela pourrait être étendu afin que l'expansion suive une chaîne de caractères représentant le courant. Mais maintenant, il se développe dans une seule direction.
Il itère 50 fois et pour chaque itération prend le polygone de la dernière itération, le déplace, le met en tampon (le simplifie pour rendre les choses plus fluides) et l'unionne avec la coque convexe. Je pensais que le convexhull donnait un meilleur résultat que l'union.
Le résultat est donc 50 polygones de plus en plus gros. Chaque plus grand polygone chevauche totalement tous les petits polygones.
Pour voir le résultat, vous pouvez l'essayer sur http://postgisonline.org/map.php
Copiez simplement le code sql ci-dessous et cliquez sur "map1"
AVEC RECURSIVE t (the_geom, n) AS (SELECT 'POLYGON ((10 10,8 13, 10 15, 12 14, 15 15, 16 12, 15 10, 10 10))' :: geometry AS the_geom, 1 as n UNION ALL SELECT ST_Convexhull (ST_Collect (ST_Simplify (ST_Buffer (ST_Transscale (the_geom, 1.3, 2.7,1,1), 1), 0.1), the_geom)), n + 1 as n FROM t WHERE n <50) SELECT the_geom FROM t ;
Si vous voulez juste voir le polygone à partir de l'itération 30: vous pouvez ajouter la
limite 1 offset 30
entre le t et le point-virgule à la fin
la génération de ces 50 polygones utilise environ 50 ms, il devrait donc être possible d'étendre le modèle sans trop attendre.
Cordialement Nicklas
Celui-ci était encore plus agréable je pense:
AVEC RECURSIVE t (the_geom, n) AS (SELECT 'POLYGON ((10 10,8 13, 10 15, 12 14, 15 15, 16 12, 15 10, 10 10))' :: geometry AS the_geom, 1 as n UNION ALL SELECT st_convexhull (ST_collect (ST_Simplify (ST_Buffer (ST_Transscale (the_geom, 1.1 * n, 15,1,1), 0,2 * n), 0,1), the_geom)), n + 1 as n FROM t WHERE n <50) SELECT the_geom FROM t
simulant l'expansion en tournant à droite
la source
les mises en garde de whuber sont importantes, et tant que vous faites cela à des fins d'illustration uniquement et que vous ne voulez pas jouer avec la dynamique des fluides, ce qui est possible mais complique le problème.
Cela dit, je pense que c'est une question intéressante et pourrait être amusante pour les étudiants. Une autre façon d'appréhender le problème est de le considérer comme un phénomène à base de trame, avec la densité d'huile mesurée dans chaque cellule. À partir de là, vous pourriez utiliser un modèle qui prend en compte l'ansiotropie comme
r.spread
(la documentation ) pour modéliser le taux de croissance, en incluant peut-être des faux-courants pour «diriger» la propagation. De même, vous pouvez faire quelque chose avec différents types d' opérations focales dans ArcGIS, en utilisant des formes irrégulières pour contourner les problèmes de mise en mémoire tampon linéaire.la source
Je pense que je serais tenté d'obtenir des caractéristiques vectorielles qui représentent les courants et de les utiliser comme vecteurs de contrôle dans une opération de déformation. La clé serait de mettre à l'échelle les vecteurs correctement afin d'imiter la propagation d'un seul jour.
Je suis d'accord avec Andy W que la suppression de la frontière en points pourrait être une condition préalable. Vous devrez peut-être également densifier le nombre de points pour obtenir un résultat précis.
Je ne sais pas comment vous vous déformez dans le monde ESRI, je le crains. Je sais que l'extension Data Interop le ferait, mais je suppose qu'il doit également y avoir une méthode intégrée ou une extension spécifiquement pour ce genre de chose.
la source
Je ne serais pas surpris si quelqu'un a réellement fait des simulations similaires, mais voici comment je pense que j'aborderais le projet (n'ayant aucune connaissance préalable des processus océaniques qui diffusent la marée noire).
Si vous voulez travailler strictement avec des polygones, je découperais votre frontière en un nombre prédéterminé de points. En utilisant ces points, je présenterais vos simulations, avec des éléments stochastiques en ce qui concerne la direction d'expansion et la distance d'expansion (dans des limites raisonnables prédéterminées), répétez ces étapes autant de fois que nécessaire. Ensuite, refaites la coque convexe de tous les points en fonction des nouveaux emplacements (si vous voulez que cela inclue toujours le polygone précédent, vous devrez limiter l'expansion vers l'extérieur). Pour un cours d'introduction au SIG, je ne ferais probablement que visualiser plusieurs itérations différentes possibles compte tenu de ces éléments stochastiques.
Aussi une approche un peu différente, je pense que visualiser l'huile en tant qu'agents dans une simulation pourrait être assez cool. Par exemple, pour chaque baril de pétrole brut déversé, créez un nouvel agent, puis ajoutez les mêmes éléments stochastiques que je l'ai dit précédemment. Vous pouvez soit visualiser l'expansion des agents dans le Golfe dans le temps, soit visualiser la densité du pétrole dans le temps.
Cela ressemble à un projet vraiment cool et postez des photos lorsque vous avez terminé.
la source
Juste pour illustrer la variété des résultats qu'une question comme celle-ci peut générer, je vais aborder la solution que je réfléchissais lorsque j'ai posté la question. J'espère avoir une chance de l'implémenter dans les prochains jours, et le posterai quand je le ferai.
Ce n'est probablement pas le moyen le plus efficace de le faire, mais cela devrait fonctionner. L'idée est basée sur un exercice de modélisation de la croissance urbaine effectué par une classe d'âge supérieur. Leur raster aléatoire est créé en fonction de leur aptitude à la croissance, et ils n'ont pas de limites de zone, mais la partie de croissance aléatoire est essentiellement la même.
la source