10 votos

Mapear Rango de Aviones

Me gustaría crear un mapa que muestre el rango de un avión alrededor de algunos aeropuertos.

Intenté calcular un buffer con el rango 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 siguen la ruta recta, sino que vuelan en curva porque es más corto.

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

20voto

Mat Puntos 196

Puedes 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 he agregado una sola línea de radio densificada con un azimut de 36 grados (aprox. NE)

introducir descripción de la imagen aquí

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

introducir descripción de la imagen aquí

En Mercator (como tu aplicación web), ves más distorsión a medida que te alejas del ecuador, pero los buffers son más elípticos.

introducir descripción de la imagen aquí

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

import pyproj
from shapely.geometry import Polygon, MultiPoint, LineString
import math

def geodesicpointbuffer(longitude, latitude,
                        segments, distance_m,
                        geom_type=MultiPoint):
    """
    Crea un buffer en metros alrededor de un punto dado como longitud, latitud en WGS84
    Usa la geodésica, por lo que debería ser más preciso en distancias largas

    :param longitude: longitud de punto central
    :param latitude: latitud de punto central
    :param segments: segmentos para aproximar (más = más suave)
    :param distance_m: distancia en metros
    :param geom_type: tipo shapely (por ejemplo, Multipoint, Linestring, Polygon)
    :return: tupla (cadena proj4, WKT de la geometría del buffer)
    """
    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))
        # hace un gran círculo para una línea de radio.
        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)) # asegúrate de incluir el punto final ;-)
            flight = LineString(coords2)
            print(flight.wkt)

    ring = geom_type(coords)
    return "+init=EPSG:4326", ring.wkt

def main():
    # ejemplo: Ciudad del Cabo. Buffer de 3000 km.
    spec, wkt = geodesicpointbuffer(18.4637082653, -33.8496404007, 2000, 3000000.0, Polygon)
    print(spec)
    print(wkt)

if __name__ == "__main__":
    main()

Puedes pegar la salida de WKT en QGIS usando el útil plugin QuickWKT.

Puedes usar otros métodos - como mencionó coneypylon, puedes crear un círculo en una proyección equidistante personalizada en metros, centrada en tu punto de partida. Sin embargo, encuentro que para distancias largas 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 realizar buffering en km. No estoy seguro qué método utiliza, sin embargo.

Ten en cuenta que puedes tener problemas para renderizar polígonos en QGIS que crucen el antimeridiano si estás comenzando en Asia - ogr2ogr con la opción -wrapdateline puede ayudar aquí. Es posible que encuentres que esto es menos problema con openlayers/leaflet, si mal no recuerdo, permiten longitudes mayores que 180 y menores que -180.

Hay un buen artículo sobre el buffering geodésico aquí en el blog de esri.

8voto

coneypylon Puntos 21

Dependiendo de dónde provenga tu información de distancia, esto puede no importar. Si tienes un número simple que da la distancia, la distancia será la misma en cualquier proyección de mapa que muestre la distancia de manera precisa (no Mercator, piensa en prácticamente cualquier proyección "equidistante", como una proyección ortográfica azimutal u similar. Una proyección conforme, como la Cónica Conforme de Lambert, hará un trabajo bastante aceptable en la distancia.). Si calculas y creas los buffers en una proyección equidistante, serán (bastante) precisos, mira aquí cómo se calcula la distancia: Ayuda de ArcGIS

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

Una vez calculado, el buffer se ajustará de acuerdo al ser insertado en Web Mercator u cualquier otra proyección web que planees utilizar.

En cuanto a por qué las líneas mismas están curvadas, y por qué esto podría crear problemas:

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

Mapa de rutas de Air Canada

Este es un problema fundamental con los mapas de Mercator, ya que están diseñados para la navegación náutica, donde las propiedades de 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 dirección de brújula durante todo el trayecto).

Sin embargo, los aviones no vuelan en líneas de rumbo, porque la eficiencia de 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.

0 votos

Eficiencia de combustible y llegar al destino lo más rápido posible.

0 votos

...por lo que la ruta real tendrá en cuenta la Corriente en Chorro.

2 votos

Gall-Peters es una proyección de área igual y no equidistante. Para equidistante, querrás algo como una Proyección Ortográfica Azimutal centrada en tu origen.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X