Mappa Gamma di aeroplani


10

Vorrei creare una mappa (web) che mostri la portata di un aeroplano intorno ad alcuni aeroporti.

Ho provato a calcolare un buffer con l'autonomia dell'aereo. Qui puoi vedere il risultato qui .

Ma ora ho capito che il risultato è sbagliato perché gli aerei non prendono la retta via ma volano una curva perché è più corta.

C'è un modo per calcolare l'intervallo con la curva più breve?

Risposte:


20

Puoi usare la libreria proj4 per descrivere un cerchio usando la distanza del grande cerchio.

Ad esempio, ecco un raggio di 3000 km da Edimburgo, Tokyo, Città del Capo e Quito in wgs84 / Equirectang. Solo Quito è vagamente "rotondo", a causa della sua vicinanza all'equatore. Ho anche aggiunto una sola linea di raggi densificati ad un azimut di 36 gradi (circa NE)

inserisci qui la descrizione dell'immagine

Se passiamo a una proiezione equidistante azimutale centrata su Edimburgo, vedrai il raggio attorno a Edimburgo trasformarsi in un cerchio ...

inserisci qui la descrizione dell'immagine

Su Mercator (come la tua app web), vedi più distorsione quando ti allontani dall'equatore, ma i buffer sono più ellittici.

inserisci qui la descrizione dell'immagine

Il seguente codice Python fa questo (richiede pyproj e formosa )

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

È possibile incollare l'output WKT in QGIS utilizzando l'utile plug-in QuickWKT .

Potresti usare altri metodi - come detto coneypylon, potresti creare un cerchio su una proiezione equidistante personalizzata in metri, centrata sul tuo punto di partenza. Trovo che per grandi distanze si verifichi un errore (solo pochi km a 2000 km, ma per distanze intercontinentali questi errori possono aumentare)

Dalla memoria, il plug-in mmqgis consente il buffering in km. Non sono sicuro di quale metodo usi, però.

Nota che potresti avere problemi nel rendering di poligoni in QGIS che attraversano l'antimeridiano se stai iniziando in Asia - ogr2ogr con l' opzione -wrapdateline può aiutarti qui. Potresti scoprire che questo è meno un problema con openlayers / leaflet, IIRC consentono lunghezze superiori a 180 e inferiori a -180.

C'è un buon commento sul buffering geodetico qui sul blog di esri .


8

A seconda della provenienza delle informazioni sulla distanza, ciò potrebbe non avere importanza. Se hai un numero semplice che indica la distanza, la distanza sarà la stessa su qualsiasi proiezione della mappa che mostra la distanza in modo accurato (non Mercatore, pensa praticamente a qualsiasi proiezione "equidistante", come una proiezione ortografica azimutale o simile. Una proiezione conforme, come Lambert Conformal Conic farà un lavoro ragionevolmente ok a distanza.). Se calcoli e crei i buffer in una proiezione equidistante, saranno (abbastanza) accurati, vedi qui come viene calcolata la distanza: Guida di ArcGIS

Assicurati di impostare il sistema di coordinate del livello in una proiezione equidistante, non solo il frame di dati.

Una volta calcolato, il buffer si deformerà di conseguenza quando viene inserito in Web Mercator o qualsiasi altra proiezione web che si intende utilizzare.

Per quanto riguarda il motivo per cui le linee stesse sono curve e perché ciò potrebbe creare problemi:

Il problema chiave è che le rotte piane su una proiezione di Mercatore come questa vengono visualizzate come curve, in questo modo:

Mappa delle rotte di Air Canada

Questo è un problema fondamentale con le mappe Mercator, poiché sono destinate alla navigazione nautica, dove le proprietà delle linee rette su queste proiezioni sono preziose (una linea retta su una proiezione Mercator è una linea rombo; una linea con la stessa bussola che si dirige attraverso il intero viaggio).

Tuttavia, gli aerei non volano su rombi, perché l'efficienza del carburante è più importante della semplice navigazione, e quindi volano lungo Great Circles, che appaiono come curve su una proiezione di Mercatore.


efficienza del carburante e arrivare a destinazione il più rapidamente possibile .
Cffk,

... il motivo per cui il percorso effettivo terrà conto del Jet Stream.
Vince il

2
Gall-Peters è una proiezione della stessa area non equidistante. Per equidistante vuoi qualcosa come una proiezione ortografica azimutale centrata sulla tua fonte.
Heikki Vesanto,

Sì, non stavo pensando. Una proiezione conforme farà anche un lavoro ragionevole per preservare la distanza, sì
coneypylon
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.