Możesz użyć biblioteki proj4 do opisania koła za pomocą odległości wielkiego koła.
Na przykład, oto promień 3000 km z Edynburga, Tokio, Kapsztadu i Quito w wgs84 / Equirectangular. Tylko Quito jest niejasno „okrągłe” ze względu na bliskość równika. Dodałem również w jednej zagęszczonej linii szprychy w azymucie 36 stopni (około NE)
Jeśli zmienimy na azymutalną równoodległą projekcję wyśrodkowaną na Edynburgu, zobaczysz promień wokół Edynburga, który tworzy okrąg ...
W Mercator (podobnie jak w aplikacji internetowej) widać większe zniekształcenia, gdy odsuwasz się od równika, ale bufory są bardziej eliptyczne.
Poniższy kod python robi to (wymaga pyproj i foremny )
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()
Możesz wkleić dane wyjściowe WKT do QGIS za pomocą przydatnej wtyczki QuickWKT .
Możesz użyć innych metod - jak wspomniano w stożku, możesz utworzyć okrąg na niestandardowej równoodległej projekcji w metrach, wyśrodkowany na punkcie początkowym. Uważam jednak, że na dużych odległościach wkrada się błąd (tylko kilka kilometrów na 2000 km, ale w przypadku odległości międzykontynentalnych błędy mogą się narastać)
Z pamięci wtyczka mmqgis umożliwia buforowanie w km. Nie jestem jednak pewien, jakiej metody używa.
Zauważ, że możesz mieć problemy z renderowaniem wielokątów w QGIS, które przekraczają antimeridian, jeśli zaczynasz w Azji - ogr2ogr z opcją -wrapdateline może tutaj pomóc. Może się okazać, że jest to mniejszy problem z openlayers / ulotką, IIRC pozwalają na długości większe niż 180 i mniejsze niż -180.
Dobry blog na temat buforowania geodezyjnego znajduje się tutaj na blogu esri .