web-dev-qa-db-ja.com

ポイントがリーフレットポリゴン内にあるかどうかを判別

次のデモのように、リーフレットを使用してポリガンを描画するとします。 http://leaflet.github.io/Leaflet.draw/

私の質問は、特定のポイントがポリゴンの内部にあるかどうかをどのように判断できるかです。

13
Majdi Taleb

レイキャスティングアルゴリズムを使用して、ポイント(マーカー)がポリゴンの内側にあるかどうかを確認します。

function isMarkerInsidePolygon(marker, poly) {
    var polyPoints = poly.getLatLngs();       
    var x = marker.getLatLng().lat, y = marker.getLatLng().lng;

    var inside = false;
    for (var i = 0, j = polyPoints.length - 1; i < polyPoints.length; j = i++) {
        var xi = polyPoints[i].lat, yi = polyPoints[i].lng;
        var xj = polyPoints[j].lat, yj = polyPoints[j].lng;

        var intersect = ((yi > y) != (yj > y))
            && (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
        if (intersect) inside = !inside;
    }

    return inside;
};

たとえば jsfiddle を参照してください。

コードの元のソース: https://github.com/substack/point-in-polygon/blob/master/index.js


2014年の同様の回答もご覧ください https://stackoverflow.com/a/41138512/287948

33
gusper

これは私のために働いた@gusper回答の修正された(@Sumitヒント付き)バージョンです:(私はドーナツを持っていました)

function isMarkerInsidePolygon(marker, poly) {
    var inside = false;
    var x = marker.getLatLng().lat, y = marker.getLatLng().lng;
    for (var ii=0;ii<poly.getLatLngs().length;ii++){
        var polyPoints = poly.getLatLngs()[ii];
        for (var i = 0, j = polyPoints.length - 1; i < polyPoints.length; j = i++) {
            var xi = polyPoints[i].lat, yi = polyPoints[i].lng;
            var xj = polyPoints[j].lat, yj = polyPoints[j].lng;

            var intersect = ((yi > y) != (yj > y))
                && (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
            if (intersect) inside = !inside;
        }
    }

    return inside;
};
13
VitalyZ

上記の回答のどれもnon-contiguousポリゴン内のマーカーをカウントするために機能しないことがわかりました。上記の関数が内部で0マーカーを返したポリゴンの例を次に示します。

Non-contiguous Polygon

それをする必要がある人のために、Leaflet.PointInPolygonパッケージが機能しました: https://github.com/hayeswise/Leaflet.PointInPolygon

少し遅いですが、正確なようです。

2
lauren.marietta