Mapa de Aviões

10

Eu gostaria de criar um mapa (web) que mostre o alcance de um avião em alguns aeroportos.

Tentei calcular um buffer com o alcance do avião. Aqui você pode ver o resultado aqui .

Mas agora percebi que o resultado está errado, porque os aviões não seguem a rota reta, mas fazem uma curva porque é mais curta.

Existe uma maneira de calcular o intervalo com a curva mais curta?

Riker
fonte

Respostas:

20

Você pode usar a biblioteca proj4 para descrever um círculo usando a distância do grande círculo.

Por exemplo, aqui está um raio de 3000 km de Edimburgo, Tóquio, Cidade do Cabo e Quito em wgs84 / Equiretangular. Apenas Quito é vagamente "redondo", devido à sua proximidade com o equador. Também adicionei uma única linha de raios densos a um azimute de 36 graus (aproximadamente NE)

insira a descrição da imagem aqui

Se mudarmos para uma projeção equidistante azimutal centrada em Edimburgo, você verá o raio ao redor de Edimburgo se resolver em um círculo ...

insira a descrição da imagem aqui

No Mercator (como seu aplicativo da web), você vê mais distorção à medida que se afasta do equador, mas os buffers são mais elípticos.

insira a descrição da imagem aqui

O código python a seguir faz isso (requer pyproj e bem torneado )

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

Você pode colar a saída WKT no QGIS usando o útil plugin QuickWKT .

Você pode usar outros métodos - como o Coneypylon mencionado, você pode criar um círculo em uma projeção equidistante personalizada em metros, centrada no seu ponto de partida. Acho que, para grandes distâncias, ocorre um erro (apenas alguns quilômetros a 2000 km, mas, para distâncias intercontinentais, esses erros podem aumentar)

De memória, o plugin mmqgis permite buffer em km. Não tenho certeza de qual método ele usa.

Observe que você pode ter problemas para renderizar polígonos no QGIS que cruzam o antimeridiano se você estiver iniciando na Ásia - ogr2ogr com a opção -wrapdateline pode ajudar aqui. Você pode achar que isso é um problema menor com os openlayers / folheto, IIRC, eles permitem longitudes maiores que 180 e menores que -180.

Há uma boa descrição sobre o buffer geodésico aqui no blog da esri .

Steven Kay
fonte
8

Dependendo da origem das informações da distância, isso pode não ser importante. Se você tiver um número simples fornecendo a distância, a distância será a mesma em qualquer projeção de mapa que mostre a distância com precisão (não a Mercator, pense em praticamente qualquer projeção "equidistante", como uma projeção ortográfica azimutal ou similar. como Lambert Conformal Conic fará um trabalho razoavelmente bem à distância.). Se você calcular e criar os buffers em uma projeção equidistante, eles serão (razoavelmente) precisos, veja aqui como é calculada a distância: Ajuda do ArcGIS

Certifique-se de definir o sistema de coordenadas da camada em uma projeção equidistante, não apenas no quadro de dados.

Uma vez calculado, o buffer será deformado adequadamente quando colocado no Web Mercator ou em qualquer outra projeção da Web que você pretenda usar.

No que diz respeito ao motivo pelo qual as próprias linhas são curvas, e por que isso pode criar problemas:

O principal problema é que as rotas planas em uma projeção Mercator como esta são exibidas como curvas, da seguinte forma:

Mapa de rotas da Air Canada

Esse é um problema fundamental nos mapas Mercator, pois eles são destinados à navegação náutica, onde as propriedades das linhas retas nessas projeções são valiosas (uma linha reta na projeção Mercator é uma linha de rumo; uma linha com a mesma bússola na jornada inteira).

No entanto, os aviões não voam nas linhas de rumo, porque a eficiência do combustível é mais importante do que a simples navegação e, portanto, voam ao longo dos Grandes Círculos, que aparecem como curvas em uma projeção Mercator.

coneypylon
fonte
eficiência de combustível e chegar ao destino o mais rápido possível .
cffk
... e é por isso que o caminho real levará o Jet Stream em consideração.
Vince
2
Gall-Peters é uma projeção de área igual e não equidistante. Para equidistantes, você deseja algo como uma Projeção Ortográfica Azimutal centrada na sua fonte.
precisa saber é o seguinte
Sim, eu não estava pensando. Uma projeção conformal também irá fazer um trabalho razoável a preservar distância, sim
coneypylon