Google maps 此多段线是否穿过此多边形?

Google maps 此多段线是否穿过此多边形?,google-maps,polygon,polyline,Google Maps,Polygon,Polyline,我试图测试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 /

我试图测试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;
    }
//nvert=多边形中的点数
//vertx=所有多边形纬度的数组
//verty=所有多边形经度的数组
//elat=当前点的纬度
//elng=当前点的经度
函数pnpoly(nvert、vertx、verty、elat、elng){
var i,j,c=假;
对于(i=0,j=nvert-1;ielng)!=(verty[j]>elng))&&
(elat<(vertx[j]-vertx[i])*(elng-verty[i])/(verty[j]-verty[i])+vertx[i])){
c=!c;
}
}
返回c;
}

在我尝试一种全新的方法(一种让我回到12年级微积分的方法)之前,我想知道是否有人知道如何做到这一点。

我遇到了一个可行的解决方案

此几何图形包包括一个名为
findIntersections()
的函数

我在地图上的每个多边形上运行了一个
$。每个
循环,然后将多边形中的每个点推到一个数组中,然后将多段线中的每个点推到一个数组中。最后,我运行了两个循环,并将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;
                }
            }
        })
    })

它可能有点凌乱,但它可以工作。

回顾过去,我认为我的问题是将行中的所有点传递到此函数,包括最后一点和第一点。这将生成一个返回假阳性的闭合多边形。