Ви можете використовувати бібліотеку proj4 для опису кола, використовуючи відстань великого кола.
Наприклад, ось радіус 3000 км від Едінбурга, Токіо, Кейптауна і Кіто в wgs84 / Equirectangular. Тільки Кіто невиразно «кругле», через близькість до екватора. Я також додав в одну ущільнену колонку за азимутом 36 градусів (приблизно NE)
Якщо ми перейдемо на азимутальну рівновіддалену проекцію, зосереджену на Едінбурзі, ви побачите радіус навколо Едінбурга, який вирішується на коло ...
У Mercator (як у вашому веб-додатку) ви бачите більше спотворень, коли ви віддаляєтесь від екватора, але буфери більш еліптичні.
Наступний код Python робить це (вимагає 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()
Ви можете вставити вихід WKT у QGIS, використовуючи корисний плагін QuickWKT .
Ви можете використовувати інші методи - як згадувалося в коніпілоні, ви можете створити коло на спеціальній рівновіддаленій проекції в метрах, орієнтовану на початкову точку. Я вважаю, що на великих відстанях помилка повзе (лише кілька км на 2000 км, але для міжконтинентальних відстаней ці помилки можуть наростати)
З пам’яті плагін mmqgis дозволяє здійснювати буферизацію в км. Я не впевнений, який метод він використовує.
Зауважте, що у вас можуть виникнути проблеми з рендерінгом полігонів у QGIS, які перетинають антимеридіан, якщо ви починаєте в Азії - тут може допомогти ogr2ogr з опцією -wrapdateline . Ви можете виявити, що це менше проблеми з відкритими шарами / листівками, IIRC вони дозволяють довготи більше 180 і менше -180.
Тут є хороша інформація про геодезичну буферизацію тут на блозі esri .