经纬度合法性判断

来源:互联网 发布:初级网络优化工程师 编辑:程序博客网 时间:2024/06/07 01:23

经纬度点位未落在所规定的包围圈内,则判定经纬度不合法。说明:该脚本计算点与适量图像的关系/* *  nbMap为不同地区所形成的经纬度包围圈,在包围圈内的经纬度才算合法 */var nbMap = {'地区A':'119.817056,29.672356,119.809077,29.669017,119.802907,29.661541,119.797706,29.660926','地区B':'119.256496,29.162391,119.259813,29.160785,119.258277,29.147438,119.27259,29.141696','地区C':'119.857109,29.339346,119.850753,29.338165,119.844806,29.33209,119.833737,29.33016'             } g_calculate = {    // 判断点是否在矩形框内    isPointInRect:function(pt,rectStr){       var rect = rectStr.split(",");       var minx = rect[0];       var miny = rect[1];       var maxx = rect[2];       var maxy = rect[3];       if(pt.x<=maxx && t.x>=minx && pt.y<=maxy && pt.y>=miny){           return true;       }else return false;    },    // 判断点是否在多边形内    isPointInPolygon:function(pt,polygonStr){        var poly = [];        var polygonArr = polygonStr.split(",");        // 构造多边形坐标数组        for(var x = 0;x<polygonArr.length;x=x+2){            poly.push({                x:parseFloat(polygonArr[x]),                y:parseFloat(polygonArr[x+1])            });        }        // 形成闭包点串        poly.push({            x:parseFloat(polygonArr[0]),            y:parseFloat(polygonArr[1])        });        for (var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i)              ((poly[i].y <= pt.y && pt.y < poly[j].y) || (poly[j].y <= pt.y && pt.y < poly[i].y))&&(pt.x < (poly[j].x - poly[i].x) * (pt.y - poly[i].y) / (poly[j].y - poly[i].y) + poly[i].x)&& (c = !c);              return c;    },    // 判断点是否在圆内    isPointInCircle:function(pt,circleStr){        var centerX = parseFloat(circleStr.split(",")[0]);        var centerY = parseFloat(circleStr.split(",")[1]);        var radius = parseFloat(circleStr.split(",")[2]);        return (Math.pow((centerX-pt.x),2)+Math.pow((centerY-pt.y),2))>Math.pow(radius,2)?false:true;    },    /**     * 判断点是否在线缓冲区内     */    isPointInLineBuffer:function(pt,lineStr,radius){        /**         * 构造折现中线段数组         */        var linePointArr = lineStr.split(",");        var lineArr = [];        for(var i=0;i<linePointArr.length-2;i=i+2){            lineArr.push([{                x:parseFloat(linePointArr[i]),                y:parseFloat(linePointArr[i+1])            },{                x:parseFloat(linePointArr[i+2]),                y:parseFloat(linePointArr[i+3])                          }]);        }                /**         * 判断点是否在线的缓冲区内:1.点是否在线段上 2.点距离各条线段的垂直距离是否小于缓冲半径         */        var mindistance = radius;        for(var j=0;j<lineArr.length;j++){            // 根据两点求出直线方程            var k=(lineArr[j][0].y-lineArr[j][1].y)/(lineArr[j][0].x-lineArr[j][1].x);            var b = lineArr[j][0].y-k*lineArr[j][0].x;            // 判断点是否在线上            var minX = Math.min(lineArr[j][0].x,lineArr[j][1].x);            var maxX = Math.max(lineArr[j][0].x,lineArr[j][1].x);            if(pt.y==(k*pt.x+b)){                if(pt.x<maxX&&pt.x>minX){                    return true;                }else{                    var dis_start = Math.sqrt(Math.pow((pt.x-lineArr[j][0].x),2)+Math.pow((pt.y-lineArr[j][0].y),2));                    var dis_end = Math.sqrt(Math.pow((pt.x-lineArr[j][1].x),2)+Math.pow((pt.y-lineArr[j][1].y),2));                    mindistance = mindistance>Math.min(dis_start,dis_end)?Math.min(dis_start,dis_end):mindistance;                }            }else{                // 求垂线常量b                var b_cx = (1/k)*pt.x+pt.y;                // 求垂点                var x_cd = (b_cx - b)/(k+1/k);                var y_cd = k * x_cd + b;                // 如果垂点落在线段内,点到线段最短距离为垂线段距离                if(x_cd<maxX&&x_cd>minX){                    var cx_dis = Math.sqrt(Math.pow((pt.x-x_cd),2)+Math.pow((pt.y-y_cd),2));                    mindistance = mindistance<cx_dis?mindistance:cx_dis;                }else{ // 否则计算点到线段两端点的最短距离                    var dis_start = Math.sqrt(Math.pow((pt.x-lineArr[j][0].x),2)+Math.pow((pt.y-lineArr[j][0].y),2));                    var dis_end = Math.sqrt(Math.pow((pt.x-lineArr[j][1].x),2)+Math.pow((pt.y-lineArr[j][1].y),2));                    mindistance = mindistance>Math.min(dis_start,dis_end)?Math.min(dis_start,dis_end):mindistance;                }            }        }        return mindistance<radius?true:false;    }}

0 0
原创粉丝点击