Polygones sur la ligne de temps internationale [-180 .. + 180 longitude]

10

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:

envelopper l'andain

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:

remplir

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

James
la source
Pour des idées supplémentaires, voir les discussions connexes sur gis.stackexchange.com/questions/429 et gis.stackexchange.com/questions/18562 . Les idées présentées dans gis.stackexchange.com/questions/17788 pourraient également être utiles. Je me demande, cependant, ce que vous entendez par "intérieur": ces polygones ne sont pas bien définis, donc au minimum vous devez fournir des informations pour indiquer (a) quel côté de chaque polyligne est considéré comme "intérieur" et (b) comment pour les couper près des pôles.
whuber

Réponses:

3

Vous pouvez créer une projection Mercator personnalisée centrée approximativement au centre de l'andain. Par exemple, utilisez pour l'andain 25:

+proj=merc +lon_0=-140 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs

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.

entrez la description de l'image ici

Créez ensuite un polygone coupé entre -179,95 ° E et 179,95 ° E dans EPSG: 4326:

Nr;WKT
1;POLYGON ((-179.95 89, 179.95 89, 179.95 -89, -179.95 -89, -179.95 89))

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:

entrez la description de l'image ici

Continuez avec tous les andains qui traversent la ligne de données.

AndreJ
la source
1

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

Mr Purple
la source
0

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:

from django.contrib.gis.geos.collections import MultiPolygon, LinearRing, Polygon
box1 = ((180.0, 89), (179.95, 89), (179.95, -89), (180.0, -89), (180.0, 89))
box2 = ((-180.0, 89), (-179.95, 89), (-179.95, -89), (-180.0, -89), (-180.0, 89))
poly1 = Polygon(LinearRing(box1))
poly2 = Polygon(LinearRing(box2))
poly = MultiPolygon(poly1, poly2)

2) Si la géométrie incriminée se recoupe, renvoyez la différence:

from django.contrib.gis.geos.geometry import GEOSGeometry
geometry = GEOSGeometry(WKT)  # WKT is your polygon in WKT string format
if geometry.intersects(poly):
    print("Geometry crosses dateline... splitting")
    geometry = geometry.difference(poly) # clip with dateline polygon

Le résultat est affiché comme suit:

Avant

Après

MarMat
la source