กำลังสร้าง Great Circle Arcs ที่ดูดีบนแผนที่ Web Mercator หรือไม่


11

ฉันกำลังพยายามสร้างแผนที่โดยมีข้อมูลระบุเที่ยวบินบางส่วนและต้องการใช้ Great Circle Arcs เพื่อเชื่อมต่อแหล่งที่มาและปลายทาง

โดยพื้นฐานแล้วฉันต้องการทำสิ่งที่คล้ายกับแผนที่ Facebook ที่มีชื่อเสียง: ป้อนคำอธิบายรูปภาพที่นี่

ฉันใช้ฟังก์ชั่นที่ให้ไว้ในโพสต์นี้: https://gis.stackexchange.com/a/5205/442 , (เช่นบทความบล็อกนี้: http://anitagraser.com/2011/08/20/visualizing-global-connections / ) และฉันสามารถได้รับเส้น แต่พวกเขาข้ามเส้นวันที่ระหว่างประเทศเช่นเดียวกับการรวมกลุ่มที่เสา:

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

@underdark ได้กล่าวถึงในบล็อกลิงก์ที่เชื่อมโยงว่าต้องแยกบรรทัดเหล่านี้ แต่ฉันไม่รู้วิธีแยกโดยอัตโนมัติใน PostGIS

นอกจากนี้การรวมกลุ่มของเส้นใกล้เสาต้องแก้ไขด้วยเช่นกัน

ฉันจะทำทั้งสองอย่างนี้ได้อย่างไรเมื่อฉันมีที่ตั้งจุดสำหรับการเริ่มต้นและสิ้นสุดของเที่ยวบินเหล่านี้


คุณสามารถใช้การฉายขั้วโลก
Ian Turton

2
ผมได้ให้ตัวอย่างบางส่วนที่นี่: gis.stackexchange.com/questions/133026/... โปรดทราบว่า eqdc ไม่ส่งวงกลมใหญ่ที่แท้จริง แต่ aeqd ทำ
AndreJ

คำตอบ:


5

หลักการในการโพสต์บล็อกนี้ถ่ายโอนไปยังวัตถุประสงค์ทั่วไป PostGIS

http://blog.cartodb.com/jets-and-datelines/

โดยพื้นฐานแล้วใช้ST_Segmentizeกับภูมิศาสตร์และใช้เวทย์มนตร์สักนิดเพื่อตัดเส้นข้ามเส้นวันที่


8

คุณสามารถคำนวณธรณีวิทยา สมมติว่าคุณต้องการแสดงเนื้อที่ทางธรณีวิทยาจาก A ถึง B คุณสามารถคำนวณระยะทางและมุมราบจาก A ถึง B (ปัญหาธรณีวิทยาผกผัน) และคำนวณคะแนนจาก A ถึง B หลายจุดระหว่าง A และ B (ปัญหาธรณีวิทยาโดยตรง) ฉันได้เพิ่มสคริปต์ง่ายๆใน Python โดยใช้GeographicLibเพียงแค่แสดงเนื้อหาใน GeoJSON:

from geographiclib.geodesic import Geodesic
from geojson import MultiLineString

def geodesic(lat1, lon1, lat2, lon2, steps):
    inverse = Geodesic.WGS84.Inverse(lat1, lon1, lat2, lon2)
    linestrings = []
    coordinates = []

    for i in range(0, steps + 1):
        direct = Geodesic.WGS84.Direct(inverse['lat1'], inverse['lon1'], inverse['azi1'], (i / float(steps)) * inverse['s12'])
        if len(coordinates) > 0:
            if (coordinates[-1][0] < -90 and direct['lon2'] > 90) or (coordinates[-1][0] > 90 and direct['lon2'] < -90):
                linestrings.append(coordinates)
                coordinates = []
        coordinates.append((direct['lon2'], direct['lat2']))

    linestrings.append(coordinates)
    geojson = MultiLineString(linestrings)
    return geojson

linestrings = []

# San Francisco: 37.7793, -122.4192
# Bangalore: 12.9, 77.616667
for linestring in geodesic(37.7793, -122.4192, 12.95, 77.616667, 100)['coordinates']:
    linestrings.append(linestring)

# Boston: 42.357778, -71.059444
# Bangalore: 12.9, 77.616667
for linestring in geodesic(42.357778, -71.059444, 12.95, 77.616667, 100)['coordinates']:
    linestrings.append(linestring)

print(MultiLineString(linestrings))

ผลลัพธ์ที่ได้คือพิกัดทางภูมิศาสตร์ที่แท้จริงระหว่างจุดต่าง ๆ ใน WGS-84 แน่นอนว่าคุณสามารถแปลงพิกัดให้เป็นภาพที่คุณต้องการ ผลลัพธ์จะปรากฏบนgeojson.io เป็นดังนี้:

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


2
ดูgeographiclib.sourceforge.net/html/python/…สำหรับวิธีการอื่นในการทำเช่นนี้กับ GeographicLib สังเกตการใช้ธง LONG_UNROLL เพื่อให้แน่ใจว่ามีความต่อเนื่องของลองจิจูด
cffk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.