Anda bisa menggunakan pustaka proj4 untuk menggambarkan lingkaran menggunakan jarak lingkaran-besar.
Misalnya, di sini radius 3000 km dari Edinburgh, Tokyo, Cape Town, dan Quito di wgs84 / Equirectangular. Hanya Quito yang 'bulat', karena kedekatannya dengan garis katulistiwa. Saya juga telah menambahkan dalam satu garis bicara padat pada azimuth 36 derajat (sekitar NE)
Jika kami beralih ke proyeksi azimuth equidistant yang berpusat di Edinburgh, Anda akan melihat jari-jari di sekitar Edinburgh ...
Di Mercator (seperti aplikasi web Anda), Anda melihat lebih banyak distorsi saat Anda menjauh dari khatulistiwa, tetapi buffer lebih elips.
Berikut kode python melakukan itu (membutuhkan pyproj dan rupawan )
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()
Anda dapat menempelkan output WKT ke QGIS menggunakan plugin QuickWKT yang bermanfaat .
Anda bisa menggunakan metode lain - seperti yang disebutkan coneypylon, Anda bisa membuat lingkaran pada proyeksi berjarak sama kustom dalam meter, berpusat pada titik awal Anda. Namun saya menemukan bahwa untuk jarak yang jauh terjadi kesalahan (hanya beberapa km pada 2000 km, tetapi untuk jarak antar benua kesalahan ini dapat meningkat)
Dari memori, plugin mmqgis memungkinkan buffering dalam km. Saya tidak yakin metode apa yang digunakannya.
Perhatikan bahwa Anda mungkin memiliki masalah dalam membuat poligon di QGIS yang melintasi antimeridian jika Anda mulai di Asia - ogr2ogr dengan opsi -wrapdateline dapat membantu di sini. Anda mungkin menemukan ini kurang dari masalah dengan openlayers / leaflet, IIRC mereka memungkinkan garis bujur lebih besar dari 180 dan kurang dari -180.
Ada artikel bagus tentang buffering geodesik di blog esri ini .