Google maps 检查点是否位于多边形(贴图)中
我试图检查点是否在多边形中。Google maps 检查点是否位于多边形(贴图)中,google-maps,coordinates,bing-maps,point,Google Maps,Coordinates,Bing Maps,Point,我试图检查点是否在多边形中。 目前我已经尝试了这个功能 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 (p
目前我已经尝试了这个功能
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;
}
也许你能帮我。。。提前谢谢
注:解决方案必须特别适用于Bing地图或universal solution…如果语句看起来不错,则第一个
语句-您正在检查点的经度是否位于多边形段的经度范围内
第二个if
应使用该点的精确经度插值该段的截距,并确定该截距是在该点的上方还是下方。我不认为这是它正在做的,因为一个简单的打字错误
if (polygon[i][1]+(lon-polygon[i][0])/(polygon[j][0]-polygon[i][0])*(polygon[j][1]-polygon[i][1])<lat){
^
if(polygon[i][1]+(lon polygon[i][0])/(polygon[j][0]-polygon[i][0])*(polygon[j][1]-polygon[i][1])Google maps API尚未提供检查多边形中点的方法。在研究了一点之后,我偶然发现了光线投射算法,该算法将确定X-Y坐标是否位于打印形状内。这将转换为纬度和经度。以下扩展了Google.maps.polygon.prototype以使用此算法hm.在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.prototype.Contains=函数(点){
var crossings=0,path=this.getPath();
//每边
对于(var i=0;i=path.getLength()){
j=0;
}
var b=路径getAt(j);
if(光线交叉分段(点a、点b)){
交叉口++;
}
}
//过境点的奇数?
返回(交叉点%2==1);
功能光线交叉分段(点a、点b){
var px=点.lng(),
py=点.lat(),
ax=a.lng(),
ay=a.lat(),
bx=b.lng(),
by=b.lat();
如果(ay>by){
ax=b.lng();
ay=b.lat();
bx=a.lng();
by=a.lat();
}
//改变经度以适应180度交叉
如果(px<0){px+=360};
如果(ax<0){ax+=360};
如果(bx<0){bx+=360};
如果(py==ay | | py==by)py+=0.00000001;
if((py>by | | pyMath.max(ax,bx)))返回false;
如果(px=红色);
}
};
在这里,我们通过定义一个名为“包含”的函数扩展了google.maps.Polygon的功能,该函数可用于确定函数参数中提供的经纬度是否在多边形内。在这里,我们使用光线投射算法并使用相同的算法开发了一个函数。在执行了大量exercise现在,我们可以检查如下一点:
var point=new google.maps.LatLng(52.05249047600099,-0.6097412109375);var polygon=new google.maps.polygon({path:[INSERT_path_ARRAY_HERE]});if(polygon.Contains(point)){//点在多边形内}
有关完整的代码和演示,请转到:您可以使用我在github中镜像的libkml变体的克隆:
在本开放源码作者的帮助下,设计了一个模块,用于指示给定点是否在KML多边形内。请确保检查git源代码的分支“libkml git”,而不是“master”分支。您感兴趣的类是“pointinpolygon.cc”它是C++源代码,可以包含在项目中,并与项目一起构建。
编辑-多边形中的点问题的解决方案与它所覆盖的地图无关。true | false=google.maps.geometry.poly.containsLocation(googlePoint,googlePoly)我已经从网络上复制了函数…正如你建议的那样,我已经更改了if语句,但是函数仍然不能正常工作。你能修改整个函数并重新发布它吗?你在这里看到这个函数了吗?
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);
}
};