回答:
proj4ライブラリを使用すると、大圏距離を使用して円を記述できます。
たとえば、ここはwgs84 / Equirectangularで、エジンバラ、東京、ケープタウン、キトから半径3000 kmです。赤道に近いため、キトだけが漠然と「丸い」。また、方位角36度(約NE)で1つの高密度スポークラインを追加しました。
エジンバラを中心とする正距方位図法に変更すると、エジンバラの周囲の半径が円に解決されることがわかります...
メルカトル(Webアプリなど)では、赤道から離れるにつれて歪みが大きくなりますが、バッファーは楕円形になります。
次のpythonコードはそれを行います(pyprojとshapelyが必要です)
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()
便利なQuickWKTプラグインを使用して、WKT出力をQGISに貼り付けることができます。
他の方法を使用することもできます。conneypylonが言及したように、カスタムの等距離投影図に、始点を中心とした円をメートル単位で作成できます。しかし、長い距離ではエラーが忍び寄る(2000 kmではわずか数kmですが、大陸間距離ではこれらのエラーが増える可能性があります)。
メモリから、mmqgisプラグインはkm 単位でバッファリングできます。ただし、どの方法を使用しているかはわかりません。
アジアから始めた場合、時系列にまたがるQGISでポリゴンをレンダリングするときに問題が発生する可能性があることに注意してください。- wrapdatelineオプションを指定したogr2ogrが役立ちます。これはopenlayers / leafletの問題ではなく、IIRCでは経度が180より大きく、-180より小さいことが認められます。
esriブログには、測地線のバッファリングに関する優れた記事があります。
距離情報の送信元によっては、これは問題にならない場合があります。距離を示す単純な数値がある場合、距離は正確に距離を示すすべてのマップ投影で同じになります(メルカトルではなく、方位正射図法などの「等距離」投影とほとんど同じように考えてください。等角投影、 Lambert Conformal Conicのように、遠くからでも大丈夫です。等距離図法でバッファーを計算して作成すると、バッファーは(かなり)正確になります。距離の計算方法については、こちらを参照してください:ArcGISヘルプ
レイヤーの座標系は、データフレームだけでなく、等距離の投影になるように設定してください。
計算が完了すると、バッファーはWebメルカトルまたはその他の使用するWebプロジェクションに配置されると、それに応じてゆがみます。
なぜ線自体が湾曲しているのか、そしてなぜこれが問題を引き起こすのか:
重要な問題は、次のようなメルカトル図法の平面ルートが曲線として表示されることです。
これはメルカトルマップの根本的な問題です。これらは航海ナビゲーションを目的としているため、これらの投影の直線のプロパティは貴重です(メルカトル投影の直線は横線です。同じコンパスが旅全体)。
ただし、燃料効率は単純なナビゲーションよりも重要であり、メルカトル図法では曲線として表示される大圏に沿って飛行するため、飛行機は横線で飛行しません。