2012-02-21 40 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; 
       } 
      } 
     }) 
    }) 

這可能有點混亂,但它的工作原理。