J'essaie de générer des polygones pour des andains orbitaux satellites. Jusqu'à présent, j'ai une méthode pour générer deux lignes qui représentent le bord de chaque bande en [lat, long]. Certains des andains traversent la ligne de données internationale et s'enroulent donc:
J'ai pu résoudre ce problème avec ogr2ogr
-wrapdateline
:
ogr2ogr -wrapdateline -f "ESRI Shapefile" test.shp orbits.shp
Ce qui divise probablement les lignes
Je veux maintenant pouvoir générer des polygones à l'intérieur des deux lignes. Ainsi, par exemple, dans le cas où un bord de l'andain traverse la ligne de temps, un polygone se remplit lorsqu'il émerge de l'autre côté, comme:
J'ai besoin d'une méthode automatisée car j'ai souvent besoin de répéter la tâche. De préférence en python car c'est ainsi que j'ai généré les lignes. Voici les deux fichiers de formes contenant les lignes: wraparound ; datelinefixed
Réponses:
Vous pouvez créer une projection Mercator personnalisée centrée approximativement au centre de l'andain. Par exemple, utilisez pour l'andain 25:
Dans cette projection, l'andain n'est pas rompu par la ligne de données. Vous pouvez créer le polygone à partir de la ligne.
Créez ensuite un polygone coupé entre -179,95 ° E et 179,95 ° E dans EPSG: 4326:
Reprojetez-le également sur votre CRS personnalisé et soustrayez-le du polygone d'andain.
Après reprojection en EPSG: 4326, l'andain est correctement divisé par la ligne de données:
Continuez avec tous les andains qui traversent la ligne de données.
la source
Je réécrirais le processus de génération de la ligne swathe pour commencer et terminer dans le même espace long et continu. c'est-à-dire que si une ligne commençait à 170 ° et se terminait à -170 °, je réécrirais le processus pour finir à 190 ° à la place sans boucler à -180,180
Ensuite, vous pouvez créer des polygones ininterrompus entre vos lignes.
Utilisez ensuite un processus d'écrêtage pour diviser les polygones sur la ligne 180, -180 et décaler toutes les parties qui se trouvent en dehors de l'espace -180 180 en ajoutant ou en soustrayant 360 ° selon le cas.
Il suffit de tout faire avant de l'enregistrer avec une projection / donnée particulière
la source
Merci à @AndreJ pour cette idée, utiliser Django GEOS API est une solution simple qui évite d'avoir à re-projeter quoi que ce soit:
1) Créez un MultiPolygon qui borde la ligne de données:
2) Si la géométrie incriminée se recoupe, renvoyez la différence:
Le résultat est affiché comme suit:
la source