답변:
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 블로그 에 측지 버퍼링에 대한 좋은 글이 있습니다 .
거리 정보의 출처에 따라이 문제는 중요하지 않을 수 있습니다. 거리를 제공하는 간단한 숫자가있는 경우 거리는 거리를 정확하게 보여주는 메르카토르가 아닌 모든지도 투영에서 동일합니다. Lambert Conformal Conic과 같이 원거리에서도 합리적으로 괜찮습니다.). 등거리 투영에서 버퍼를 계산하고 생성하는 경우 (정당하게) 정확합니다. 거리 계산 방법은 여기를 참조하십시오. ArcGIS Help
레이어의 좌표계가 데이터 프레임뿐만 아니라 등거리 투영으로 설정되어 있는지 확인하십시오.
일단 계산되면, Web Mercator 또는 다른 웹 프로젝션에 넣을 때 버퍼가 그에 따라 뒤 틀립니다.
왜 선 자체가 곡선이고 왜 이것이 문제를 일으킬 수 있는가?
이 문제와 같은 메르카토르 투영법의 평면 경로는 다음과 같이 곡선으로 표시됩니다.
해상 항법을 목적으로하는 메르카토르지도의 근본적인 문제입니다.이 투상에서 직선의 속성이 중요합니다 (메르카토르 투영의 직선은 마름모꼴 선입니다. 전체 여행).
그러나 비행기는 마름모꼴 선을 따라 비행하지 않습니다. 연료 효율이 간단한 탐색보다 중요하기 때문에 메르카토르 투영시 곡선으로 나타나는 원을 따라 비행하기 때문입니다.