方案一: 获取两点坐标中间某个点的坐标

/**
* 获取两点坐标间 某一点的坐标
* 已知a、b两点的坐标 a(x1,y1),b(x2,y2), c到a的距离r 。求c点的坐标 c(cx,cy)。
* 求 cy 可以根据d / a到b距离 = a到c垂直距离 / a 到 b的垂直距离。
* cy = (d*(y2-y1))/r + y1;
* cx = (d*(x2-x1))/r + x1;
* @param a.lng x1
* @param a.lat y1
* @param b.lng x2
* @param b.lat y2
* @param r a点到c的距离r
* @param d a点到b的距离d
* @return {Object | null}
*/
function getOneBetweenTwoPoint(a, b, d, r) {
if (!(a && b && d && r)) {
return null;
}
let cx = (r * (b.lng - a.lng)) / d + a.lng;
let cy = (r * (b.lat - a.lat)) / d + a.lat;
return { lng: cx, lat: cy };
}
/**
* 计算两个经纬度坐标点之间的距离
* @param {object} sp 起点坐标点
* @param {object} ep 终点坐标点
* @return {number} 计算后得出两点之间的距离
*/
function getDistance(sp, ep) {
let getRad = (d) => (d * Math.PI) / 180.0; //经纬度转换成三角函数中度分表形式
let radLat1 = getRad(sp.lat);
let radLat2 = getRad(ep.lat);
let a = radLat1 - radLat2;
let b = getRad(sp.lng) - getRad(ep.lng);
let 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 * 6378137; // 地球半径(米);
return s;
}
// 使用示例补中间点(百度地图)
let aPoint = { lng: 116.399957, lat: 40.000328 }; //起点
let bPoint = { lng: 116.511778, lat: 39.841846 }; //终点
let distance = getDistance(aPoint, bPoint); //a点与b点的距离
let range = distance / 2; //步长(总距离除以2是取两个点的中间步长)
let aMarker = new BMap.Marker(new BMap.Point(aPoint.lng , aPoint.lat));
let bMarker = new BMap.Marker(new BMap.Point(bPoint.lng , bPoint.lat));
let cMarker = getOneBetweenTwoPoint(aPoint, bPoint, distance, range);
map.addOverlay(aMarker);
map.addOverlay(bMarker);
map.addOverlay(cMarker);
方案二:获取两点坐标间补点的坐标集合

实现思路
1.计算起点与终点之间的距离
2.根据距离除以步长(每多少米补一个点)计算出需要补点的总数
3.用终点经纬度减去起点经纬度得到经纬度差
4.用经纬度差除以补点的总数得到每步的经纬度差
5.循环补点的总数,每次在起点经纬度的基础上加上经纬度差乘以总数
/**
* 计算两个经纬度坐标点之间的距离
* @param {Object} sp 起点坐标点
* @param {Object} ep 终点坐标点
* @return {Number} 计算后得出两点之间的距离
*/
function getDistance(sp, ep) {
let getRad = (d) => (d * Math.PI) / 180.0; //经纬度转换成三角函数中度分表形式
let radLat1 = getRad(sp.lat);
let radLat2 = getRad(ep.lat);
let a = radLat1 - radLat2;
let b = getRad(sp.lng) - getRad(ep.lng);
let 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 * 6378137; // 地球半径(米);
return s;
}
/**
* 根据总距离和步长在两个经纬度坐标点之间补点
* @param {Object} sp 起点坐标点
* @param {Object} ep 终点坐标点
* @param {Number} d 总距离(米)
* @param {Number} r 步长(米)
* @param {Boolean} c 输出是否包含起终点
* @return {Array} 补点后的坐标数组(包含起点和终点)
*/
function getFillPoints(sp, ep, d, r, c) {
if (!(sp && ep && d && r)) {
return [];
}
let lngDiff = ep.lng - sp.lng; //起点与终端经度差
let latDiff = ep.lat - sp.lat; //起点与终端纬度差
let n = Math.ceil(d / r); //补点的总数
let a = lngDiff / n; //每步的经度差
let b = latDiff / n; //每步的纬度差
let points = []; //坐标数组
for (let i = 1; i < n; i++) {
let lng = sp.lng + a * i;
let lat = sp.lat + b * i;
points.push({ lng, lat });
}
if(c) {
points.unshift(sp); //添加起点
points.push(ep); //添加终点
}
return points;
}
// 使用示例(百度地图)
let startPoint = { lng: 116.399957, lat: 40.000328 }; //起点
let endPoint = { lng: 116.511778, lat: 39.841846 }; //终点
let distance = getDistance(startPoint, endPoint); //起点与终点的距离
let range = 1000; //步长
let containBoth = true; //包含两端
let allPoints = getFillPoints(startPoint, endPoint, distance, range, containBoth);
allPoints.forEach((point) => {
let marker = new BMap.Marker(new BMap.Point(point.lng, point.lat));
map.addOverlay(marker);
});
该博客介绍了如何在给定两点经纬度坐标的情况下,计算这两点之间的中间点坐标以及根据步长补足多个点的坐标。提供了一种计算两点间距离的算法,并实现了在地图上标记这些点的功能。适用于地理信息系统或地图应用开发。
1270





