Vous pouvez utiliser la bibliothèque proj4 pour décrire un cercle en utilisant la distance du grand cercle.
Par exemple, voici un rayon de 3000 km entre Édimbourg, Tokyo, Le Cap et Quito dans wgs84 / Equirectangular. Seul Quito est vaguement «rond», en raison de sa proximité avec l'équateur. J'ai également ajouté une seule ligne de rayons densifiée à un azimut de 36 degrés (environ NE)
Si nous passons à une projection équidistante azimutale centrée sur Édimbourg, vous verrez le rayon autour d'Édimbourg se résoudre en cercle ...
Sur Mercator (comme votre application Web), vous voyez plus de distorsion lorsque vous vous éloignez de l'équateur, mais les tampons sont plus elliptiques.
Le code python suivant fait cela (nécessite pyproj et bien fait )
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()
Vous pouvez coller la sortie WKT dans QGIS à l'aide du plugin QuickWKT utile .
Vous pouvez utiliser d'autres méthodes - comme mentionné en coneypylon, vous pouvez créer un cercle sur une projection équidistante personnalisée en mètres, centrée sur votre point de départ. Je trouve cependant que pour les grandes distances une erreur se glisse (seulement quelques km à 2000 km, mais pour les distances intercontinentales ces erreurs peuvent monter)
De mémoire, le plugin mmqgis permet la mise en mémoire tampon en km. Cependant, je ne sais pas quelle méthode il utilise.
Notez que vous pourriez avoir des problèmes de rendu des polygones dans QGIS qui traversent l'antiméridien si vous commencez en Asie - ogr2ogr avec l' option -wrapdateline peut vous aider ici. Vous pourriez trouver que c'est moins un problème avec les couches ouvertes / dépliants, IIRC ils permettent des longitudes supérieures à 180 et inférieures à -180.
Il y a une bonne synthèse sur la mise en mémoire tampon géodésique ici sur le blog esri .