Web Mercator haritasında iyi görünen Great Circle Kemerleri mi yapıyorsunuz?


11

Bazı uçuşları gösteren verilerle bir harita oluşturmaya çalışıyorum ve kaynak ve hedefleri bağlamak için Great Circle Yaylarını kullanmak istiyorum.

Temel olarak, ünlü Facebook haritasına benzer bir şey yapmak istiyorum: resim açıklamasını buraya girin

Bu yayında verilen işlevleri kullandım: https://gis.stackexchange.com/a/5205/442 , (yani bu blog makalesi: http://anitagraser.com/2011/08/20/visualizing-global-connections / ) ve hatlar alabilirim, ancak Uluslararası Tarih Hattını geçtiler ve kutuplarda toplandılar:

resim açıklamasını buraya girin

@underdark, bağlantılı blog yazısında bu satırların bölünmesi gerektiğini söyledi ancak PostGIS'te bunları otomatik olarak nasıl böleceğimi bilmiyorum.

Ek olarak, kutupların yakınındaki hatların demetlenmesi de çözülmelidir.

Bu uçuşların başlangıcı ve bitişi için puan konumlarına sahip olduğumda, her ikisini de nasıl yaparım?


Kutupsal bir projeksiyon kullanabilir misiniz?
Ian Turton

2
Burada bazı örnekler verdim : gis.stackexchange.com/questions/133026/… . Eqdc'nin gerçek büyük daireler sunmadığını, ancak aeqd'nin sunduğunu unutmayın.
AndreJ

Yanıtlar:



8

Jeodezikleri hesaplayabilirsiniz. A'dan B'ye jeodezik göstermek istediğinizi söyleyerek, önce A'dan B'ye olan uzaklığı ve azimutu (ters Jeodezik problem) hesaplayabilir ve daha sonra A'dan B'ye A ve B arasındaki birkaç noktaya (doğrudan Jeodezik problem) hesaplayabilirsiniz. Sadece GeoJSON şeyler çıktı GeographicLib kullanarak Python basit bir komut dosyası ekledim:

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

Sonuç WGS-84'teki noktalar arasındaki gerçek jeodeziktir. Elbette, koordinatları ihtiyacınız olan projeksiyona dönüştürebilirsiniz. Geojson.io üzerinde görüntülenen sonuç şöyle görünür:

resim açıklamasını buraya girin


2
GeographicLib ile bunu yapmanın alternatif (ve daha hızlı!) Bir yolu için geographiclib.sourceforge.net/html/python/… adresine bakın . Boylamların sürekliliğini sağlamak için LONG_UNROLL bayrağının kullanıldığını da unutmayın.
cffk
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.