前提
- 座標はすべてWebメルカトル座標系で表されているものとする。
- この記事の内容はすべてOpenLayers v4.6.5に基づき、当該バージョンで動作確認した。
2点間距離を求める
座標x=1, y=2
を[1, 2]
のように書くこととにする。
[1, 1]
と[2, 2]
の間の距離を求めたいとする。
OpenLayers4には2点間距離を求めるAPIは無いようである。
一方で、ol.geom.LineString
にはgetLength()というLineStringジオメトリの長さを求めるメソッドがある。
それを利用すると2点間距離を求める関数getDistance()
を以下のように定義できる。
// 2つの座標co1, co2を与えると、その間の距離を返す。
function getDistance(co1, co2) {
var ls = new ol.geom.LineString([co1, co2]);
return ls.getLength();
};
// 利用例:[1, 1]と[2, 2]の間の距離を求める。
var co1 = [1, 1];
var co2 = [2, 2];
getDistance(co1, co2); // 1.4142135623730951
点とLineStringの最短距離を求める
[2, -2]
、[2, 2]
を結ぶLineStringがあったとする。
[1, 1]
からそのLineStringへ至る最短距離を求めたいとする。(この場合、答えは1)
OpenLayers4には、点からジオメトリへの最短距離を求めるAPIは無いようである。
一方、ol.geom.LineString
には、任意の座標を引数として与えると、そのLineString上にあり、引数として与えられた座標から最短距離となる点を返すメソッドgetClosestPoint()がある。
例えば、
var co1 = [1, 1];
var ls = new ol.geom.LineString([[2, -2], [2, 2]]);
ls.getClosestPoint(co1); // [2, 1]
のように用いることができる。
これと、先ほどのgetDistance()
関数を組み合わせると、点とLineStringの最短距離を求めることができる。
// 座標co1とLineString lsの間の最短距離を求める。
function getMinDistance(co1, ls) {
var co2 = ls.getClosestPoint(co1);
var ls_tmp = new ol.geom.LineString([co1, co2]);
return ls_tmp.getLength();
}
var co1 = [1, 1];
var ls = new ol.geom.LineString([[2, -2], [2, 2]]);
getMinDistance(co1, ls); // 1
点がLineString上にあるかどうかを判定する。
ol.geom.Geometry
には、点座標を与えることで、その点がジオメトリ上にあるかどうかを返すメソッドintersectsCoordinate()がある。
ol.geom.LineString
もol.geom.Geometry
の派生クラスなので、このメソッドを持っている。
しかしながら、この関数は、引数として与えられた点座標がジオメトリの境界上にある場合はfalseを返す。
従い、点がLineString上にあるかどうかの判別には使えない。
var ls = new ol.geom.LineString([[0, 0], [0, 2]]);
ls.intersectsCoordinate([0, 1]); // false
そこで、上記のgetMinDistance()
が返す値が0であれば、点は線上にある、とみなす。
function isPointOnLineString(co1, ls) {
return getMinDistance(co1, ls) === 0;
}
var co1 = [1, 1];
var co2 = [2, 1];
var ls = new ol.geom.LineString([[2, -2], [2, 2]]);
isPointOnLineString(co1, ls); // false
isPointOnLineString(co2, ls); // true
まとめ
OpenLayers4には以下を直接求めるメソッドはないが、既存のメソッドを組み合わせてそれらを求める関数を実現できる。
- 2点間距離を求めるメソッド
- ある点からLineStringに至る最短距離を求めるメソッド
- ある点がLineString上にあるかどうかを判別するメソッド