Gama de mapas de aviones

10

Me gustaría crear un mapa (web) que muestre el alcance de un avión alrededor de algunos aeropuertos.

Traté de calcular un búfer con el alcance del avión. Aquí puedes ver el resultado aquí .

Pero ahora me he dado cuenta de que el resultado es incorrecto porque los aviones no toman la ruta recta sino que vuelan una curva porque es más corta.

¿Hay alguna manera de calcular el rango con la curva más corta?

Riker
fuente

Respuestas:

20

Puede usar la biblioteca proj4 para describir un círculo usando la distancia del gran círculo.

Por ejemplo, aquí hay un radio de 3000 km desde Edimburgo, Tokio, Ciudad del Cabo y Quito en wgs84 / Equirectangular. Solo Quito es vagamente 'redondo', debido a su proximidad al ecuador. También agregué una sola línea de radio densificada con un acimut de 36 grados (aproximadamente NE)

ingrese la descripción de la imagen aquí

Si cambiamos a una proyección equidistante acimutal centrada en Edimburgo, verá que el radio alrededor de Edimburgo se resuelve en un círculo ...

ingrese la descripción de la imagen aquí

En Mercator (como su aplicación web), ve más distorsión a medida que se aleja del ecuador, pero los búferes son más elípticos.

ingrese la descripción de la imagen aquí

El siguiente código de Python hace eso (requiere pyproj y bien proporcionado )

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

Puede pegar la salida WKT en QGIS utilizando el útil complemento QuickWKT .

Podrías usar otros métodos: como mencionó coneypylon, podrías crear un círculo en una proyección equidistante personalizada en metros, centrada en tu punto de partida. Sin embargo, encuentro que para grandes distancias se produce un error (solo unos pocos km a 2000 km, pero para distancias intercontinentales estos errores pueden acumularse)

De memoria, el complemento mmqgis permite el almacenamiento en búfer en km. Sin embargo, no estoy seguro de qué método utiliza.

Tenga en cuenta que puede tener problemas para representar polígonos en QGIS que cruzan el antimeridiano si está comenzando en Asia; ogr2ogr con la opción -wrapdateline puede ayudarlo aquí. Puede encontrar que esto es un problema menor con las capas abiertas / folleto, IIRC permiten longitudes mayores que 180 y menores que -180.

Hay una buena reseña sobre el almacenamiento en búfer geodésico aquí en el blog de esri .

Steven Kay
fuente
8

Dependiendo de dónde provenga su información de distancia, esto puede no importar. Si tiene un número simple que indica la distancia, la distancia será la misma en cualquier proyección de mapa que muestre la distancia con precisión (no en Mercator, piense en casi cualquier proyección "equidistante", como una proyección ortográfica azimutal o similar. Una proyección conforme, como Lambert Conformal Conic hará un trabajo razonablemente bien a la distancia). Si calcula y crea los búferes en una proyección equidistante, serán (bastante) precisos, vea aquí cómo se calcula la distancia: ArcGIS Help

Asegúrese de establecer que el sistema de coordenadas de la capa esté en una proyección equidistante, no solo el marco de datos.

Una vez calculado, el búfer se deformará en consecuencia cuando se coloque en Web Mercator o cualquier otra proyección web que desee utilizar.

En cuanto a por qué las líneas en sí son curvas y por qué esto podría crear problemas:

El problema clave es que las rutas planas en una proyección de Mercator como esta se muestran como curvas, de esta manera:

Mapa de rutas de Air Canada

Este es un problema fundamental con los mapas de Mercator, ya que están destinados a la navegación náutica, donde las propiedades de las líneas rectas en estas proyecciones son valiosas (una línea recta en una proyección de Mercator es una línea de rumbo; una línea con la misma brújula que se dirige a través del viaje completo).

Sin embargo, los aviones no vuelan en líneas de rumbo, porque la eficiencia del combustible es más importante que la simple navegación y, por lo tanto, vuelan a lo largo de Grandes Círculos, que aparecen como curvas en una proyección de Mercator.

coneypylon
fuente
eficiencia de combustible y llegar al destino lo más rápido posible .
cffk
... por eso la ruta real tendrá en cuenta el Jet Stream.
Vince
2
Gall-Peters es una proyección de igual área no equidistante. Para equidistante, desea algo como una proyección ortográfica azimutal centrada en su fuente.
HeikkiVesanto
Sí, no estaba pensando Una proyección conforme también hará un trabajo razonable en la preservación de la distancia, sí
coneypylon