Rentang Peta Pesawat Terbang

10

Saya ingin membuat peta (web), yang menunjukkan kisaran pesawat terbang di sekitar beberapa bandara.

Saya mencoba menghitung penyangga dengan jangkauan pesawat. Di sini Anda dapat melihat hasilnya di sini .

Tetapi sekarang saya menyadari bahwa hasilnya salah karena pesawat tidak mengambil rute lurus tetapi menerbangkan kurva karena lebih pendek.

Apakah ada cara untuk menghitung rentang dengan kurva yang lebih pendek?

Riker
sumber

Jawaban:

20

Anda bisa menggunakan pustaka proj4 untuk menggambarkan lingkaran menggunakan jarak lingkaran-besar.

Misalnya, di sini radius 3000 km dari Edinburgh, Tokyo, Cape Town, dan Quito di wgs84 / Equirectangular. Hanya Quito yang 'bulat', karena kedekatannya dengan garis katulistiwa. Saya juga telah menambahkan dalam satu garis bicara padat pada azimuth 36 derajat (sekitar NE)

masukkan deskripsi gambar di sini

Jika kami beralih ke proyeksi azimuth equidistant yang berpusat di Edinburgh, Anda akan melihat jari-jari di sekitar Edinburgh ...

masukkan deskripsi gambar di sini

Di Mercator (seperti aplikasi web Anda), Anda melihat lebih banyak distorsi saat Anda menjauh dari khatulistiwa, tetapi buffer lebih elips.

masukkan deskripsi gambar di sini

Berikut kode python melakukan itu (membutuhkan pyproj dan rupawan )

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()

Anda dapat menempelkan output WKT ke QGIS menggunakan plugin QuickWKT yang bermanfaat .

Anda bisa menggunakan metode lain - seperti yang disebutkan coneypylon, Anda bisa membuat lingkaran pada proyeksi berjarak sama kustom dalam meter, berpusat pada titik awal Anda. Namun saya menemukan bahwa untuk jarak yang jauh terjadi kesalahan (hanya beberapa km pada 2000 km, tetapi untuk jarak antar benua kesalahan ini dapat meningkat)

Dari memori, plugin mmqgis memungkinkan buffering dalam km. Saya tidak yakin metode apa yang digunakannya.

Perhatikan bahwa Anda mungkin memiliki masalah dalam membuat poligon di QGIS yang melintasi antimeridian jika Anda mulai di Asia - ogr2ogr dengan opsi -wrapdateline dapat membantu di sini. Anda mungkin menemukan ini kurang dari masalah dengan openlayers / leaflet, IIRC mereka memungkinkan garis bujur lebih besar dari 180 dan kurang dari -180.

Ada artikel bagus tentang buffering geodesik di blog esri ini .

Steven Kay
sumber
8

Tergantung dari mana informasi jarak Anda berasal, ini mungkin tidak masalah. Jika Anda memiliki angka sederhana yang memberi jarak, jaraknya akan sama pada proyeksi peta mana pun yang menunjukkan jarak secara akurat (bukan Mercator, pikirkan hampir semua proyeksi "berjarak sama", seperti proyeksi ortografis azimut atau sejenisnya. Proyeksi konformal, seperti Lambert Conformal Conic akan melakukan pekerjaan yang cukup baik di kejauhan.). Jika Anda menghitung dan membuat buffer dalam proyeksi yang sama, mereka akan (cukup) akurat, lihat di sini tentang bagaimana jarak dihitung: Bantuan ArcGIS

Pastikan untuk mengatur sistem koordinat layer dalam proyeksi yang sama, bukan hanya frame data.

Setelah dihitung, buffer akan melengkung sesuai ketika dimasukkan ke dalam Web Mercator atau apa pun proyeksi web lain yang ingin Anda gunakan.

Sejauh mengapa garis-garis itu sendiri melengkung, dan mengapa ini dapat menimbulkan masalah:

Masalah utama adalah bahwa rute pesawat pada proyeksi Mercator seperti ini ditampilkan sebagai melengkung, seperti:

Peta rute Air Canada

Ini adalah masalah mendasar dengan peta Mercator, karena ditujukan untuk navigasi laut, di mana properti garis lurus pada proyeksi ini bernilai (garis lurus pada proyeksi Mercator adalah garis rhumb; garis dengan kompas yang sama mengarah melalui seluruh perjalanan).

Namun, pesawat tidak terbang di jalur rhumb, karena efisiensi bahan bakar lebih penting daripada navigasi sederhana, dan karenanya terbang di sepanjang Lingkaran Besar, yang muncul sebagai kurva pada proyeksi Mercator.

coneypylon
sumber
efisiensi bahan bakar dan mencapai tujuan secepat mungkin .
cffk
... yang mengapa jalur sebenarnya akan mempertimbangkan Jet Stream.
Vince
2
Gall-Peters adalah proyeksi area yang sama tidak sama. Untuk jarak yang sama, Anda menginginkan sesuatu seperti Proyeksi Orthografis Azimuthal yang berpusat pada sumber Anda.
HeikkiVesanto
Ya, saya tidak berpikir. Proyeksi konformal juga akan melakukan pekerjaan yang masuk akal dalam menjaga jarak, yeah
coneypylon