Webメルカトルマップで見栄えの良い大円弧を作成しますか?


10

いくつかのフライトを示すデータを含むマップを作成しようとしていますが、グレートサークルアークを使用して、出発地と目的地を接続したいと考えています。

基本的に、私は有名な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 2016年

回答:



8

測地線を計算できます。AからBまでの測地線を表示したい場合、最初にAからBまでの距離と方位角を計算し(逆測地線問題)、次にAからAとBの間のいくつかの点までの点を計算します(直接測地線問題)。GeographicLibを使用して、GeoJSONに出力するだけの簡単なスクリプトをPythonに追加しました。

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でこれを行う別の(そしてより高速な)方法については、geographiclib.sourceforge.net / html / python /…を参照してください。経度の連続性を確保するためのLONG_UNROLLフラグの使用にも注意してください。
cffk 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.