Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google maps 检查点是否位于多边形(贴图)中_Google Maps_Coordinates_Bing Maps_Point - Fatal编程技术网

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);
  }
};