var a = 6378.137;
|
var e = 0.0818192;
|
var k0 = 0.9996;
|
var e2 = e * e; //e的平方
|
var e4 = e2 * e2; //e的4次方
|
var e6 = e4 * e2; //e的6次方
|
var E0 = 500;
|
var N0 = 0;
|
|
/**经纬度转XY的方法
|
*String lon经度
|
*String lat纬度
|
*/
|
export function gps2xybiandianzhan(yuandianjd, yuandianwd, lon, lat) {
|
// var yuandianjd = Dell_JZGGA.getYuandianjd(); //原点的经度
|
// var yuandianwd = Dell_JZGGA.getYuandianwd(); //原点的纬度
|
var xy = run_gps2xyurt(yuandianwd, yuandianjd, lat, lon);
|
return xy;
|
}
|
/**将实时经纬度转为XY坐标输出
|
*@param 原点纬度lat0
|
* @param 原点经度lon0
|
* @param lat 时时纬度
|
* @param lon 时时经度
|
*/
|
function run_gps2xyurt(lat0, lon0, lat, lon) {
|
var realxy = new Array(2).join(',').split(',');
|
var xycs = initiize_ublox_zeropoint(lat0, lon0, 0);
|
var x0 = xycs[0];
|
var y0 = xycs[1];
|
var c = xycs[2];
|
var s = xycs[3];
|
|
var xy = new Array(2).join(',').split(',');
|
var x = ubloxraw2xy(lat, lon)[0] - x0;
|
var y = ubloxraw2xy(lat, lon)[1] - y0;
|
xy[0] = c * x - s * y;
|
xy[1] = s * x + c * y;
|
|
var x1 = xy[1] * 100;
|
var y1 = xy[0] * 100;
|
|
realxy[0] = x1;
|
realxy[1] = y1;
|
return realxy;
|
}
|
/**初始化原点位置和方向
|
* 输出原点以米为单位的xy坐标, cos值, sin值*/
|
function initiize_ublox_zeropoint(lat, lon, th) {
|
var xycs = new Array(4).join(',').split(',');
|
xycs[0] = ubloxraw2xy(lat, lon)[0];
|
xycs[1] = ubloxraw2xy(lat, lon)[1];
|
var th1 = th * Math.PI / 180; //x轴与正北方向夹角th(单位是度)
|
xycs[2] = Math.cos(th1);
|
xycs[3] = Math.sin(th1);
|
return xycs;
|
}
|
/**输入ublox的度分经纬度,输出xy,单位米*/
|
function ubloxraw2xy(lat, lon) {
|
var xy = new Array(3).join(',').split(',');
|
var lond = ublox_dm2d(lon);
|
var latd = ublox_dm2d(lat);
|
var dxy = utm(latd, lond);
|
xy[0] = dxy[0] * 1000;
|
xy[1] = dxy[1] * 1000;
|
xy[2] = dxy[2];
|
return xy;
|
|
}
|
/**将度分格式数据转为度格式输出*/
|
function ublox_dm2d(ddmm_dot_m) {
|
var d0 = Math.floor(ddmm_dot_m / 100);
|
var d = d0 + (ddmm_dot_m - d0 * 100) / 60;
|
return d;
|
}
|
/**通过经纬度获取XY坐标*/
|
function utm(lat, lon) {
|
var dxy = new Array(3).join(',').split(',');
|
|
var zonenum1 = lon / 6;
|
//floor是地板的意思,表示向下取整
|
if (zonenum1 > 0) {
|
zonenum1 = Math.floor(zonenum1);
|
} else { //向上取整
|
zonenum1 = Math.ceil(zonenum1); //向上取整
|
}
|
|
var Zonenum = zonenum1 + 31;
|
|
var lambda0 = ((Zonenum - 1) * 6 - 180 + 3) * (Math.PI) / 180;
|
|
var phi = lat * (Math.PI) / 180;
|
|
var lambda = lon * (Math.PI) / 180;
|
|
var v = 1 / Math.sqrt((1 - e2 * Math.pow(Math.sin(phi), 2)));
|
|
var A = (lambda - lambda0) * Math.cos(phi);
|
var A2 = A * A;
|
var A3 = A2 * A;
|
var A4 = A3 * A;
|
var A5 = A4 * A;
|
var A6 = A5 * A;
|
|
var T = Math.tan(phi) * Math.tan(phi);
|
var T2 = T * T;
|
|
var C = e2 * Math.cos(phi) * Math.cos(phi) / (1 - e2);
|
var C2 = C * C;
|
|
var s = (1 - e2 / 4 - 3 * e4 / 64 - 5 * e6 / 256) * phi -
|
(3 * e2 / 8 + 3 * e4 / 32 + 45 * e6 / 1024) * Math.sin(2 * phi) +
|
(15 * e4 / 256 + 45 * e6 / 1024) * Math.sin(4 * phi) - 35 * e6 / 3072 * Math.sin(6 * phi);
|
|
dxy[0] = E0 + k0 * a * v * (A + (1 - T + C) * A3 / 6 + (5 - 18 * T + T2) * A5 / 120);
|
|
dxy[1] = N0 + k0 * a * (s + v * Math.tan(phi) * (A2 / 2 + (5 - T + 9 * C + 4 * C2) * A4 / 24 + (61 - 58 * T + T2) *
|
A6 / 720));
|
dxy[2] = Zonenum;
|
return dxy;
|
}
|
|
/**
|
* 判断点是否在多边形内
|
* @param point 检测点
|
* @param pts 多边形的顶点集合
|
* @return 点在多边形内返回true,否则返回false
|
*/
|
export function inPoly(point, pts) {
|
var N = pts.length;
|
var boundOrVertex = true; //如果点位于多边形的顶点或边上,也算做点在多边形内,直接返回true
|
var intersectCount = 0;
|
var precision = 2e-10; //浮点类型计算时候与0比较时候的容差
|
var p1, p2;
|
var p = point; //当前点
|
|
p1 = pts[0];
|
for (var i = 1; i <= N; ++i) {
|
if (p == p1) {
|
return boundOrVertex;
|
}
|
p2 = pts[i % N];
|
if (p.x < Math.min(p1.x, p2.x) || p.x > Math.max(p1.x, p2.x)) {
|
p1 = p2;
|
continue;
|
}
|
|
if (p.x > Math.min(p1.x, p2.x) && p.x < Math.max(p1.x, p2.x)) {
|
if (p.y <= Math.max(p1.y, p2.y)) {
|
if (p1.x == p2.x && p.y >= Math.min(p1.y, p2.y)) {
|
return boundOrVertex;
|
}
|
|
if (p1.y == p2.y) {
|
if (p1.y == p.y) {
|
return boundOrVertex;
|
} else {
|
++intersectCount;
|
}
|
} else {
|
var xinters = (p.x - p1.x) * (p2.y - p1.y) / (p2.x - p1.x) + p1.y;
|
if (Math.abs(p.y - xinters) < precision) {
|
return boundOrVertex;
|
}
|
|
if (p.y < xinters) {
|
++intersectCount;
|
}
|
}
|
}
|
} else {
|
if (p.x == p2.x && p.y <= p2.y) {
|
var p3 = pts[(i + 1) % N];
|
if (p.x >= Math.min(p1.x, p3.x) && p.x <= Math.max(p1.x, p3.x)) {
|
++intersectCount;
|
} else {
|
intersectCount += 2;
|
}
|
}
|
}
|
p1 = p2;
|
}
|
|
if (intersectCount % 2 == 0) {
|
return false;
|
} else {
|
return true;
|
}
|
|
}
|