Làm cho Great Circle Arcs trông đẹp hơn trên bản đồ Web Mercator?


10

Tôi đang cố gắng tạo bản đồ, với dữ liệu chỉ ra một số chuyến bay và muốn sử dụng Great Circle Arcs, để kết nối nguồn và điểm đến.

Về cơ bản, tôi muốn làm một cái gì đó tương tự như bản đồ Facebook nổi tiếng: nhập mô tả hình ảnh ở đây

Tôi đã sử dụng các chức năng được đưa ra trong bài đăng này: /gis//a/5205/442 , (tức là bài viết trên blog này: http://anitagraser.com/2011/08/20/visualizing-global-connections / ) và tôi có thể nhận được các dòng, nhưng chúng vượt qua Dòng ngày quốc tế, cũng như bó lại, ở các cực:

nhập mô tả hình ảnh ở đây

@underdark, đã đề cập trong blogpost được liên kết rằng những dòng này cần phải được phân tách, nhưng tôi không biết cách phân tách chúng tự động trong PostGIS.

Ngoài ra, việc tập hợp các đường gần cực cũng cần được giải quyết.

Làm thế nào để tôi thực hiện cả hai điều này, khi tôi có vị trí điểm bắt đầu và kết thúc của các chuyến bay này?


Bạn có thể sử dụng một phép chiếu cực?
Ian Turton

2
Tôi đã đưa ra một số ví dụ ở đây: gis.stackexchange.com/questions/133026/ . Lưu ý rằng eqdc không cung cấp vòng tròn lớn thực sự, nhưng aeqd thì có.
AndreJ

Câu trả lời:



8

Bạn có thể tính toán trắc địa. Nói rằng bạn muốn hiển thị trắc địa từ A đến B, trước tiên bạn có thể tính khoảng cách và góc phương vị từ A đến B (bài toán trắc địa nghịch đảo) và sau đó tính điểm từ A đến vài điểm giữa A và B (bài toán trắc địa trực tiếp). Tôi đã thêm một tập lệnh đơn giản trong Python bằng GeographicLib chỉ cần xuất nội dung trong 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))

Kết quả là trắc địa thực sự giữa các điểm trong WGS-84. Tất nhiên, sau đó bạn có thể chuyển đổi tọa độ thành bất kỳ phép chiếu nào bạn cần. Kết quả được hiển thị trên Geojson.io trông như thế này:

nhập mô tả hình ảnh ở đây


2
Xem geographiclib.sourceforge.net/html/python/ Khăn để biết cách thay thế (và nhanh hơn!) Với GeographicLib. Cũng lưu ý việc sử dụng cờ LONG_UNROLL để đảm bảo tính liên tục của kinh độ.
cffk 17/03/2016
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.