Googleマップを使用して、緯度/経度のポイントが一連のポリゴン内にあるかどうかを確認します


9

Esri(シェープファイルのクエリタスク)を使用して上記の方法を知っていますが、これはGoogleマップを使用して行うこともできますか?各ポリゴンをクエリする必要がありますか、それともポリゴンのセットをクエリする方法はありますか?

回答:


9

Google Maps APIは、ポリゴン内のポイントをチェックするメソッドをまだ提供していません。少し調べた後、XY座標がプロットされた形状内にあるかどうかを判断するレイキャスティングアルゴリズムを偶然見つけました。これは緯度と経度に変換されます。以下は、google.maps.polygon.prototypeを拡張して、このアルゴリズムを使用します。google.mapsが読み込まれた後のコードのある場所にこのコードを含めるだけです。

google.maps.Polygon.prototype.Contains = function (point) {
    var crossings = 0,
        path = this.getPath();

    // for each edge
    for (var i = 0; i < path.getLength(); i++) {
        var a = path.getAt(i),
            j = i + 1;
        if (j >= path.getLength()) {
            j = 0;
        }
        var b = path.getAt(j);
        if (rayCrossesSegment(point, a, b)) {
            crossings++;
        }
    }

    // odd number of crossings?
    return (crossings % 2 == 1);

    function rayCrossesSegment(point, a, b) {
        var px = point.lng(),
            py = point.lat(),
            ax = a.lng(),
            ay = a.lat(),
            bx = b.lng(),
            by = b.lat();
        if (ay > by) {
            ax = b.lng();
            ay = b.lat();
            bx = a.lng();
            by = a.lat();
        }
        // alter longitude to cater for 180 degree crossings
        if (px < 0) {
            px += 360;
        }
        if (ax < 0) {
            ax += 360;
        }
        if (bx < 0) {
            bx += 360;
        }

        if (py == ay || py == by) py += 0.00000001;
        if ((py > by || py < ay) || (px > Math.max(ax, bx))) return false;
        if (px < Math.min(ax, bx)) return true;

        var red = (ax != bx) ? ((by - ay) / (bx - ax)) : Infinity;
        var blue = (ax != px) ? ((py - ay) / (px - ax)) : Infinity;
        return (blue >= red);

    }

};

ここでは、「contains」という名前の関数を定義することでgoogle.maps.Polygonの機能を拡張しました。これを使用して、関数パラメーターで提供された緯度経度がポリゴン内にあるかどうかを判断できます。ここではレイキャスティングアルゴリズムを利用し、それを使って関数を開発しました。これで多くの演習を行った後、次のようにポイントを確認できます。

var point = new google.maps.LatLng(52.05249047600099, -0.6097412109375);
var polygon = new google.maps.Polygon({path:[INSERT_PATH_ARRAY_HERE]});
if (polygon.Contains(point)) {
    // point is inside polygon
}

完全なコードとデモについては、http//counsellingbyabhi.blogspot.in/2013/01/google-map-check-whether-point-latlong.htmlにアクセスして ください。


はい、レイキャスティングは私が行くべき道だと思います。私は実際に自分でPythonスクリプトを介してそのアルゴリズムを利用しました。私の実装はここにあります: gramsky.blogspot.com/2012/12/…– ngramsky 2013
1

私は適切経度0を回避するために、このための負の座標に360を追加したビット除去しなければならなかった
user1431317

4

Open Layersプラグインを使用します。それをフェッチすれば、マップにダイナミックレイヤーを追加してエクスポートすることもできます。

*これを行う前に、プロジェクトのCRS(EPSG)がWGS84に設定されていることと、プロジェクトのプロパティ設定で「オンザフライ」のCRS変換が有効になっていることを確認してください。

お役に立てれば。


0

サードパーティのプログラムをgeodjangoとして使用する場合は、ポリゴンのセット内かどうかにかかわらず、ポイントを確認できます。詳細はこちら

contains

Availability: PostGIS, Oracle, MySQL, SpatiaLite

Tests if the geometry field spatially contains the lookup geometry.

Example:

Zipcode.objects.filter(poly__contains=geom)

Backend     SQL Equivalent
PostGIS     ST_Contains(poly, geom)
Oracle  SDO_CONTAINS(poly, geom)
MySQL   MBRContains(poly, geom)
SpatiaLite  Contains(poly, geom)

お役に立てば幸いです...


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.