Puoi usare la libreria proj4 per descrivere un cerchio usando la distanza del grande cerchio.
Ad esempio, ecco un raggio di 3000 km da Edimburgo, Tokyo, Città del Capo e Quito in wgs84 / Equirectang. Solo Quito è vagamente "rotondo", a causa della sua vicinanza all'equatore. Ho anche aggiunto una sola linea di raggi densificati ad un azimut di 36 gradi (circa NE)
Se passiamo a una proiezione equidistante azimutale centrata su Edimburgo, vedrai il raggio attorno a Edimburgo trasformarsi in un cerchio ...
Su Mercator (come la tua app web), vedi più distorsione quando ti allontani dall'equatore, ma i buffer sono più ellittici.
Il seguente codice Python fa questo (richiede pyproj e formosa )
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()
È possibile incollare l'output WKT in QGIS utilizzando l'utile plug-in QuickWKT .
Potresti usare altri metodi - come detto coneypylon, potresti creare un cerchio su una proiezione equidistante personalizzata in metri, centrata sul tuo punto di partenza. Trovo che per grandi distanze si verifichi un errore (solo pochi km a 2000 km, ma per distanze intercontinentali questi errori possono aumentare)
Dalla memoria, il plug-in mmqgis consente il buffering in km. Non sono sicuro di quale metodo usi, però.
Nota che potresti avere problemi nel rendering di poligoni in QGIS che attraversano l'antimeridiano se stai iniziando in Asia - ogr2ogr con l' opzione -wrapdateline può aiutarti qui. Potresti scoprire che questo è meno un problema con openlayers / leaflet, IIRC consentono lunghezze superiori a 180 e inferiori a -180.
C'è un buon commento sul buffering geodetico qui sul blog di esri .