Büyük daire mesafesini kullanarak bir daireyi tanımlamak için proj4 kütüphanesini kullanabilirsiniz .
Örneğin, Edinburgh, Tokyo, Cape Town ve Quito'dan wgs84 / Equirectangular cinsinden 3000 km'lik bir yarıçap. Ekvator ile olan yakınlığı nedeniyle sadece Quito belirsiz bir şekilde 'yuvarlak'. Ayrıca 36 derecelik bir azimutta tek bir yoğunlaştırılmış jant teli hattına ekledim (yaklaşık NE)
Edinburgh merkezli azimuthal eşitlikli bir projeksiyona geçersek, Edinburgh çevresindeki yarıçapın bir çembere dönüştüğünü göreceksiniz ...
Mercator'da (web uygulamanız gibi) ekvatordan uzaklaştıkça daha fazla bozulma görürsünüz, ancak tamponlar daha eliptiktir.
Aşağıdaki python kodu bunu yapar ( pyproj ve düzgün bir şekilde gerektirir )
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()
WKT çıktısını kullanışlı QuickWKT eklentisini kullanarak QGIS'e yapıştırabilirsiniz .
Diğer yöntemleri kullanabilirsiniz - coneypylon'un belirttiği gibi, başlangıç noktanıza ortalanmış, metre cinsinden özel eşit uzaklıktaki bir projeksiyon üzerinde bir daire oluşturabilirsiniz. Ancak büyük mesafeler için bir hata sürünüyor (2000 km'de sadece birkaç km, ancak kıtalararası mesafeler için bu hatalar artabilir)
Mmqgis eklentisi bellekten km olarak arabelleğe almayı sağlar. Yine de hangi yöntemi kullandığından emin değilim.
- Eğer Asya'da başlıyorsanız Antimeridyen çapraz QGIS sıra poligonları oluşturmakta sorun olabileceğini Not ogr2ogr ile -wrapdateline burada yardımcı olabilir seçeneği. Bunun açık katmanlar / broşürler ile ilgili daha az sorun olduğunu görebilirsiniz, IIRC, 180'den büyük ve -180'den küçük boylara izin verir.
Burada, esri blogunda jeodezik tamponlama hakkında iyi bir yazı var .