经纬度对应平面图点位

        //计算的比例
	var x4 = '31.060515451559638';
	var y4 = '121.85861929760972';

	var d1 = {x:481,y:334};
	var d2 = {x:903,y:26};
	var bl = getDistance(31.051878669835858,121.88823542629495,31.04110923834139,121.91168526936235)/distant(d1,d2);
	
	var d4_1 = getDistance(31.051878669835858,121.88823542629495,x4,y4)
	var d4_2 = getDistance(31.04110923834139,121.91168526936235,x4,y4)
	var d4_3 = getDistance(31.027150463250678,121.87392325813505,x4,y4)

	//获取平面第4个坐标
	latlon(481,334,d4_1/bl,903,26,d4_2/bl,892,834,d4_3/bl);
	//当前方法使用长方形验证,长4高3
	//x1,y1为第1个点的坐标0,0
	//x2,y2为第2个点的坐标0,3
	//x3,y3为第3个点的坐标4,0
	//x4,y4为第4个点,坐标未知
	//已知第1个点距离第4个点5
	//已知第2个点距离第4个点4
	//已知第3个点距离第4个点3
	//验证结果x4,y4坐标为x4=4,y4=3为正确
	function latlon(x1,y1,d1,x2,y2,d2,x3,y3,d3) {
		var a11 = 2 * (x1 - x3);
		var a12 = 2 * (y1 - y3);
		var b1 = Math.pow(x1, 2) - Math.pow(x3, 2)+ Math.pow(y1, 2) - Math.pow(y3, 2)+ Math.pow(d3, 2) - Math.pow(d1, 2);
		var a21 = 2 * (x2 - x3);
		var a22 = 2 * (y2 - y3);
		var b2 = Math.pow(x2, 2) - Math.pow(x3, 2)+ Math.pow(y2, 2) - Math.pow(y3, 2)+ Math.pow(d3, 2) - Math.pow(d2, 2);
		var d0 = (b1 * a22 - a12 * b2) / (a11 * a22 - a12 * a21);
		var d1 = (a11 * b2 - b1 * a21) / (a11 * a22 - a12 * a21);
		console.log(d0,d1);
		//return {d0,d1};
	}

	//计算平面2点之间的距离
	function distant(a,b){
		let dx = Number(a.x) - Number(b.x)
		let dy = Number(a.y) - Number(b.y)
		return Math.pow(dx*dx + dy*dy, .5)
	}

	// 经纬度转换成三角函数中度分表形式。
	function rad(d) {
		return d * Math.PI / 180.0; 
	}

	// 根据经纬度计算距离,参数分别为第一点的纬度,经度;第二点的纬度,经度
	function getDistance(lat1, lng1, lat2, lng2) {
		var radLat1 = rad(lat1);
		var radLat2 = rad(lat2);
		var a = radLat1 - radLat2;
		var b = rad(lng1) - rad(lng2);
		var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
			Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
		s = s * 6378.137; // EARTH_RADIUS;
		s = Math.round(s * 10000) / 10000; //输出为公里

		var distance = s;
		var distance_str = "";

		if (parseInt(distance) >= 1) {
			distance_str = distance.toFixed(1) + "km";
		} else {
			distance_str = distance * 1000 + "m";
		}

		//s=s.toFixed(4);
		//console.info('lyj 距离是', s * 1000);
		//console.info('lyj 距离是', distance_str);
		return s * 1000;
	}

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

Back To Top

鄂ICP备17008157号-1