Bạn có thể sử dụng thư viện proj4 để mô tả một vòng tròn bằng khoảng cách vòng tròn lớn.
Ví dụ: đây là bán kính 3000km từ Edinburgh, Tokyo, Cape Town và Quito trong wss84 / Equir chữ nhật. Chỉ có một mình mơ hồ là 'vòng', do nằm gần xích đạo. Tôi cũng đã thêm vào một dòng nói dày đặc ở góc phương vị 36 độ (khoảng NE)
Nếu chúng ta thay đổi thành một phép chiếu tương đương góc phương vị tập trung vào Edinburgh, bạn sẽ thấy bán kính xung quanh Edinburgh phân giải thành một vòng tròn ...
Trên Mercator (như ứng dụng web của bạn), bạn sẽ thấy nhiều biến dạng hơn khi bạn di chuyển ra khỏi đường xích đạo, nhưng bộ đệm có nhiều hình elip hơn.
Mã python sau đây thực hiện điều đó (yêu cầu pyproj và tạo hình )
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()
Bạn có thể dán đầu ra WKT vào QGIS bằng cách sử dụng plugin QuickWKT hữu ích .
Bạn có thể sử dụng các phương pháp khác - như coneypylon đã đề cập, bạn có thể tạo một vòng tròn trên hình chiếu tương đương tùy chỉnh tính bằng mét, tập trung vào điểm bắt đầu của bạn. Mặc dù vậy, tôi thấy rằng đối với các khoảng cách lớn, một lỗi xuất hiện (chỉ một vài km ở 2000 km, nhưng đối với các khoảng cách liên lục địa, các lỗi này có thể tăng lên)
Từ bộ nhớ, plugin mmqgis cho phép đệm theo km. Tôi không chắc chắn nó sử dụng phương pháp nào, mặc dù.
Lưu ý rằng bạn có thể gặp vấn đề khi hiển thị đa giác trong QGIS vượt qua phản hạt nếu bạn bắt đầu ở Châu Á - ogr2ogr với tùy chọn -wrapdateline có thể giúp đỡ ở đây. Bạn có thể thấy đây không phải là vấn đề với openlayers / tờ rơi, IIRC họ cho phép kinh độ lớn hơn 180 và nhỏ hơn -180.
Có một bài viết hay về bộ đệm trắc địa ở đây trên blog esri .