รูปหลายเหลี่ยมข้าม dateline นานาชาติ [-180 .. + ลองจิจูด 180]


10

ฉันพยายามที่จะสร้างรูปหลายเหลี่ยมสำหรับ swaths วงโคจรของดาวเทียม จนถึงตอนนี้ฉันมีวิธีในการสร้างสองบรรทัดซึ่งแสดงถึงขอบของแต่ละ swath ใน [lat, long] บางส่วนของแนวเขตข้อมูลข้ามประเทศและล้อมรอบ:

swath ล้อมรอบ

ฉันสามารถแก้ปัญหานี้ด้วยogr2ogr -wrapdateline:

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

ซึ่งจะแบ่งเส้นอาจ

ตอนนี้ฉันต้องการที่จะสามารถสร้างรูปหลายเหลี่ยมในการตกแต่งภายในของทั้งสองสาย ตัวอย่างเช่นในกรณีที่ขอบหนึ่งของ swath ข้ามเส้นข้อมูลรูปหลายเหลี่ยมเติมเมื่อเกิดขึ้นในอีกด้านหนึ่งเช่น:

เติม

ฉันต้องการวิธีการที่เป็นไปโดยอัตโนมัติตามที่ฉันต้องการเพื่อทำงานซ้ำมาก โดยเฉพาะอย่างยิ่งในงูหลามเนื่องจากเป็นวิธีที่ฉันสร้างบรรทัด นี่คือสองไฟล์รูปร่างที่มีเส้น: wraparound ; datelinefixed


สำหรับแนวคิดเพิ่มเติมโปรดดูหัวข้อที่เกี่ยวข้องgis.stackexchange.com/questions/429และgis.stackexchange.com/questions/18562 ความคิดที่นำเสนอในgis.stackexchange.com/questions/17788น่าจะเป็นประโยชน์เช่นกัน ฉันสงสัยว่าสิ่งที่คุณหมายถึงโดย "การตกแต่งภายใน": รูปหลายเหลี่ยมเหล่านี้ไม่ได้กำหนดไว้อย่างดีดังนั้นอย่างน้อยที่สุดคุณจำเป็นต้องให้ข้อมูลเพื่อระบุ (a) ด้านใดของรูปหลายเหลี่ยมที่ถูกพิจารณาว่าเป็น "ภายใน" และ (b) เพื่อตัดพวกเขาออกใกล้เสา
whuber

คำตอบ:


3

คุณสามารถสร้างโปรเจคเตอเรเตอร์แบบกำหนดเองที่กึ่งกลางประมาณกึ่งกลางของ swath ตัวอย่างเช่นใช้สำหรับ 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

ในการประมาณการนี้ swath จะไม่ขาดโดย dateline คุณสามารถสร้างรูปหลายเหลี่ยมจากบรรทัด

ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นสร้างรูปหลายเหลี่ยมที่ตัดระหว่าง -179.95 ° E และ 179.95 ° E ใน EPSG: 4326:

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

คัดลอกไปยัง CRS ที่คุณกำหนดเองด้วยและลบออกจากรูปหลายเหลี่ยม swath

หลังจากทำซ้ำกลับไปที่ EPSG: 4326 swath นั้นจะถูกหารด้วย dateline อย่างถูกต้อง:

ป้อนคำอธิบายรูปภาพที่นี่

ดำเนินการต่อด้วย swath ทั้งหมดที่ข้ามวันที่


1

ฉันจะเขียนกระบวนการสร้างบรรทัดใหม่เพื่อเริ่มต้นและสิ้นสุดในพื้นที่ว่างตามยาวแบบต่อเนื่อง เช่นถ้าเส้นเริ่มต้นที่ 170 °และสิ้นสุดที่ -170 °ฉันจะเขียนกระบวนการให้เสร็จที่ 190 °แทนโดยไม่ปิดที่ -180,180

จากนั้นคุณสามารถสร้างรูปหลายเหลี่ยมที่ไม่ขาดระหว่างเส้นของคุณ

จากนั้นใช้กระบวนการคลิปเพื่อแยกรูปหลายเหลี่ยมที่เส้น 180, -180 และเลื่อนส่วนใด ๆ ที่อยู่นอกพื้นที่ -180,180 โดยการเพิ่มหรือลบ 360 °ตามความเหมาะสม

เพียงทำทุกอย่างให้เรียบร้อยก่อนที่คุณจะบันทึกด้วยการฉาย / ข้อมูลเฉพาะ


1

ขอบคุณ @AndreJ สำหรับความคิดนี้การใช้Django GEOS APIที่นี่เป็นวิธีแก้ปัญหาง่ายๆที่หลีกเลี่ยงการต้องฉายอะไรใหม่:

1) สร้าง MultiPolygon ที่มีขอบบนดาต้าไลน์:

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) ถ้าเรขาคณิตเชิงรุกตัดกันให้คืนความแตกต่าง:

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

ผลลัพธ์แสดงดังต่อไปนี้:

ก่อน

หลังจาก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.