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:
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:
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
Respuestas:
Puede crear una proyección de mercator personalizada centrada aproximadamente en el centro de la franja. Por ejemplo, use para la franja 25:
En esta proyección, la franja no se rompe por la línea de fecha. Puede crear el polígono desde la línea.
Luego cree un polígono cortado entre -179.95 ° E y 179.95 ° E en EPSG: 4326:
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:
Continúe con todas las franjas que cruzan la línea de fecha.
fuente
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
fuente
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:
2) Si la geometría ofensiva se cruza, devuelve la diferencia:
El resultado se muestra de la siguiente manera:
fuente