Puede usar la biblioteca proj4 para describir un círculo usando la distancia del gran círculo.
Por ejemplo, aquí hay un radio de 3000 km desde Edimburgo, Tokio, Ciudad del Cabo y Quito en wgs84 / Equirectangular. Solo Quito es vagamente 'redondo', debido a su proximidad al ecuador. También agregué una sola línea de radio densificada con un acimut de 36 grados (aproximadamente NE)
Si cambiamos a una proyección equidistante acimutal centrada en Edimburgo, verá que el radio alrededor de Edimburgo se resuelve en un círculo ...
En Mercator (como su aplicación web), ve más distorsión a medida que se aleja del ecuador, pero los búferes son más elípticos.
El siguiente código de Python hace eso (requiere pyproj y bien proporcionado )
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()
Puede pegar la salida WKT en QGIS utilizando el útil complemento QuickWKT .
Podrías usar otros métodos: como mencionó coneypylon, podrías crear un círculo en una proyección equidistante personalizada en metros, centrada en tu punto de partida. Sin embargo, encuentro que para grandes distancias se produce un error (solo unos pocos km a 2000 km, pero para distancias intercontinentales estos errores pueden acumularse)
De memoria, el complemento mmqgis permite el almacenamiento en búfer en km. Sin embargo, no estoy seguro de qué método utiliza.
Tenga en cuenta que puede tener problemas para representar polígonos en QGIS que cruzan el antimeridiano si está comenzando en Asia; ogr2ogr con la opción -wrapdateline puede ayudarlo aquí. Puede encontrar que esto es un problema menor con las capas abiertas / folleto, IIRC permiten longitudes mayores que 180 y menores que -180.
Hay una buena reseña sobre el almacenamiento en búfer geodésico aquí en el blog de esri .