Карта діапазону літаків


10

Я хотів би створити (веб) карту, яка б показувала дальність літака навколо деяких аеропортів.

Я спробував обчислити буфер із дальністю літака. Тут ви можете побачити результат тут .

Але тепер я зрозумів, що результат неправильний, тому що літаки не прямують прямо, а летять на кривій, оскільки її коротша.

Чи є спосіб обчислити діапазон за допомогою коротшої кривої?

Відповіді:


20

Ви можете використовувати бібліотеку proj4 для опису кола, використовуючи відстань великого кола.

Наприклад, ось радіус 3000 км від Едінбурга, Токіо, Кейптауна і Кіто в wgs84 / Equirectangular. Тільки Кіто невиразно «кругле», через близькість до екватора. Я також додав в одну ущільнену колонку за азимутом 36 градусів (приблизно NE)

введіть тут опис зображення

Якщо ми перейдемо на азимутальну рівновіддалену проекцію, зосереджену на Едінбурзі, ви побачите радіус навколо Едінбурга, який вирішується на коло ...

введіть тут опис зображення

У Mercator (як у вашому веб-додатку) ви бачите більше спотворень, коли ви віддаляєтесь від екватора, але буфери більш еліптичні.

введіть тут опис зображення

Наступний код Python робить це (вимагає pyproj і стрункі )

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

Ви можете вставити вихід WKT у QGIS, використовуючи корисний плагін QuickWKT .

Ви можете використовувати інші методи - як згадувалося в коніпілоні, ви можете створити коло на спеціальній рівновіддаленій проекції в метрах, орієнтовану на початкову точку. Я вважаю, що на великих відстанях помилка повзе (лише кілька км на 2000 км, але для міжконтинентальних відстаней ці помилки можуть наростати)

З пам’яті плагін mmqgis дозволяє здійснювати буферизацію в км. Я не впевнений, який метод він використовує.

Зауважте, що у вас можуть виникнути проблеми з рендерінгом полігонів у QGIS, які перетинають антимеридіан, якщо ви починаєте в Азії - тут може допомогти ogr2ogr з опцією -wrapdateline . Ви можете виявити, що це менше проблеми з відкритими шарами / листівками, IIRC вони дозволяють довготи більше 180 і менше -180.

Тут є хороша інформація про геодезичну буферизацію тут на блозі esri .


8

Залежно від того, звідки надходить інформація про відстань, це може не мати значення. Якщо у вас є просте число, яке дає відстань, то відстань буде однаковою для будь-якої проекції карти, яка точно показує відстань (не Меркатор, думаю, майже будь-яку "рівновіддалену" проекцію, таку як азимутальна ортографічна проекція чи подібне. Конформна проекція, як, наприклад, Ламберт Конформальний Конік зробить досить добре роботу на відстані.) Якщо ви обчислюєте та створюєте буфери в рівновіддаленій проекції, вони будуть (досить) точними, дивіться тут, як обчислюється відстань: Довідка ArcGIS

Не забудьте встановити систему координат шару у рівновіддаленій проекції, а не лише кадр даних.

Після обчислення, буфер буде викривлюватися відповідно, коли він буде розміщений у Web Mercator або будь-якій іншій веб-проекції, яку ви плануєте використовувати.

Що стосується того, чому самі криві лінії вигнуті, і чому це може створити проблеми:

Ключова проблема полягає в тому, що літакові маршрути на проекції Меркатора, такі як ця, відображаються криволінійно, наприклад:

Карта маршруту Air Canada

Це є основоположною проблемою для карт Меркатора, оскільки вони призначені для морської навігації, де властивості прямих на цих проекціях є цінними (пряма на проекції Меркатора - це рембус; лінія з тим же компасом, що прямує через ціла подорож).

Однак літаки не летять по румбових лініях, тому що ефективність палива важливіша, ніж проста навігація, і, таким чином, летять вздовж Великих кіл, які фігурують як криві на проекції Меркатора.


економічність палива та якнайшвидше дістатися до пункту призначення .
cffk

... чому фактичний шлях врахує реактивний потік.
Вінс

2
Галл-Пітерс - проекція на рівну площу, не рівномірна. Для рівновіддаленого ви хочете щось на зразок азимутальної ортографічної проекції, зосередженої на джерелі.
HeikkiVesanto

Так, я не думав. Відповідна проекція також зробить розумну роботу при збереженні відстані, так
coneypylon
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.