我希望检测一个
google.maps.LatLng
是否在一个 google.maps.Polygon
内。如何实现呢?谢谢!google.maps.LatLng
是否在一个 google.maps.Polygon
内。如何实现呢?谢谢!您可以在Google地图 V3中使用以下方式:
google.maps.geometry.poly.containsLocation(google.maps.LatLng(latitude, longitude),polygons);
多边形是一个由函数返回的对象,该函数在多边形完成后被调用。
var polygons=null;
google.maps.event.addDomListener(drawingManager, "polygoncomplete", function(polygon) {
polygons=polygon;
});
引用自https://developers.google.com/maps/documentation/javascript/reference
其他解决方案:Google-Maps-Point-in-Polygon
这是一个用于Polygon类的Javascript Google Maps v3扩展,用于检测点是否在其内部...
我使用这个算法来检测点是否在多边形内:http://alienryderflex.com/polygon/
我给多边形添加了一个新的方法contains
:
// Add a function contains(point) to the Google Maps API v.3
google.maps.Polygon.prototype.contains = function(point) {
var j=0;
var oddNodes = false;
var x = point.lng();
var y = point.lat();
var paths = this.getPath();
for (var i=0; i < paths.getLength(); i++) {
j++;
if (j == paths.getLength()) {j = 0;}
if (((paths.getAt(i).lat() < y) && (paths.getAt(j).lat() >= y))
|| ((paths.getAt(j).lat() < y) && (paths.getAt(i).lat() >= y))) {
if ( paths.getAt(i).lng() + (y - paths.getAt(i).lat())
/ (paths.getAt(j).lat()-paths.getAt(i).lat())
* (paths.getAt(j).lng() - paths.getAt(i).lng())<x ) {
oddNodes = !oddNodes
}
}
}
return oddNodes;
}
google.maps.Polyline.prototype.contains = google.maps.Polygon.prototype.contains;
var x = point.getPosition().lng();
和 var y = point.getPosition().lat();
。 - Marios Fakiolas无需复杂算法,我使用html画布的isPointInPath()方法就能实现这一点。
http://www.w3schools.com/tags/canvas_ispointinpath.asp
创建一个画布元素。 使用moveTo()、lineTo()方法绘制带有多个端点的多边形。 使用isPointInPath()方法验证点(x,y)是否在多边形内。
<canvas id="canvas"></canvas>
//x,y are coordinate of the point that needs to be tested
//coordinates contains all endpoint of a polygon in format of x1,y1,x2,y2,x3,y3....
function isPointInPolygon(x, y, coordinates) {
var ctx = canvas.getContext("2d");
var coords = coordinates.split(',');
if (coords != null && coords.length > 4) {
ctx.beginPath();
ctx.moveTo(coords[0], coords[1]);
for (j = 2; j < coords.length; j++) {
ctx.lineTo(coords[j], coords[j + 1]);
j++;
}
ctx.closePath();
if (ctx.isPointInPath(x, y))
return true;
else
return false;
}
return false;
}