แผนที่ช่วงของเครื่องบิน


10

ฉันต้องการสร้างแผนที่ (เว็บ) ที่แสดงช่วงของเครื่องบินรอบสนามบินบางแห่ง

ฉันพยายามคำนวณบัฟเฟอร์ด้วยช่วงของเครื่องบิน ที่นี่คุณสามารถเห็นผลที่นี่

แต่ตอนนี้ฉันรู้แล้วว่าผลลัพธ์ไม่ถูกต้องเพราะเครื่องบินไม่ได้ใช้เส้นทางตรง แต่บินโค้งเพราะมันสั้นกว่า

มีวิธีคำนวณช่วงด้วยเส้นโค้งที่สั้นกว่านี้หรือไม่?

คำตอบ:


20

คุณสามารถใช้ไลบรารีproj4เพื่ออธิบายวงกลมโดยใช้ระยะทางที่ยอดเยี่ยม

ตัวอย่างเช่นนี่คือรัศมี 3000km จาก Edinburgh, Tokyo, Cape Town และ Quito ใน wgs84 / Equirectangular กีโตเท่านั้นคือ 'รอบ' ที่คลุมเครือเนื่องจากอยู่ใกล้กับเส้นศูนย์สูตร ฉันยังได้เพิ่มสายพูดที่หนาแน่นแบบหนึ่งจุดที่มุมราบ 36 องศา (ประมาณ NE)

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

หากเราเปลี่ยนการฉายภาพระยะทางเท่ากันแบบอะซิมุ ธ ที่มีศูนย์กลางอยู่ที่เอดินเบอระคุณจะเห็นรัศมีรอบ ๆ เอดินเบิร์กเปลี่ยนเป็นวงกลม ...

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

บน Mercator (เช่นเว็บแอปของคุณ) คุณจะเห็นความผิดเพี้ยนมากขึ้นเมื่อคุณขยับออกห่างจากเส้นศูนย์สูตร แต่บัฟเฟอร์นั้นเป็นวงรีมากกว่า

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

รหัสไพ ธ อนต่อไปนี้ทำเช่นนั้น (ต้องใช้pyprojและหุ่นดี )

import pyproj
from shapely.geometry import Polygon, MultiPoint, LineString
import math

def geodesicpointbuffer(longitude, latitude,
                        segments, distance_m,
                        geom_type=MultiPoint):
    """
    Creates a buffer in meters around a point given as long, lat in WGS84
    Uses the geodesic, so should be more accurate over larger distances

    :param longitude: center point longitude
    :param latitude: center point latitude
    :param segments: segments to approximate (more = smoother)
    :param distance_m: distance in meters
    :param geom_type: shapely type (e.g. Multipoint, Linestring, Polygon)
    :return: tuple (proj4 string, WKT of buffer geometry)
    """
    geodesic = pyproj.Geod(ellps='WGS84')
    coords = []
    for i in range(0, segments):
        angle = (360.0 / segments) * float(i)
        x1, y1, z1 = geodesic.fwd(lons=longitude,
                                  lats=latitude,
                                  az=angle,
                                  dist=distance_m,
                                  radians=False)
        coords.append((x1, y1))
        # makes a great circle for one spoke.
        if i==200:
            example = geodesic.npts(longitude,latitude,x1,y1,1000)
            coords2 = []
            for xx,yy in example:
                coords2.append((xx,yy))
            coords2.append((x1,y1)) # make sure we include endpoint ;-)
            flight = LineString(coords2)
            print(flight.wkt)

    ring = geom_type(coords)
    return "+init=EPSG:4326", ring.wkt


def main():
    # example : Cape Town. 3000km buffer.
    spec, wkt = geodesicpointbuffer(18.4637082653, -33.8496404007, 2000, 3000000.0, Polygon)
    print(spec)
    print(wkt)

if __name__ == "__main__":
    main()

คุณสามารถวางเอาต์พุต WKT ลงใน QGIS โดยใช้ปลั๊กอินQuickWKT ที่มีประโยชน์

คุณสามารถใช้วิธีการอื่น ๆ - ตามที่ coneypylon กล่าวไว้คุณสามารถสร้างวงกลมบนการฉายภาพระยะเท่ากันที่กำหนดเองเป็นเมตรโดยมีศูนย์กลางที่จุดเริ่มต้นของคุณ ฉันพบว่ามีข้อผิดพลาดในระยะทางไกล (เพียงไม่กี่กม. ที่ 2000 กม. แต่สำหรับระยะทางระหว่างทวีปข้อผิดพลาดเหล่านี้สามารถติดตั้งได้)

จากหน่วยความจำปลั๊กอินmmqgisอนุญาตให้บัฟเฟอร์ในกม. ฉันไม่แน่ใจว่าจะใช้วิธีการใด

โปรดทราบว่าคุณอาจมีปัญหาในการแสดงรูปหลายเหลี่ยมใน QGIS ที่ข้าม antimeridian ถ้าคุณเริ่มต้นในเอเชีย - ogr2ogrด้วยตัวเลือก-wrapdatelineสามารถช่วยได้ที่นี่ คุณอาจพบว่านี่เป็นปัญหาของ openlayers / leaflet น้อยกว่าพวก IIRC อนุญาตให้ longlines ที่มากกว่า 180 และน้อยกว่า -180

มี writeup ดีเกี่ยวกับบัฟเฟอร์เนื้อที่นี่บนบล็อก ESRI


8

ทั้งนี้ขึ้นอยู่กับว่าข้อมูลระยะทางของคุณมาจากที่ใด หากคุณมีตัวเลขง่าย ๆ ที่ให้ระยะทางระยะทางจะเท่ากันในการฉายแผนที่ใด ๆ ซึ่งแสดงระยะทางที่ถูกต้อง (ไม่ใช่ Mercator ให้คิดว่าการฉายภาพ "ระยะเท่ากัน" ใด ๆ เช่นการฉาย orthographic azimuthal หรือคล้ายกัน เช่น Lambert Conformal Conic จะทำงานได้ดีพอสมควรในระยะทาง) หากคุณคำนวณและสร้างบัฟเฟอร์ในการฉายภาพระยะเท่ากันพวกมันจะถูกต้อง (เป็นธรรม) ดูที่นี่เกี่ยวกับวิธีคำนวณระยะทาง: ArcGIS ความช่วยเหลือ

ตรวจสอบให้แน่ใจว่าตั้งค่าระบบพิกัดของเลเยอร์ให้อยู่ในระยะฉายภาพที่เท่ากันไม่ใช่แค่กรอบข้อมูล

เมื่อคำนวณแล้วบัฟเฟอร์จะวาร์ปตามลำดับเมื่อใส่ลงใน Web Mercator หรือเว็บอื่น ๆ ที่คุณต้องการใช้

เท่าที่ทำไมเส้นเหล่านั้นโค้งและทำไมสิ่งนี้อาจสร้างปัญหา:

ปัญหาสำคัญคือเส้นทางเครื่องบินในการฉายภาพของ Mercator เช่นอันนี้จะแสดงเป็นโค้งเช่น:

ผังเส้นทางของแอร์แคนาดา

นี่เป็นปัญหาพื้นฐานของแผนที่ Mercator เนื่องจากมีจุดประสงค์เพื่อการนำทางทะเลซึ่งคุณสมบัติของเส้นตรงในการคาดการณ์เหล่านี้มีค่า (เส้นตรงบนเส้นโครงแผนที่ของ Mercator เป็นเส้นโค้งตามแนวเส้นรอบวงที่มีเข็มทิศเดียวกัน การเดินทางทั้งหมด)

อย่างไรก็ตามเครื่องบินไม่ได้บินบนเส้น rhumb เนื่องจากประสิทธิภาพการใช้เชื้อเพลิงมีความสำคัญมากกว่าการนำทางที่ง่ายและจึงบินไปตามวงกลมใหญ่ซึ่งปรากฏเป็นเส้นโค้งบนเส้นโครงของ Mercator


ประสิทธิภาพการใช้เชื้อเพลิงและการเดินทางไปยังปลายทางได้อย่างรวดเร็วที่สุด
cffk

... ซึ่งทำไมเส้นทางที่แท้จริงจะนำเจ็ตสตรีมเข้ามาพิจารณา
วินซ์

2
Gall-Peters เป็นการประมาณการพื้นที่เท่ากันไม่เท่ากัน สำหรับระยะเวลาเท่ากันคุณต้องการบางอย่างเช่น Azimuthal Orthographic Projection ที่มีศูนย์กลางอยู่ที่แหล่งที่มาของคุณ
HeikkiVesanto

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