gpt4 book ai didi

google-maps - 检查点是否在多边形( map )中

转载 作者:行者123 更新时间:2023-12-01 01:21:17 24 4
gpt4 key购买 nike

我正在尝试检查一个点是否在多边形中。
目前我已尝试使用此功能

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"

也许你可以帮忙......提前致谢

附注。解决方案必须特别适用于 Bing map 或通用解决方案...

最佳答案

Google map API 尚未提供检查多边形中的点的方法。经过一番研究后,我偶然发现了光线转换算法,该算法将确定 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);
}
};

在这里,我们通过定义一个名为“Contains”的函数来扩展 google.maps.Polygon 的功能,该函数可用于确定函数参数中提供的纬度经度是否在多边形内。在这里,我们使用了 Ray-casting 算法并开发了一个使用它的函数。现在做了这么多练习之后,我们可以检查一个点如下:

var point = new google.maps.LatLng(52.05249047600099, -0.6097412109375); varpolygon = new google.maps.Polygon({path:[INSERT_PATH_ARRAY_HERE]}); if (polygon.Contains(point)) {//点在多边形内 }

完整代码和演示请到: http://counsellingbyabhi.blogspot.in/2013/01/google-map-check-whether-point-latlong.html

关于google-maps - 检查点是否在多边形( map )中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9066625/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com