비행기의지도 범위


10

일부 공항 주변의 비행기 범위를 보여주는 (웹)지도를 만들고 싶습니다.

비행기의 범위로 버퍼를 계산하려고했습니다. 여기에서 결과를 볼 수 있습니다 .

그러나 이제는 비행기가 직선 경로를 취하지 않고 곡선이 짧아지기 때문에 결과가 잘못되었음을 깨달았습니다.

더 짧은 곡선으로 범위를 계산하는 방법이 있습니까?

답변:


20

proj4 라이브러리를 사용하여 원 거리를 사용하여 원을 설명 할 수 있습니다 .

예를 들어, 에딘버러, 도쿄, 케이프 타운 및 키토에서 wgs84 / Equirectangular의 반경은 3000km입니다. 적도와의 근접성 때문에 키토 만이 모호하게 '둥글다'. 또한 36도 (약 NE)의 방위각으로 단일 고밀도 스포크 라인에 추가했습니다.

여기에 이미지 설명을 입력하십시오

에딘버러를 중심으로 방위각 등거리 투영으로 변경하면 에딘버러 주변의 반경이 원으로 해석됩니다.

여기에 이미지 설명을 입력하십시오

Mercator (예 : 웹 앱)에서는 적도에서 멀어 질수록 왜곡이 더 많이 발생하지만 버퍼는 더 타원형입니다.

여기에 이미지 설명을 입력하십시오

(요구하는 다음 파이썬 코드는 않습니다 pyproj를 하고 매끈한 )

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

유용한 QuickWKT 플러그인을 사용하여 WKT 출력을 QGIS에 붙여 넣을 수 있습니다 .

Coneypylon이 언급했듯이 다른 방법을 사용할 수 있습니다. 시작점을 중심으로 미터 단위의 맞춤형 등거리 투영에 원을 만들 수 있습니다. 비록 장거리에서는 오류가 발생합니다 (2000km에서 불과 몇 km, 대륙간 거리의 경우 이러한 오류가 발생할 수 있음)

메모리에서 mmqgis 플러그인은 km 단위의 버퍼링을 허용합니다. 그래도 어떤 방법을 사용하는지 잘 모르겠습니다.

- 당신은 당신이 아시아에서 시작하는 경우 자오선을 통과 QGIS에서 다각형 렌더링 문제가있을 수 있음을 참고 ogr2ogr-wrapdateline 여기에 도움이 옵션을 선택합니다. 오픈 레이어 / 리플렛에서 문제가 덜 발견 될 수 있습니다. IIRC에서는 180보다 크고 -180보다 작은 경도를 허용합니다.

esri 블로그 에 측지 버퍼링에 대한 좋은 글이 있습니다 .


8

거리 정보의 출처에 따라이 문제는 중요하지 않을 수 있습니다. 거리를 제공하는 간단한 숫자가있는 경우 거리는 거리를 정확하게 보여주는 메르카토르가 아닌 모든지도 투영에서 동일합니다. Lambert Conformal Conic과 같이 원거리에서도 합리적으로 괜찮습니다.). 등거리 투영에서 버퍼를 계산하고 생성하는 경우 (정당하게) 정확합니다. 거리 계산 방법은 여기를 참조하십시오. ArcGIS Help

레이어의 좌표계가 데이터 프레임뿐만 아니라 등거리 투영으로 설정되어 있는지 확인하십시오.

일단 계산되면, Web Mercator 또는 다른 웹 프로젝션에 넣을 때 버퍼가 그에 따라 뒤 틀립니다.

왜 선 자체가 곡선이고 왜 이것이 문제를 일으킬 수 있는가?

이 문제와 같은 메르카토르 투영법의 평면 경로는 다음과 같이 곡선으로 표시됩니다.

에어 캐나다 노선도

해상 항법을 목적으로하는 메르카토르지도의 근본적인 문제입니다.이 투상에서 직선의 속성이 중요합니다 (메르카토르 투영의 직선은 마름모꼴 선입니다. 전체 여행).

그러나 비행기는 마름모꼴 선을 따라 비행하지 않습니다. 연료 효율이 간단한 탐색보다 중요하기 때문에 메르카토르 투영시 곡선으로 나타나는 원을 따라 비행하기 때문입니다.


연료 효율과 가능한 빨리 목적지에 도착 .
cffk

... 실제 경로가 Jet Stream을 고려하는 이유입니다.
Vince

2
Gall-Peters는 등거리 투영법이 아닙니다. 등거리의 경우 소스를 중심으로 방위각 직교 투영법과 같은 것을 원합니다.
HeikkiVesanto

네, 생각하지 않았습니다. 등각 투영 또한 보존 거리, 그래에 합당한 일을 할 것입니다
coneypylon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.