假设我们已经有了一组地图上的折线坐标点,可以通过以下步骤求得折中点:

  1. 计算折线的总长度

可以使用以下代码计算折线的总长度:

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], ...]

  1. 计算折线上每个点的累积距离

使用以下代码可以计算折线上每个点的累积距离:

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;
}

这个函数返回一个数组,数组的下标表示折线上的每个点,数组的值表示该点到折线起点的累积距离。

  1. 找到距离折线起点一半距离的点

根据上面的函数,我们可以找到距离折线起点一半距离的点:

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]
JavaScript 计算地图折线中点 (无需地图 API)

原文地址: https://www.cveoy.top/t/topic/oYWh 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录