2012-02-21 5 views
0

Google MapsポリラインがGoogle Mapsポリゴンを通過するかどうかをテストしようとしています。シンプルに聞こえる。しかし、私は検索して検索しました...本当の答えは見つかりませんでした。このポリラインはこのポリゴンを通過しますか?

私はこの機能をもっていました。それはうまくいきますが、時折偽陽性を返します。私は(バック年生12微積分に私をもたらしcrazy math idea)全く新しい方法を試す前に

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

は、私は誰を思ったんだけど、これを達成する方法を知っています。

+0

私の問題は、最後のポイントと最初のポイントを合わせて、この関数の行のすべてのポイントを渡していたと思います。これは、偽陽性を返す閉じたポリゴンを作成します。 – podcastfan88

答えて

0

私は実用的なソリューションを見つけました。

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

この幾何学パッケージはfindIntersections()と呼ばれる機能が含まれています。

地図上の各ポリゴンに$.eachループを実行した後、ポリゴンの各ポイントを配列にプッシュし、ポリラインの各ポイントを配列にプッシュしました。最後に、2つのループを実行して関数の変数にlat/lon座標をプッシュしました。何も見つからないときは空を返し、見つかったら交差点の座標を返します。

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

おそらく少し乱雑ですが、うまく機能します。

関連する問題