こんにちは
地球表面上の最短ルート(いわゆる大圏コース)を求める方法として、ぱっと思い浮かぶのは
始点を中心とした正距正方位図法上で終点の値を得て、ルートを作成する方法です。
ただし始点と終点のみのラインデータだと、たとえ正距正方位図法のジオメトリデータでも
(真球メルカトル等)他の投影法で投影した際は、始点と終点の情報から直線で表示されるため
正距正方位図法上のルートで、適宜折れ点を作成しておく必要があります。
ためしに QGIS のフィールド計算機の関数エディタで great_circle_route 関数を作ってみました。
(折れ点は約100km間隔で入るようにしています。)
from qgis.core import *
from qgis.gui import *
import pyproj
@qgsfunction(args='auto', group='Custom')
def great_circle_route(lat1, lon1, lat2, lon2, feature, parent):
wgs84 = pyproj.Proj('+init=EPSG:4326')
azeq = pyproj.Proj('+proj=aeqd +lat_0=%f +lon_0=%f +x_0=0 +y_0=0 '
'+datum=WGS84 +units=m +no_defs' % (lat1, lon1))
x2, y2 = pyproj.transform(wgs84, azeq, lon2, lat2)
dist = (x2 ** 2 + y2 ** 2) ** 0.5
nodes = []
edges = int(dist // 100000) + 1
for i in range(edges):
lon, lat = pyproj.transform(azeq, wgs84, i * x2 / edges, i * y2 / edges)
nodes.append(QgsPoint(lon, lat))
nodes.append(QgsPoint(lon2, lat2))
return QgsGeometry.fromPolyline(nodes)
たとえば EPSG:4326 のポリラインのレイヤで、適当な地物をひとつ作成して保存します。
フィールド計算機で既存フィールドの更新でジオメトリを選択し、次のような式で更新します。
great_circle_route(35.7653, 140.3856, 49.0097, 2.5486)
もちろん属性値が整備されていれば、座標は直接入力ではなく次のようにもできます。
great_circle_route("lat1", "lon1", "lat2", "lon2")
ジオメトリデータとしては EPSG:4326 に戻していますが、データとして EPSG:3857 で
ほしい場合には、フィールド計算機の transform() をかませてください。
作ってみたものの、プラグイン化していないので QGIS では使いにくいです。
ただ、始点終点ペアが与えられていて、ローカルで Python (+PyProj) が使える場合や、
WebGIS で始点終点を選んだら、大圏コースをプロットするなどは比較的容易そうですね。
( Proj や PyProj は最近大きなアップデートがあったため、インストール済みバージョンに注意)