2012-02-21 2 views
0

Я пытаюсь проверить, проходит ли полилиния Google Карты через многоугольник 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

ответ

0

Я столкнулся с рабочим решением.

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

Эта геометрия пакет включает в себя функцию, называемую findIntersections().

Я проверил петлю $.each на каждом полигоне на моей карте, а затем переместил каждую точку в многоугольник в массив, а затем каждую точку в полилинии в массив. Наконец, я провел две петли и переместил координаты 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; 
       } 
      } 
     }) 
    }) 

Это, наверное, немного грязно, но это работает.

Смежные вопросы