Membuat Great Circle Arcs yang terlihat bagus di peta Web Mercator?

10

Saya mencoba membuat peta, dengan data yang menunjukkan beberapa penerbangan, dan ingin menggunakan Great Circle Arcs, untuk menghubungkan sumber dan tujuan.

Pada dasarnya, saya ingin melakukan sesuatu yang mirip dengan peta Facebook yang terkenal: masukkan deskripsi gambar di sini

Saya menggunakan fungsi yang diberikan dalam posting ini: https://gis.stackexchange.com/a/5205/442 , (yaitu artikel blog ini: http://anitagraser.com/2011/08/20/visualizing-global-connections / ) dan saya bisa mendapatkan garis, tetapi mereka melintasi Garis Tanggal Internasional, serta banyak, di kutub:

masukkan deskripsi gambar di sini

@underdark, telah disebutkan di blogpost yang tertaut bahwa garis-garis ini perlu dipisah, tetapi saya tidak tahu bagaimana cara memecahnya secara otomatis di PostGIS.

Selain itu pengelompokan garis di dekat kutub perlu diselesaikan juga.

Bagaimana saya melakukan keduanya, ketika saya memiliki lokasi titik untuk memulai dan mengakhiri penerbangan ini?

Devdatta Tengshe
sumber
Bisakah Anda menggunakan proyeksi kutub?
Ian Turton
2
Saya telah memberikan beberapa contoh di sini: gis.stackexchange.com/questions/133026/… . Perhatikan bahwa eqdc tidak memberikan lingkaran besar yang benar, tetapi aeqd melakukannya.
AndreJ

Jawaban:

5

Prinsip-prinsip dalam posting blog ini dialihkan ke tujuan umum PostGIS.

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

Pada dasarnya, gunakan ST_Segmentizepada geografi, dan sedikit sihir untuk memotong garis-garis persimpangan tanggal.

Paul Ramsey
sumber
8

Anda bisa menghitung Geodesics. Mengatakan Anda ingin menunjukkan geodesik dari A ke B, Anda dapat menghitung jarak dan azimuth dari A ke B (inverse Geodesic problem) dan kemudian menghitung titik dari A ke beberapa titik antara A dan B (direct Geodesic problem). Saya telah menambahkan skrip sederhana dalam Python menggunakan GeographicLib hanya mengeluarkan barang-barang di 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))

Hasilnya adalah geodesik sejati antara titik-titik di WGS-84. Tentu saja, Anda kemudian dapat mengubah koordinat ke proyeksi apa pun yang Anda butuhkan. Hasilnya divisualisasikan di geojson.io terlihat seperti ini:

masukkan deskripsi gambar di sini

sema
sumber
2
Lihat geographiclib.sourceforge.net/html/python/... untuk cara alternatif (dan lebih cepat!) Dalam melakukan ini dengan GeographicLib. Perhatikan juga penggunaan bendera LONG_UNROLL untuk memastikan kesinambungan garis bujur.
cffk