10 votos

Mapa de rango de aviones

Me gustaría crear un mapa (web), que muestra la gama de un avión alrededor de algunos aeropuertos.

He intentado calcular un búfer con la gama del avión. Aquí podrá ver el resultado aquí.

Pero ahora me he dado cuenta que el resultado es incorrecto porque aviones no tomar la ruta recta pero volar una curva porque su más corto.

¿Hay una forma para calcular la gama con la curva más corta?

20voto

Mat Puntos 196

Usted podría utilizar la proj4 biblioteca para describir un círculo con el gran círculo de la distancia.

Por ejemplo, aquí está 3000 kilometros radio de Edimburgo, Tokio, Ciudad del Cabo y Quito en wgs84/Equirectangular. Sólo Quito es vagamente 'la ronda', debido a su proximidad al ecuador. También he añadido en una sola densificado habló de la línea en un azimut de 36 grados (aprox NE)

enter image description here

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

enter image description here

En Mercator (como su aplicación web), puedes ver más distorsión a medida que se aleja de la línea del ecuador, pero los amortiguadores son más elíptica.

enter image description here

El siguiente código en python que hace que (requiere pyproj y bien formada)

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 el WKT de salida en QGIS usando el útil QuickWKT plugin.

Usted podría utilizar otros métodos - como coneypylon mencionado, podría crear un círculo en una costumbre a la misma distancia de proyección en metros, centrada en su punto de partida. Me parece sin embargo que para las grandes distancias que hay un error que se arrastra (sólo un par de km a 2000 km, pero intercontinental distancias de estos errores se pueden montar)

De la memoria, la mmqgis plugin permite el almacenamiento en búfer en el km. No estoy seguro de qué método se utiliza, sin embargo.

Tenga en cuenta que usted podría tener problemas para renderizar polígonos en QGIS que cruzar el antimeridian si estás empezando en Asia - ogr2ogr con el -wrapdateline opción puede ayudar aquí. Usted puede encontrar que esto es menos de un problema con openlayers/folleto, si mal no recuerdo permiten longitudes de más de 180 y menos de -180.

Hay una buena valoración crítica sobre geodésica de almacenamiento en búfer aquí en el blog de esri.

8voto

coneypylon Puntos 21

Dependiendo de donde la distancia info viene, puede que esto no importa. Si usted tiene un número simple de dar a la distancia, la distancia será la misma en cualquier proyección del mapa que muestra la distancia con precisión (no Mercator, creo que casi cualquier "equidistante" de proyección, tales como azimutal proyección ortográfica o similar. Una de conformación de proyección, como Lambert Conformal Conic va a hacer un trabajo razonablemente bien en la distancia.). Si usted calcular y crear los buffers en una proyección equidistante, van a ser (casi) exacta, consulte aquí cómo la distancia se calcula: ArcGIS Ayuda

Asegúrese de configurar la capa del sistema de coordenadas se encuentra en una proyección equidistante, no sólo en el marco de datos.

Una vez calculado, el búfer de deformación en consecuencia, cuando se lo pone en la Web Mercator o cualquier otra web de proyección que tiene la intención de usar.

Tan lejos como ¿por qué las líneas de sí mismos son curvas, y por qué esto puede crear problemas:

El problema clave es que el plano de rutas de la proyección de Mercator como esta se muestran como curvas, así:

Air Canada route map

Este es un problema fundamental con mapas de Mercator, como a los que están destinados para náuticas de navegación, donde las propiedades de las líneas rectas en estas proyecciones es valiosa (en línea recta sobre una proyección de Mercator es una línea de rumbo; una línea con la misma dirección de la brújula a través de todo el viaje).

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

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