Mit der proj4- Bibliothek können Sie einen Kreis anhand des Großkreisabstands beschreiben.
Hier ist zum Beispiel ein Radius von 3000 km von Edinburgh, Tokio, Kapstadt und Quito in wgs84 / Equirectangular. Nur Quito ist aufgrund seiner Nähe zum Äquator vage "rund". Ich habe auch eine einzelne verdichtete Speichenlinie mit einem Azimut von 36 Grad (ca. NE) hinzugefügt.
Wenn wir zu einer azimutalen äquidistanten Projektion mit Schwerpunkt auf Edinburgh wechseln, wird der Radius um Edinburgh in einen Kreis aufgelöst ...
Auf Mercator (wie in Ihrer Web-App) sehen Sie mehr Verzerrungen, wenn Sie sich vom Äquator entfernen, aber die Puffer sind elliptischer.
Der folgende Python - Code tut dem (erfordert pyproj und wohlgeformt )
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()
Sie können die WKT-Ausgabe mit dem nützlichen QuickWKT- Plugin in QGIS einfügen .
Sie können auch andere Methoden verwenden. Wie bereits erwähnt, können Sie auf einer benutzerdefinierten äquidistanten Projektion in Metern einen Kreis erstellen, der auf Ihrem Startpunkt zentriert ist. Ich finde jedoch, dass sich bei großen Entfernungen ein Fehler einschleicht (nur wenige Kilometer bei 2000 km, aber bei interkontinentalen Entfernungen können diese Fehler auftreten).
Aus dem Speicher ermöglicht das mmqgis- Plugin das Puffern in km. Ich bin mir jedoch nicht sicher, welche Methode es verwendet.
Beachten Sie, dass Sie möglicherweise Probleme beim Rendern von Polygonen in QGIS haben, die den Antimeridian überschreiten, wenn Sie in Asien starten. Ogr2ogr mit der Option -wrapdateline kann hier Abhilfe schaffen. Möglicherweise ist dies bei Openlayern / Faltblättern weniger problematisch. IIRC ermöglichen Längengrade von mehr als 180 und weniger als -180.
Hier im esri-Blog gibt es eine gute Beschreibung der geodätischen Pufferung .