Google 地图 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 的功能,该函数可用于确定函数参数中提供的纬度经度是否在多边形内。在这里,我们利用光线投射算法并使用该算法开发了一个函数。现在做完这么多练习后,我们可以检查以下几点:
var point = new google.maps.LatLng(52.05249047600099,-0.6097412109375); var 多边形 = new google.maps.Polygon({path:[INSERT_PATH_ARRAY_HERE]}); if (polygon.Contains(point)) { // 点在多边形内部 }
完整代码和demo请访问:http://coun sellbyabhi.blogspot.in/2013/01/google-map-check-whether-point-latlong.html