Você pode usar a biblioteca proj4 para descrever um círculo usando a distância do grande círculo.
Por exemplo, aqui está um raio de 3000 km de Edimburgo, Tóquio, Cidade do Cabo e Quito em wgs84 / Equiretangular. Apenas Quito é vagamente "redondo", devido à sua proximidade com o equador. Também adicionei uma única linha de raios densos a um azimute de 36 graus (aproximadamente NE)
Se mudarmos para uma projeção equidistante azimutal centrada em Edimburgo, você verá o raio ao redor de Edimburgo se resolver em um círculo ...
No Mercator (como seu aplicativo da web), você vê mais distorção à medida que se afasta do equador, mas os buffers são mais elípticos.
O código python a seguir faz isso (requer pyproj e bem torneado )
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()
Você pode colar a saída WKT no QGIS usando o útil plugin QuickWKT .
Você pode usar outros métodos - como o Coneypylon mencionado, você pode criar um círculo em uma projeção equidistante personalizada em metros, centrada no seu ponto de partida. Acho que, para grandes distâncias, ocorre um erro (apenas alguns quilômetros a 2000 km, mas, para distâncias intercontinentais, esses erros podem aumentar)
De memória, o plugin mmqgis permite buffer em km. Não tenho certeza de qual método ele usa.
Observe que você pode ter problemas para renderizar polígonos no QGIS que cruzam o antimeridiano se você estiver iniciando na Ásia - ogr2ogr com a opção -wrapdateline pode ajudar aqui. Você pode achar que isso é um problema menor com os openlayers / folheto, IIRC, eles permitem longitudes maiores que 180 e menores que -180.
Há uma boa descrição sobre o buffer geodésico aqui no blog da esri .