Mapa zasięgu samolotów

10

Chciałbym stworzyć mapę (internetową), która pokazuje zasięg samolotu wokół niektórych lotnisk.

Próbowałem obliczyć bufor z zasięgiem samolotu. Tutaj możesz zobaczyć wynik tutaj .

Ale teraz zdałem sobie sprawę, że wynik jest zły, ponieważ samoloty nie wybierają prostej trasy, ale lecą po łuku, ponieważ jest krótszy.

Czy istnieje sposób na obliczenie zakresu za pomocą krótszej krzywej?

Riker
źródło

Odpowiedzi:

20

Możesz użyć biblioteki proj4 do opisania koła za pomocą odległości wielkiego koła.

Na przykład, oto promień 3000 km z Edynburga, Tokio, Kapsztadu i Quito w wgs84 / Equirectangular. Tylko Quito jest niejasno „okrągłe” ze względu na bliskość równika. Dodałem również w jednej zagęszczonej linii szprychy w azymucie 36 stopni (około NE)

wprowadź opis zdjęcia tutaj

Jeśli zmienimy na azymutalną równoodległą projekcję wyśrodkowaną na Edynburgu, zobaczysz promień wokół Edynburga, który tworzy okrąg ...

wprowadź opis zdjęcia tutaj

W Mercator (podobnie jak w aplikacji internetowej) widać większe zniekształcenia, gdy odsuwasz się od równika, ale bufory są bardziej eliptyczne.

wprowadź opis zdjęcia tutaj

Poniższy kod python robi to (wymaga pyproj i foremny )

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

Możesz wkleić dane wyjściowe WKT do QGIS za pomocą przydatnej wtyczki QuickWKT .

Możesz użyć innych metod - jak wspomniano w stożku, możesz utworzyć okrąg na niestandardowej równoodległej projekcji w metrach, wyśrodkowany na punkcie początkowym. Uważam jednak, że na dużych odległościach wkrada się błąd (tylko kilka kilometrów na 2000 km, ale w przypadku odległości międzykontynentalnych błędy mogą się narastać)

Z pamięci wtyczka mmqgis umożliwia buforowanie w km. Nie jestem jednak pewien, jakiej metody używa.

Zauważ, że możesz mieć problemy z renderowaniem wielokątów w QGIS, które przekraczają antimeridian, jeśli zaczynasz w Azji - ogr2ogr z opcją -wrapdateline może tutaj pomóc. Może się okazać, że jest to mniejszy problem z openlayers / ulotką, IIRC pozwalają na długości większe niż 180 i mniejsze niż -180.

Dobry blog na temat buforowania geodezyjnego znajduje się tutaj na blogu esri .

Steven Kay
źródło
8

W zależności od tego, skąd pochodzą informacje o odległości, może to nie mieć znaczenia. Jeśli masz prostą liczbę określającą odległość, odległość będzie taka sama na każdej projekcji mapy, która dokładnie pokazuje odległość (nie Mercator, pomyśl prawie o każdej „równej odległości” projekcji, takiej jak azymutalna projekcja ortograficzna lub podobna. Projekcja konformalna, jak Lambert Conformal Conic wykona dość dobrą robotę na odległość). Jeśli obliczysz i utworzysz bufory w projekcji w równej odległości, będą one (dość) dokładne, zobacz tutaj, jak obliczana jest odległość: ArcGIS Help

Pamiętaj, aby ustawić układ współrzędnych warstwy w rzucie o jednakowej odległości, a nie tylko ramkę danych.

Po obliczeniu bufor odpowiednio zniekształci się po umieszczeniu w Web Mercator lub innej projekcji internetowej, której zamierzasz użyć.

Jeśli chodzi o to, dlaczego same linie są zakrzywione i dlaczego może to powodować problemy:

Kluczowym problemem jest to, że trasy samolotów w rzucie Mercatora, takim jak ten, są wyświetlane jako zakrzywione, w następujący sposób:

Mapa tras Air Canada

Jest to podstawowy problem z mapami Mercator, ponieważ są one przeznaczone do nawigacji nautycznej, gdzie właściwości linii prostych na tych rzutach są cenne (linia prosta na rzucie Mercatora jest linią loksodromową; linia z tym samym kompasem prowadzącym przez cała podróż).

Jednak samoloty nie latają po loksodromach, ponieważ oszczędność paliwa jest ważniejsza niż prosta nawigacja, a zatem latają wzdłuż Wielkich Kręgów, które pojawiają się jako krzywe na rzucie Mercatora.

stożek
źródło
oszczędność paliwa i dotarcie do celu tak szybko, jak to możliwe .
cffk 24.04.17
... i dlaczego rzeczywista ścieżka uwzględni strumień Jet.
Vince
2
Gall-Peters jest rzutem o równej powierzchni, który nie jest w równej odległości. Dla równoodległych chcesz czegoś w rodzaju azymutalnej projekcji ortograficznej skoncentrowanej na źródle.
HeikkiVesanto
Tak, nie myślałem. Projekcyjna projekcja wykona również rozsądną robotę przy zachowaniu odległości, tak
stożek