Google지도를 사용하여 위도 / 경도가 다각형 세트 내에 있는지 확인하십시오.


9

Esri (shapefile의 쿼리 작업)를 사용하여 위의 작업을 수행하는 방법을 알고 있지만 Google지도를 사용 하여이 작업을 수행 할 수 있습니까? 각 다각형을 쿼리해야합니까, 아니면 다각형 집합을 쿼리하는 방법이 있습니까?

답변:


9

Google Maps API는 아직 다각형의 점을 확인하는 방법을 제공하지 않습니다. 비트를 조사한 후 XY 좌표가 플롯 된 모양 안에 있는지 여부를 결정하는 Ray-casting 알고리즘을 우연히 발견했습니다. 이것은 위도와 경도로 변환됩니다. 다음은이 알고리즘을 사용하도록 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의 기능을 확장했습니다. 여기서 우리는 Ray-casting 알고리즘을 사용하고이를 사용하여 함수를 개발했습니다. 지금이 운동을 많이 한 후에는 다음과 같이 요점을 확인할 수 있습니다.

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 로 이동 하십시오.


네, 레이 캐스팅은 제가 생각하는 길입니다. 나는 실제로 파이썬 스크립트를 통해 그 알고리즘을 직접 사용했습니다. 내 구현은 여기에서 찾을 수 있습니다 : gramsky.blogspot.com/2012/12/…
ngramsky

경도 0 주위에서 제대로 작동하기 위해 음의 좌표에 360을 추가 한 비트를 제거해야했습니다.
user1431317

4

Open Layers 플러그인으로갑니다. 가져 와서 맵에 동적 레이어를 추가하고 내보낼 수도 있습니다.

* 그렇게하기 전에 프로젝트 CRS (EPSG)가 WGS84로 설정되어 있고 프로젝트 속성 설정에서 '즉시'CRS 변환이 활성화되어 있는지 확인하십시오.

도움이 되었기를 바랍니다.


0

써드 파티 프로그램을 거장 고로 사용하는 경우 다각형 세트 내에서 포인트를 확인할 수 있습니다. 더 많은 정보는 여기에 있습니다 .

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)

나는 그것이 당신에게 도움이되기를 바랍니다 ...


0

나는 이것이 조금 늦다는 것을 알고 있지만 SomeOne이 Android-Map-Utils 라이브러리를 시도하지 않은 경우 도움이 될 수 있습니다. 이 질문의 특정 방법은 Android에만 게시했습니다. 여기 있습니다 :

https://stackoverflow.com/a/31988461/2054348

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.