飛行機のマップ範囲


10

(ウェブ)マップを作成します。これは、いくつかの空港周辺の飛行機の範囲を示しています。

飛行機の射程を考慮してバッファを計算してみました。ここで結果を見ることができます

しかし、飛行機はまっすぐなルートをとらず、カーブが短いために飛行するため、結果が間違っていることに気づきました。

短い曲線で範囲を計算する方法はありますか?

回答:


20

proj4ライブラリを使用すると、大圏距離を使用して円を記述できます。

たとえば、ここはwgs84 / Equirectangularで、エジンバラ、東京、ケープタウン、キトから半径3000 kmです。赤道に近いため、キトだけが漠然と「丸い」。また、方位角36度(約NE)で1つの高密度スポークラインを追加しました。

ここに画像の説明を入力してください

エジンバラを中心とする正距方位図法に変更すると、エジンバラの周囲の半径が円に解決されることがわかります...

ここに画像の説明を入力してください

メルカトル(Webアプリなど)では、赤道から離れるにつれて歪みが大きくなりますが、バッファーは楕円形になります。

ここに画像の説明を入力してください

次のpythonコードはそれを行います(pyprojshapelyが必要です

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

便利なQuickWKTプラグインを使用して、WKT出力をQGISに貼り付けることができます。

他の方法を使用することもできます。conneypylonが言及したように、カスタムの等距離投影図に、始点を中心とした円をメートル単位で作成できます。しかし、長い距離ではエラーが忍び寄る(2000 kmではわずか数kmですが、大陸間距離ではこれらのエラーが増える可能性があります)。

メモリから、mmqgisプラグインはkm 単位でバッファリングできます。ただし、どの方法を使用しているかはわかりません。

アジアから始めた場合、時系列にまたがるQGISでポリゴンをレンダリングするときに問題が発生する可能性があることに注意してください。- wrapdatelineオプションを指定したogr2ogrが役立ちます。これはopenlayers / leafletの問題ではなく、IIRCでは経度が180より大きく、-180より小さいことが認められます。

esriブログには、測地線のバッファリングに関する優れた記事があります。


8

距離情報の送信元によっては、これは問題にならない場合があります。距離を示す単純な数値がある場合、距離は正確に距離を示すすべてのマップ投影で同じになります(メルカトルではなく、方位正射図法などの「等距離」投影とほとんど同じように考えてください。等角投影、 Lambert Conformal Conicのように、遠くからでも大丈夫です。等距離図法でバッファーを計算して作成すると、バッファーは(かなり)正確になります。距離の計算方法については、こちらを参照してください:ArcGISヘルプ

レイヤーの座標系は、データフレームだけでなく、等距離の投影になるように設定してください。

計算が完了すると、バッファーはWebメルカトルまたはその他の使用するWebプロジェクションに配置されると、それに応じてゆがみます。

なぜ線自体が湾曲しているのか、そしてなぜこれが問題を引き起こすのか:

重要な問題は、次のようなメルカトル図法の平面ルートが曲線として表示されることです。

エア・カナダ路線図

これはメルカトルマップの根本的な問題です。これらは航海ナビゲーションを目的としているため、これらの投影の直線のプロパティは貴重です(メルカトル投影の直線は横線です。同じコンパスが旅全体)。

ただし、燃料効率は単純なナビゲーションよりも重要であり、メルカトル図法では曲線として表示される大圏に沿って飛行するため、飛行機は横線で飛行しません。


燃料効率と目的地にできるだけ早く到達します
cffk 2017

...そのため、実際のパスではJet Streamが考慮されます。
Vince

2
Gall-Petersは等距離図法ではなく、等距離図法です。等距離では、ソースを中心とした方位正射投影法のようなものが必要です。
HeikkiVesanto 2017

ええ、私は考えていませんでした。正角図法は、距離を維持するのにも妥当な
役割を果たし
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.