Poligoni attraverso la linea dati internazionale [-180 .. + 180 longitudine]


10

Sto cercando di generare poligoni per andane orbitali satellitari. Finora ho un metodo per generare due linee che rappresentano il bordo di ciascuna andana in [lat, long]. Alcuni degli swath attraversano la linea di dati internazionale e si avvolgono così:

avvolgere l'andana

Sono stato in grado di risolverlo con ogr2ogr -wrapdateline:

ogr2ogr -wrapdateline  -f "ESRI Shapefile" test.shp orbits.shp

Che probabilmente divide le linee probabilmente

Ora voglio essere in grado di generare poligoni all'interno di entrambe le linee. Ad esempio, nel caso in cui un bordo dell'andana attraversi la linea di dati, riempie un poligono quando emerge dall'altro lato, come:

riempire

Ho bisogno di un metodo automatizzato in quanto devo ripetere molto il compito. Preferibilmente in Python poiché è così che ho generato le linee. Ecco i due shapefile che contengono le linee: avvolgente ; datelinefixed


Per ulteriori idee, consultare i thread correlati su gis.stackexchange.com/questions/429 e gis.stackexchange.com/questions/18562 . Concepibilmente, anche le idee presentate in gis.stackexchange.com/questions/17788 potrebbero essere utili. Mi chiedo, tuttavia, cosa intendi per "interno": questi poligoni non sono ben definiti, quindi come minimo è necessario fornire informazioni per indicare (a) quale lato di ciascuna polilinea è considerato "interno" e (b) come per tagliarli vicino ai poli.
whuber

Risposte:


3

È possibile costruire una proiezione di mercatore personalizzata centrata approssimativamente al centro dell'andana. Ad esempio, utilizzare per swath 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

In questa proiezione, l'andana non è interrotta dalla linea dati. Puoi creare il poligono dalla linea.

inserisci qui la descrizione dell'immagine

Quindi creare un poligono tagliato tra -179,95 ° E e 179,95 ° E in EPSG: 4326:

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

Riproiettalo anche sul tuo CRS personalizzato e sottralo dal poligono dell'andana.

Dopo la riproiezione su EPSG: 4326, l'andana è correttamente divisa per la linea dati:

inserisci qui la descrizione dell'immagine

Continua con tutte le strisce che attraversano la linea di dati.


1

Riscriverei il processo di generazione della linea swathe per iniziare e finire nello stesso spazio longintudinale continuo. vale a dire se una linea iniziata a 170 ° e termina a -170 ° riscriverei il processo per finire a 190 ° invece di avvolgerlo a -180.180

Quindi puoi creare poligoni ininterrotti tra le tue linee.

Quindi utilizzare un processo a clip per dividere i poligoni sulla linea 180, -180 e spostare tutte le parti che si trovano al di fuori dello spazio -180.180 aggiungendo o sottraendo 360 ° a seconda dei casi.

Basta fare tutto prima di salvarlo con una particolare proiezione / dato


0

Grazie a @AndreJ per questa idea, l'utilizzo dell'API Django GEOS qui è una soluzione semplice che evita la necessità di riproiettare qualsiasi cosa:

1) Crea un MultiPolygon che confina con la linea di dati:

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) Se la geometria offensiva si interseca, restituisci la differenza:

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

Il risultato è mostrato come segue:

Prima

Dopo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.