Harita Aralığı Uçaklar


10

Bazı havaalanlarında bir Uçak aralığını gösteren (web) bir harita oluşturmak istiyorum.

Uçağın menziliyle bir tampon hesaplamaya çalıştım. Burada sonucu burada görebilirsiniz .

Ama şimdi sonucun yanlış olduğunu fark ettim çünkü uçaklar düz bir rota izlemiyor, ancak daha kısa olduğu için bir eğri uçuyor.

Aralığı daha kısa eğri ile hesaplamanın bir yolu var mı?

Yanıtlar:


20

Büyük daire mesafesini kullanarak bir daireyi tanımlamak için proj4 kütüphanesini kullanabilirsiniz .

Örneğin, Edinburgh, Tokyo, Cape Town ve Quito'dan wgs84 / Equirectangular cinsinden 3000 km'lik bir yarıçap. Ekvator ile olan yakınlığı nedeniyle sadece Quito belirsiz bir şekilde 'yuvarlak'. Ayrıca 36 derecelik bir azimutta tek bir yoğunlaştırılmış jant teli hattına ekledim (yaklaşık NE)

resim açıklamasını buraya girin

Edinburgh merkezli azimuthal eşitlikli bir projeksiyona geçersek, Edinburgh çevresindeki yarıçapın bir çembere dönüştüğünü göreceksiniz ...

resim açıklamasını buraya girin

Mercator'da (web uygulamanız gibi) ekvatordan uzaklaştıkça daha fazla bozulma görürsünüz, ancak tamponlar daha eliptiktir.

resim açıklamasını buraya girin

Aşağıdaki python kodu bunu yapar ( pyproj ve düzgün bir şekilde gerektirir )

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

WKT çıktısını kullanışlı QuickWKT eklentisini kullanarak QGIS'e yapıştırabilirsiniz .

Diğer yöntemleri kullanabilirsiniz - coneypylon'un belirttiği gibi, başlangıç ​​noktanıza ortalanmış, metre cinsinden özel eşit uzaklıktaki bir projeksiyon üzerinde bir daire oluşturabilirsiniz. Ancak büyük mesafeler için bir hata sürünüyor (2000 km'de sadece birkaç km, ancak kıtalararası mesafeler için bu hatalar artabilir)

Mmqgis eklentisi bellekten km olarak arabelleğe almayı sağlar. Yine de hangi yöntemi kullandığından emin değilim.

- Eğer Asya'da başlıyorsanız Antimeridyen çapraz QGIS sıra poligonları oluşturmakta sorun olabileceğini Not ogr2ogr ile -wrapdateline burada yardımcı olabilir seçeneği. Bunun açık katmanlar / broşürler ile ilgili daha az sorun olduğunu görebilirsiniz, IIRC, 180'den büyük ve -180'den küçük boylara izin verir.

Burada, esri blogunda jeodezik tamponlama hakkında iyi bir yazı var .


8

Mesafe bilgilerinizin nereden geldiğine bağlı olarak, bu önemli olmayabilir. Mesafeyi veren basit bir numaranız varsa mesafe, mesafeyi doğru bir şekilde gösteren herhangi bir harita projeksiyonunda aynı olacaktır (Mercator değil, azimuthal ortografik projeksiyon veya benzeri gibi "eşit uzaklıktaki" projeksiyonları düşünün. Lambert Conformal Conic gibi mesafeden gayet iyi bir iş çıkarır.). Eşit uzaklıktaki bir projeksiyonda tamponları hesaplar ve yaratırsanız, (oldukça) doğru olurlar, mesafenin nasıl hesaplandığına bakın: ArcGIS Yardım

Katmanın koordinat sistemini yalnızca veri çerçevesinde değil eşit mesafeli bir projeksiyonda ayarladığınızdan emin olun.

Hesaplandıktan sonra, arabellek Web Mercator'a veya kullanmayı planladığınız diğer web projeksiyonlarına konduğunda buna göre eğilir.

Çizgilerin neden kavisli olduğu ve neden sorun yaratabileceği ile ilgili olarak:

Temel sorun, bunun gibi bir Mercator projeksiyonundaki düzlem rotalarının kavisli olarak görüntülenmesidir:

Air Canada rota haritası

Bu, Mercator haritaları ile ilgili temel bir sorundur, çünkü bu projeksiyonlardaki düz çizgilerin özelliklerinin değerli olduğu deniz navigasyonu için tasarlanmıştır (bir Mercator projeksiyonundaki düz bir çizgi bir çıkıntı çizgisidir; aynı pusulaya sahip bir çizgi tüm yolculuk).

Bununla birlikte, uçaklar düz çizgiler üzerinde uçmaz, çünkü yakıt verimliliği basit navigasyondan daha önemlidir ve bu nedenle Mercator projeksiyonunda eğriler olarak görünen Büyük Daireler boyunca uçar.


yakıt verimliliği ve hedefe olabildiğince çabuk ulaşmak .
cffk

... bu yüzden asıl yol Jet Akışı'nı dikkate alacak.
Vince

2
Gall-Peters eşit alanlı projeksiyon değildir. Eşitlik için kaynağınıza odaklanmış bir Azimuthal Ortografik Projeksiyon gibi bir şey istersiniz.
HeikkiVesanto

Evet, düşünmüyordum. Konform bir projeksiyon da mesafeyi korumak için makul bir iş yapacak, evet
coneypylon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.