Poligon di seluruh garis data internasional [-180 .. + 180 bujur]

10

Saya mencoba menghasilkan poligon untuk petak orbit satelit. Sejauh ini saya memiliki metode untuk menghasilkan dua garis yang mewakili tepi setiap petak di [lat, long]. Beberapa petak melintasi garis tengah internasional dan membungkusnya:

petak membungkus

Saya dapat menyelesaikan ini dengan ogr2ogr -wrapdateline:

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

Yang mungkin memecah garis

Saya sekarang ingin dapat menghasilkan poligon di bagian dalam kedua garis. Jadi misalnya dalam kasus di mana satu sisi petak melintasi garis data, sebuah poligon terisi ketika ia muncul di sisi lain, seperti:

mengisi

Saya memerlukan metode yang otomatis karena saya harus mengulangi tugas banyak. Lebih disukai dalam python karena itulah bagaimana saya telah menghasilkan garis. Berikut adalah dua shapefile yang mengandung garis-garis: wraparound ; diperbaiki dateline

James
sumber
Untuk gagasan tambahan, lihat utas terkait di gis.stackexchange.com/questions/429 dan gis.stackexchange.com/questions/18562 . Dapat dipahami ide-ide yang disajikan di gis.stackexchange.com/questions/17788 juga bisa membantu. Saya bertanya-tanya, apa yang Anda maksud dengan "interior": poligon ini tidak terdefinisi dengan baik, jadi setidaknya Anda perlu memberikan informasi untuk menunjukkan (a) sisi mana dari setiap polyline dianggap "interior" dan (b) bagaimana untuk memotongnya di dekat kutub.
Whuber

Jawaban:

3

Anda dapat membuat proyeksi mercator kustom yang terpusat kira-kira di tengah petak. Misalnya, gunakan untuk petak 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

Dalam proyeksi ini, petak tidak rusak oleh dateline. Anda dapat membuat poligon dari garis.

masukkan deskripsi gambar di sini

Kemudian buat poligon terpotong antara -179,95 ° E dan 179,95 ° E di EPSG: 4326:

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

Proyeksi ulang juga ke CRS khusus Anda, dan kurangi dari poligon petak.

Setelah memproyeksikan kembali ke EPSG: 4326, petak dibagi dengan benar oleh dateline:

masukkan deskripsi gambar di sini

Lanjutkan dengan semua petak yang melintasi garis data.

AndreJ
sumber
1

Saya akan menulis ulang proses pembuatan garis swathe untuk memulai dan menyelesaikan dalam ruang longintudinal yang sama terus menerus. yaitu jika garis dimulai pada 170 ° dan berakhir pada -170 ° Saya akan menulis ulang proses untuk selesai pada 190 ° bukannya tanpa pembungkus pada -180.180

Kemudian Anda dapat membuat poligon yang tidak terputus di antara garis Anda.

Kemudian gunakan proses klip untuk membagi poligon pada garis 180, -180 dan menggeser setiap bagian yang berada di luar ruang -180.180 dengan menambahkan atau mengurangi 360 ° yang sesuai.

Selesaikan semuanya sebelum Anda menyimpannya dengan proyeksi / data tertentu

Tuan Ungu
sumber
0

Terima kasih kepada @AndreJ untuk ide ini, menggunakan Django GEOS API di sini adalah solusi sederhana yang menghindari perlu memproyeksikan ulang apa pun:

1) Buat MultiPolygon yang berbatasan dengan dateline:

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) Jika geometri menyinggung berpotongan, kembalikan perbedaan:

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

Hasilnya ditunjukkan sebagai berikut:

Sebelum

Setelah

MarMat
sumber