2012-02-21 24 views
0

我想测试Google Maps多段线是否通过Google Maps多边形。听起来很简单。但我已经搜索并搜索......并没有找到真正的答案。此多段线是否穿过此多边形?

最近我得到了这个功能。它的工作原理令人沮丧地回报了偶尔的误报。

//nvert = the number of points in the polygon 
//vertx = an array of all the polygon's latitudes 
//verty = an array of all the polygon's longitudes 
//elat = the current point's latitude 
//elng = the current point's longitude 

function pnpoly(nvert, vertx, verty, elat, elng) { 
     var i, j, c = false; 
     for(i = 0, j = nvert-1; i < nvert; j = i++) { 
      if(((verty[i] > elng) != (verty[j] > elng)) && 
       (elat < (vertx[j] - vertx[i]) * (elng - verty[i])/(verty[j] - verty[i]) + vertx[i])) { 
        c = !c; 
      } 
      } 
      return c; 
    } 

之前,我尝试了一个全新的方法(crazy math idea这让我回到12年级微积分),我不知道任何人知道如何做到这一点。

+0

回想起来,我认为我的问题是通过这个函数的所有点 - 包括最后一点和第一点在一起。这将会产生一个封闭的多边形,它会返回一个误报。 – podcastfan88 2012-03-31 22:01:21

回答

0

我遇到了一个工作解决方案。

https://github.com/albertsun/JavaScript-Geometry

这种几何结构包包括一个称为findIntersections()功能。

我在地图上的每个多边形上运行了一个$.each循环,然后将多边形中的每个点都推入一个数组,然后将多段线中的每个点都放入一个数组中。最后,我运行了两个循环,并将纬度/经度坐标推入该函数的变量中。它在找不到任何东西时返回空值,并在找到某物时返回相交的坐标。

function processPath(polyline, polygons){ 
$.each(polygons, function(i,polygon){ 
    var polygonArr = [] // array for storing each point in polygon 

    polygon.getPaths().forEach(function(k,g){ 
     $.each(k.b, function(l,m){ 
      polygonArr.push({'lat':m.lat(),'lng':m.lng()}); 
     }); 
    }); 

    //Get the number of points in the polyLINE 
    var numStops = polyline.getPath().b.length -1; 

    //Get the path and coordinates of the polyLINE 
    var polylineArr = []; 

    polyline.getPath().forEach(function(z,y){ 
     polylineArr.push({'lat':z.lat(),'lng':z.lng()}); 
    }); 
    $.each(polygonArr, function(j, polygon){ 
     $.each(polylineArr, function(k, polyline){ 
      if(k+1 != polylineArr.length){ 
       var lineCoor1x = polylineArr[k].lat; 
       var lineCoor1y = polylineArr[k].lng; 
       var lineCoor2x = polylineArr[k+1].lat; 
       var lineCoor2y = polylineArr[k+1].lng; 
       var polyCoorx = polygonArr[j].lat; 
       var polyCoory = polygonArr[j].lng; 
       if(j+1 == polygonArr.length){ 
        // We've reached the end, go back to the start 
        var polyCoorNextx = polygonArr[0].lat 
        var polyCoorNexty = polygonArr[0].lng 
       } else { 
        // Go to the next point 
        var polyCoorNextx = polygonArr[j+1].lat 
        var polyCoorNexty = polygonArr[j+1].lng 
       } 
       if(findIntersections([[[lineCoor1x,lineCoor1y], [lineCoor2x,lineCoor2y]], [[polyCoorx,polyCoory],[polyCoorNextx,polyCoorNexty]] ]).length != 0){ 
        whereInside[i] = i; 
        return; 
       } 
      } 
     }) 
    }) 

这可能有点混乱,但它的工作原理。