2012-01-30 63 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/)工作,但它不会为我工作... 这里是样本数据多边形:

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" 

也许你能帮助... ...在此先感谢

PS。解决方案必须特别适用于Bing地图或通用解决方案...

+0

你见过这个功能吗? https://github.com/tparkin/Google-Maps-Point-in-Polygon – duncan 2012-01-30 16:06:01

回答

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 2012-01-31 08:12:25

3

谷歌地图API尚未提供检查多边形中的点的方法。经过一番研究,我偶然发现了Ray-casting算法,它将确定X-Y坐标是否在绘制形状内。这将转化为经度和纬度。以下内容扩展了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); 
    } 
}; 

在这里,我们通过定义名称的功能扩展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]});如果(polygon.Contains(点)){//点在内部多边形}

有关完整的代码和演示,请访问:http://counsellingbyabhi.blogspot.in/2013/01/google-map-check-whether-point-latlong.html

0

你可以用我的,我在github上已经反映了libkml变异的克隆这里:https://github.com/gumdal/libkml-pointinpolygon

在这个开源的作者的帮助下,设计了一个模块,它将指示给定的点是否在KML多边形内。确保你检查了分支“libkml-git”而不是git源的“主”分支。您感兴趣的课程是“pointinpolygon.cc”。它是C++源代码,您可以将其包含在您的项目中并与您的项目一起构建。

编辑 - 点多边形问题的解决方案与其覆盖的地图无关。

0

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

相关问题