2012-01-30 3 views
4

점이 다각형인지 확인하려고합니다. 나는이 기능점이 다각형인지 확인하십시오 (지도)

pointInPolygon:function (point,polygon){ 
    var i; 
    var j=polygon.length-1; 
    var inPoly=false; 
    var lon = point.longitude; 
    var lat = point.latitude; 
    for (i=0; i<polygon.length; i++) 
    { 
     if (polygon[i][0]<lon && polygon[j][0]>=lon|| polygon[j][0]<lon && polygon[i][0]>=lon){ 
      if (polygon[i][0]+(lon-polygon[i][0])/(polygon[j][0]-polygon[i][0])*(polygon[j][1]-polygon[i][1])<lat){ 
       inPoly=!inPoly; 
      } 
     } 
     j=i; 
    } 
    return inPoly; 
} 

과 노력이 순간
...이 기능은 간단한 다각형 (http://jsfiddle.net/zTmr7/3/)에서 작동하는 것 같다하지만 나를 위해 작동하지 않습니다 ... 여기서 샘플 데이터입니다 다각형 :

PS 사전에

polygon: Array[14] 
Array[2] 
     0: "-120.190625" 
     1: "29.6614549946937" 
Array[2] 
     0: "-116.87275390625" 
     1: "32.6320990313992" 
Array[2] 
     0: "-116.60908203125" 
     1: "34.0363970332393" 
Array[2] 
     0: "-120.89375" 
     1: "41.9203747676428" 
Array[2] 
     0: "-114.74140625" 
     1: "45.784484644005" 
Array[2] 
     0: "-115.971875" 
     1: "48.6489780115889" 
Array[2] 
     0: "-132.758984375" 
     1: "59.9891712248332" 
Array[2] 
     0: "-162.5099609375" 
     1: "68.919753529737" 
Array[2] 
     0: "-168.6623046875" 
     1: "68.9828872543805" 
Array[2] 
     0: "-168.4865234375" 
     1: "64.2551601036027" 
Array[2] 
     0: "-179.874356794357" 
     1: "51.0915874974707" 
Array[2] 
     0: "-179.999916362762" 
     1: "13.1823178795562" 
Array[2] 
     0: "-143.8771484375" 
     1: "19.9962034117847" 
Array[2] 
     0: "-120.190625" 
     1: "29.6614549946937" 

어쩌면 당신이 도움이 될 수 있습니다 ... 감사. 솔루션은 특히 Bing 맵이나 보편적 인 솔루션을위한 것이어야합니다 ...

+0

여기이 기능을 보았습니까? https://github.com/tparkin/Google-Maps-Point-in-Polygon – duncan

답변

1

첫 번째 if 진술이 좋아 보입니다. 포인트의 경도가 다각형 세그먼트의 경도 내에 있는지 확인해야합니다.

두 번째 if은 점의 정확한 경도로 세그먼트의 절편을 보간하고 해당 절편이 점 위 또는 아래에 있는지를 결정해야합니다. 단순한 오자 때문에 그 일이 무엇인지 생각하지 않습니다.

if (polygon[i][1]+(lon-polygon[i][0])/(polygon[j][0]-polygon[i][0])*(polygon[j][1]-polygon[i][1])<lat){ 
      ^

는 또한 별도의 경우를 포함한다 때 polygon[i][0]==polygon[j][0] 당신으로 나누기 오류가 발생하지 않도록.

+0

인터넷에서 함수를 복사했습니다 ... 나에게 제안하는대로 if 문을 변경했지만 기능은 여전히 ​​아닙니다. 올바르게 작동합니다. 전체 기능을 수정하고 다시 게시 할 수 있습니까? – T1000

3

Google지도 API는 아직 다각형의 점을 확인하는 방법을 제공하지 않습니다. 조금 연구 한 후에 X-Y 좌표가 플롯 된 모양 안에 있는지를 결정하는 레이 캐스팅 알고리즘을 우연히 발견했습니다. 이것은 위도와 경도로 변환됩니다. 다음은이 알고리즘을 사용하도록 google.maps.polygon.prototype을 확장 한 것입니다. 여기

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); 
    } 
}; 

우리는 이름으로 함수를 정의하여 google.maps.Polygon의 기능을 확장 한에 사용할 수있는 '포함'에서는 google.maps가로드 된 후 단순히 코드의 시점에서이 코드를 포함 함수 매개 변수에 제공된 위도 경도가 다각형 내에 있는지 여부를 판별하십시오. 여기서 우리는 레이 캐스팅 알고리즘을 사용하고이를 사용하는 함수를 개발했습니다. 지금이 정도의 운동을 한 후에는 다음과 같이 점을 확인할 수 있습니다.

var point = new google.maps.LatLng (52.05249047600099, -0.6097412109375); var polygon = new google.maps.Polygon ({경로 : [INSERT_PATH_ARRAY_HERE]}); 당신은 내가 GitHub의에서 미러링 한없는 libkml 변형의 내 복제를 사용할 수 있습니다 http://counsellingbyabhi.blogspot.in/2013/01/google-map-check-whether-point-latlong.html

0

: (polygon.Contains은 (포인트)) 전체 코드와 데모

{// 포인트 다각형 내부} 경우에 이동하십시오 여기 : https://github.com/gumdal/libkml-pointinpolygon

이 오픈 소스 제작자의 도움을 받아 주어진 점이 KML 다각형 안에 있는지 여부를 나타내는 모듈이 설계되었습니다. git 소스의 "master"브랜치가 아니라 "libkml-git"브랜치를 확인하십시오. 관심있는 수업은 "pointinpolygon.cc"입니다. 그것은 당신의 프로젝트 안에 포함시킬 수 있고 프로젝트와 함께 그것을 빌드 할 수있는 C++ 소스 코드입니다.

편집 0120-- 다각형 문제의 해결 방법은 그것이 오버레이 된지도와 관계가 없습니다.

0

true | false = google.maps.geometry.poly.containsLocation (googlePoint, googlePoly);