คำตอบ:
คุณสามารถใช้ไลบรารีproj4เพื่ออธิบายวงกลมโดยใช้ระยะทางที่ยอดเยี่ยม
ตัวอย่างเช่นนี่คือรัศมี 3000km จาก Edinburgh, Tokyo, Cape Town และ Quito ใน wgs84 / Equirectangular กีโตเท่านั้นคือ 'รอบ' ที่คลุมเครือเนื่องจากอยู่ใกล้กับเส้นศูนย์สูตร ฉันยังได้เพิ่มสายพูดที่หนาแน่นแบบหนึ่งจุดที่มุมราบ 36 องศา (ประมาณ NE)
หากเราเปลี่ยนการฉายภาพระยะทางเท่ากันแบบอะซิมุ ธ ที่มีศูนย์กลางอยู่ที่เอดินเบอระคุณจะเห็นรัศมีรอบ ๆ เอดินเบิร์กเปลี่ยนเป็นวงกลม ...
บน Mercator (เช่นเว็บแอปของคุณ) คุณจะเห็นความผิดเพี้ยนมากขึ้นเมื่อคุณขยับออกห่างจากเส้นศูนย์สูตร แต่บัฟเฟอร์นั้นเป็นวงรีมากกว่า
รหัสไพ ธ อนต่อไปนี้ทำเช่นนั้น (ต้องใช้pyprojและหุ่นดี )
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 ลงใน QGIS โดยใช้ปลั๊กอินQuickWKT ที่มีประโยชน์
คุณสามารถใช้วิธีการอื่น ๆ - ตามที่ coneypylon กล่าวไว้คุณสามารถสร้างวงกลมบนการฉายภาพระยะเท่ากันที่กำหนดเองเป็นเมตรโดยมีศูนย์กลางที่จุดเริ่มต้นของคุณ ฉันพบว่ามีข้อผิดพลาดในระยะทางไกล (เพียงไม่กี่กม. ที่ 2000 กม. แต่สำหรับระยะทางระหว่างทวีปข้อผิดพลาดเหล่านี้สามารถติดตั้งได้)
จากหน่วยความจำปลั๊กอินmmqgisอนุญาตให้บัฟเฟอร์ในกม. ฉันไม่แน่ใจว่าจะใช้วิธีการใด
โปรดทราบว่าคุณอาจมีปัญหาในการแสดงรูปหลายเหลี่ยมใน QGIS ที่ข้าม antimeridian ถ้าคุณเริ่มต้นในเอเชีย - ogr2ogrด้วยตัวเลือก-wrapdatelineสามารถช่วยได้ที่นี่ คุณอาจพบว่านี่เป็นปัญหาของ openlayers / leaflet น้อยกว่าพวก IIRC อนุญาตให้ longlines ที่มากกว่า 180 และน้อยกว่า -180
มี writeup ดีเกี่ยวกับบัฟเฟอร์เนื้อที่นี่บนบล็อก ESRI
ทั้งนี้ขึ้นอยู่กับว่าข้อมูลระยะทางของคุณมาจากที่ใด หากคุณมีตัวเลขง่าย ๆ ที่ให้ระยะทางระยะทางจะเท่ากันในการฉายแผนที่ใด ๆ ซึ่งแสดงระยะทางที่ถูกต้อง (ไม่ใช่ Mercator ให้คิดว่าการฉายภาพ "ระยะเท่ากัน" ใด ๆ เช่นการฉาย orthographic azimuthal หรือคล้ายกัน เช่น Lambert Conformal Conic จะทำงานได้ดีพอสมควรในระยะทาง) หากคุณคำนวณและสร้างบัฟเฟอร์ในการฉายภาพระยะเท่ากันพวกมันจะถูกต้อง (เป็นธรรม) ดูที่นี่เกี่ยวกับวิธีคำนวณระยะทาง: ArcGIS ความช่วยเหลือ
ตรวจสอบให้แน่ใจว่าตั้งค่าระบบพิกัดของเลเยอร์ให้อยู่ในระยะฉายภาพที่เท่ากันไม่ใช่แค่กรอบข้อมูล
เมื่อคำนวณแล้วบัฟเฟอร์จะวาร์ปตามลำดับเมื่อใส่ลงใน Web Mercator หรือเว็บอื่น ๆ ที่คุณต้องการใช้
เท่าที่ทำไมเส้นเหล่านั้นโค้งและทำไมสิ่งนี้อาจสร้างปัญหา:
ปัญหาสำคัญคือเส้นทางเครื่องบินในการฉายภาพของ Mercator เช่นอันนี้จะแสดงเป็นโค้งเช่น:
นี่เป็นปัญหาพื้นฐานของแผนที่ Mercator เนื่องจากมีจุดประสงค์เพื่อการนำทางทะเลซึ่งคุณสมบัติของเส้นตรงในการคาดการณ์เหล่านี้มีค่า (เส้นตรงบนเส้นโครงแผนที่ของ Mercator เป็นเส้นโค้งตามแนวเส้นรอบวงที่มีเข็มทิศเดียวกัน การเดินทางทั้งหมด)
อย่างไรก็ตามเครื่องบินไม่ได้บินบนเส้น rhumb เนื่องจากประสิทธิภาพการใช้เชื้อเพลิงมีความสำคัญมากกว่าการนำทางที่ง่ายและจึงบินไปตามวงกลมใหญ่ซึ่งปรากฏเป็นเส้นโค้งบนเส้นโครงของ Mercator