Polígonos a través de la fecha internacional [-180 .. + 180 longitud]

10

Estoy tratando de generar polígonos para franjas orbitales satelitales. Hasta ahora tengo un método para generar dos líneas que representan el borde de cada franja en [lat, long]. Algunas de las hileras cruzan la fecha internacional y así se envuelven:

franja envolver

Pude resolver esto con ogr2ogr -wrapdateline:

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

Lo que probablemente divide las líneas

Ahora quiero poder generar polígonos en el interior de ambas líneas. Entonces, por ejemplo, en el caso en que un borde de la franja cruza la línea de fecha, un polígono se llena cuando emerge en el otro lado, como:

llenar

Necesito un método que esté automatizado ya que necesito repetir la tarea mucho. Preferiblemente en Python, ya que así es como he generado las líneas. Aquí están los dos archivos de forma que contienen las líneas: envolvente ; fecha fijada

James
fuente
Para obtener ideas adicionales, consulte los hilos relacionados en gis.stackexchange.com/questions/429 y gis.stackexchange.com/questions/18562 . Posiblemente las ideas presentadas en gis.stackexchange.com/questions/17788 también podrían ser útiles. Sin embargo, me pregunto qué quiere decir con "interior": estos polígonos no están bien definidos, por lo que, como mínimo, debe proporcionar información para indicar (a) qué lado de cada polilínea se considera "interior" y (b) cómo para cortarlos cerca de los polos.
whuber

Respuestas:

3

Puede crear una proyección de mercator personalizada centrada aproximadamente en el centro de la franja. Por ejemplo, use para la franja 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

En esta proyección, la franja no se rompe por la línea de fecha. Puede crear el polígono desde la línea.

ingrese la descripción de la imagen aquí

Luego cree un polígono cortado entre -179.95 ° E y 179.95 ° E en EPSG: 4326:

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

Vuelva a proyectarlo también en su CRS personalizado y restelo del polígono de franja.

Después de volver a proyectar a EPSG: 4326, la franja se divide correctamente por la línea de fecha:

ingrese la descripción de la imagen aquí

Continúe con todas las franjas que cruzan la línea de fecha.

AndreJ
fuente
1

Reescribiría el proceso de generación de líneas de banda para comenzar y terminar en el mismo espacio continuo largo interno. es decir, si una línea comenzara a 170 ° y terminara a -170 °, reescribiría el proceso para terminar a 190 ° sin ajustar a -180,180

Entonces puedes hacer polígonos ininterrumpidos entre tus líneas.

Luego, use un proceso de recorte para dividir los polígonos en la línea 180, -180 y desplazar las partes que se encuentran fuera del espacio -180,180 sumando o restando 360 ° según corresponda.

Simplemente haga todo antes de guardarlo con una proyección / dato particular

Señor púrpura
fuente
0

Gracias a @AndreJ por esta idea, el uso de Django GEOS API aquí es una solución simple que evita tener que volver a proyectar nada:

1) Cree un MultiPolygon que bordee la línea de fecha:

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 geometría ofensiva se cruza, devuelve la diferencia:

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

El resultado se muestra de la siguiente manera:

antes de

Después

MarMat
fuente