Carte de la gamme d'avions

10

Je voudrais créer une carte (Web), qui montre la portée d'un avion autour de certains aéroports.

J'ai essayé de calculer un tampon avec la portée de l'avion. Ici vous pouvez voir le résultat ici .

Mais maintenant, je me suis rendu compte que le résultat est erroné parce que les avions ne prennent pas la route droite mais parcourent une courbe parce que c'est plus court.

Existe-t-il un moyen de calculer la plage avec la courbe la plus courte?

Riker
la source

Réponses:

20

Vous pouvez utiliser la bibliothèque proj4 pour décrire un cercle en utilisant la distance du grand cercle.

Par exemple, voici un rayon de 3000 km entre Édimbourg, Tokyo, Le Cap et Quito dans wgs84 / Equirectangular. Seul Quito est vaguement «rond», en raison de sa proximité avec l'équateur. J'ai également ajouté une seule ligne de rayons densifiée à un azimut de 36 degrés (environ NE)

entrez la description de l'image ici

Si nous passons à une projection équidistante azimutale centrée sur Édimbourg, vous verrez le rayon autour d'Édimbourg se résoudre en cercle ...

entrez la description de l'image ici

Sur Mercator (comme votre application Web), vous voyez plus de distorsion lorsque vous vous éloignez de l'équateur, mais les tampons sont plus elliptiques.

entrez la description de l'image ici

Le code python suivant fait cela (nécessite pyproj et bien fait )

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

Vous pouvez coller la sortie WKT dans QGIS à l'aide du plugin QuickWKT utile .

Vous pouvez utiliser d'autres méthodes - comme mentionné en coneypylon, vous pouvez créer un cercle sur une projection équidistante personnalisée en mètres, centrée sur votre point de départ. Je trouve cependant que pour les grandes distances une erreur se glisse (seulement quelques km à 2000 km, mais pour les distances intercontinentales ces erreurs peuvent monter)

De mémoire, le plugin mmqgis permet la mise en mémoire tampon en km. Cependant, je ne sais pas quelle méthode il utilise.

Notez que vous pourriez avoir des problèmes de rendu des polygones dans QGIS qui traversent l'antiméridien si vous commencez en Asie - ogr2ogr avec l' option -wrapdateline peut vous aider ici. Vous pourriez trouver que c'est moins un problème avec les couches ouvertes / dépliants, IIRC ils permettent des longitudes supérieures à 180 et inférieures à -180.

Il y a une bonne synthèse sur la mise en mémoire tampon géodésique ici sur le blog esri .

Steven Kay
la source
8

Selon l'origine de vos informations de distance, cela peut ne pas avoir d'importance. Si vous avez un simple nombre donnant la distance, la distance sera la même sur toute projection de carte qui montre la distance avec précision (pas Mercator, pensez à peu près à n'importe quelle projection "équidistante", comme une projection orthographique azimutale ou similaire. Une projection conforme, comme Lambert Conformal Conic fera un travail assez correct à distance.). Si vous calculez et créez les tampons dans une projection équidistante, ils seront (assez) précis, voir ici comment la distance est calculée: Aide d'ArcGIS

Assurez-vous de définir le système de coordonnées du calque dans une projection équidistante, pas seulement le bloc de données.

Une fois calculé, le tampon se déformera en conséquence lorsqu'il sera placé dans Web Mercator ou dans toute autre projection Web que vous prévoyez d'utiliser.

En ce qui concerne pourquoi les lignes elles-mêmes sont incurvées et pourquoi cela pourrait créer des problèmes:

Le problème clé est que les routes planes sur une projection Mercator comme celle-ci sont affichées comme courbes, comme ceci:

Carte d'itinéraire d'Air Canada

C'est un problème fondamental avec les cartes Mercator, car elles sont destinées à la navigation nautique, où les propriétés des lignes droites sur ces projections sont précieuses (une ligne droite sur une projection Mercator est une ligne de rhumb; une ligne avec la même boussole se dirigeant vers le voyage entier).

Cependant, les avions ne volent pas sur des lignes de rhumb, car l'efficacité en carburant est plus importante que la navigation simple, et volent donc le long de grands cercles, qui apparaissent sous forme de courbes sur une projection Mercator.

coneypylon
la source
l'efficacité énergétique et se rendre à destination le plus rapidement possible .
cffk
... ce pourquoi le chemin réel tiendra compte du Jet Stream.
Vince
2
Gall-Peters est une projection à aire égale non équidistante. Pour l'équidistance, vous voulez quelque chose comme une projection orthographique azimutale centrée sur votre source.
HeikkiVesanto
Ouais, je ne pensais pas. Une projection conforme fera également un travail raisonnable pour préserver la distance, oui
coneypylon