LoginSignup
1
1

More than 5 years have passed since last update.

【OpenLayers4】点と線の間の距離を求める、点が線上にあるかどうか判別する

Posted at

前提

  • 座標はすべて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.LineStringol.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上にあるかどうかを判別するメソッド
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1