这条折线是否穿过这个多边形? [英] Does this polyline pass through this polygon?

查看:76
本文介绍了这条折线是否穿过这个多边形?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图测试Google地图多段线是否通过Google地图多边形。听起来很简单。但我已经搜索过,并没有找到真正的答案。



最近我得到了这个功能。它可以工作,但令人沮丧的是,它会返回偶尔出现的误报。

  // nvert =多边形中的点数
// vertx =所有多边形纬度的数组
// verty =所有多边形经度的数组
// elat =当前点的纬度
// elng =当前点的数值经度

函数pnpoly(nvert,vertx,verty,elat,elng){
var i,j,c = false; (((verty [i]> elng)!=(verty [j]>)(b = ; elng))&&
(elat <(vertx [j] - vertx [i])*(elng-verty [i])/(verty [j] - verty [i])+ vertx [i])){
c =!c;
}
}
return c;
}

在我尝试一个全新的方法之前(a 疯狂的数学思想,让我回到12年级的微积分),我想知道任何人都知道如何做到这一点。

解决方案

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



https://github.com/albertsun/ JavaScript几何



此几何包包含一个名为 findIntersections()的函数。



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



$ p $函数processPath(折线,多边形){
$ .each(polygons,function(i,polygon){
var polygonArr = [] //用于存储多边形中每个点的数组
$ b polygon.getPaths( ).forEach(function(k,g){
$ .each(kb,function(l,m){
polygonArr.push({'lat':m.lat(),'lng' :m.lng()});
});
});

//获取polyLINE
var numStops =折线中的点数。 getPath()。b.length -1;

//获取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){
//我们已经到了最后,回到开始
var polyCoorNextx = polygonArr [0] .lat
var polyCoorNexty = polygonArr [0] .lng
} else {
//转到下一个点
var polyCoorNextx = polygonArr [j + 1] .lat
var polyCoorNexty =如果(findIntersections([[[lineCoor1x,lineCoor1y],[lineCoor2x,lineCoor2y]],[[polyCoorx,polyCoory],[polyCoorNextx,polyCoorNexty]]]中的polygonArr [j + 1] .lng
} ).length!= 0){
whereInside [i] = i;
return;


})
})

这可能有点麻烦,但它的工作。


I’m trying to test whether a Google Maps polyline passes through a Google Maps polygon. Sounds simple. But I’ve searched and searched... and found no real answers.

Closest I got was this function. It works but, frustratingly, returns the occasional false positive.

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

Before I try a whole new method (a crazy math idea that brings me back to Grade 12 calculus), I’m wondering anyone knows how to accomplish this.

解决方案

I've come across a working solution.

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

This geometry package includes a function called findIntersections().

I ran an $.each loop on each polygon on my map, then pushed each point in the polygon into an array, then each point in the polyline into an array. Finally, I ran two loops and pushed the lat/lon coordinates into variables for the function. It returns empty when it doesn't find anything and returns the coordinates of intersection when it finds something.

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

It's probably a bit messy but it works.

这篇关于这条折线是否穿过这个多边形?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆