JavaScript 计算地图折线中点 (无需地图 API)
假设我们已经有了一组地图上的折线坐标点,可以通过以下步骤求得折中点:
- 计算折线的总长度
可以使用以下代码计算折线的总长度:
function getLineLength(line) {
var len = 0;
for (var i = 0; i < line.length - 1; i++) {
var p1 = line[i];
var p2 = line[i + 1];
len += Math.sqrt(Math.pow(p2[0] - p1[0], 2) + Math.pow(p2[1] - p1[1], 2));
}
return len;
}
其中 line 是一个二维数组,每个元素都是一个坐标点的数组,例如 [[x1, y1], [x2, y2], ...]。
- 计算折线上每个点的累积距离
使用以下代码可以计算折线上每个点的累积距离:
function getLineDistances(line) {
var distances = [0];
for (var i = 1; i < line.length; i++) {
var p1 = line[i - 1];
var p2 = line[i];
var dist = Math.sqrt(Math.pow(p2[0] - p1[0], 2) + Math.pow(p2[1] - p1[1], 2));
distances.push(distances[i - 1] + dist);
}
return distances;
}
这个函数返回一个数组,数组的下标表示折线上的每个点,数组的值表示该点到折线起点的累积距离。
- 找到距离折线起点一半距离的点
根据上面的函数,我们可以找到距离折线起点一半距离的点:
function getHalfwayPoint(line) {
var len = getLineLength(line);
var distances = getLineDistances(line);
var halfwayDist = len / 2;
for (var i = 0; i < distances.length; i++) {
if (distances[i] >= halfwayDist) {
var p1 = line[i - 1];
var p2 = line[i];
var segmentLen = distances[i] - distances[i - 1];
var segmentRatio = (halfwayDist - distances[i - 1]) / segmentLen;
var halfwayX = p1[0] + (p2[0] - p1[0]) * segmentRatio;
var halfwayY = p1[1] + (p2[1] - p1[1]) * segmentRatio;
return [halfwayX, halfwayY];
}
}
}
这个函数返回一个包含两个元素的数组,表示折线上距离起点一半距离的点的坐标。
完整代码如下:
function getLineLength(line) {
var len = 0;
for (var i = 0; i < line.length - 1; i++) {
var p1 = line[i];
var p2 = line[i + 1];
len += Math.sqrt(Math.pow(p2[0] - p1[0], 2) + Math.pow(p2[1] - p1[1], 2));
}
return len;
}
function getLineDistances(line) {
var distances = [0];
for (var i = 1; i < line.length; i++) {
var p1 = line[i - 1];
var p2 = line[i];
var dist = Math.sqrt(Math.pow(p2[0] - p1[0], 2) + Math.pow(p2[1] - p1[1], 2));
distances.push(distances[i - 1] + dist);
}
return distances;
}
function getHalfwayPoint(line) {
var len = getLineLength(line);
var distances = getLineDistances(line);
var halfwayDist = len / 2;
for (var i = 0; i < distances.length; i++) {
if (distances[i] >= halfwayDist) {
var p1 = line[i - 1];
var p2 = line[i];
var segmentLen = distances[i] - distances[i - 1];
var segmentRatio = (halfwayDist - distances[i - 1]) / segmentLen;
var halfwayX = p1[0] + (p2[0] - p1[0]) * segmentRatio;
var halfwayY = p1[1] + (p2[1] - p1[1]) * segmentRatio;
return [halfwayX, halfwayY];
}
}
}
使用方法:
var line = [[0, 0], [2, 2], [4, 1], [6, 3]];
var halfwayPoint = getHalfwayPoint(line);
console.log(halfwayPoint); // [2.8284271247461903, 1.4142135623730951]
原文地址: https://www.cveoy.top/t/topic/oYWh 著作权归作者所有。请勿转载和采集!