riku
2025-03-12 42f42dc88214f283b43c422f37e10ab45c5c5578
src/utils/map/util.js
@@ -1,14 +1,76 @@
import { map, isDragging } from '@/utils/map/index_old';
import marks from '@/utils/map/marks';
import Layer from '@/utils/map/3dLayer';
/**
 * 坐标集合的最西南角和最东北角
 * @param {*} list
 *  list 是接口获取的点 的数组
 */
const getBound = (list) => {
  const offset = 0.005;
  let south = null;
  let west = null;
  let north = null;
  let east = null;
  for (let item of list) {
    // 排除无效经纬度
    if (item[0] == 0 && item[1] == 0) {
      continue;
    }
    if ((west && item[0] < west) || !west) {
      west = item[0] - offset;
    }
    if ((south && item[1] < south) || !south) {
      south = item[1] - offset;
    }
    if ((east && item[0] > east) || !east) {
      east = item[0] + offset;
    }
    if ((north && item[1] > north) || !north) {
      north = item[1] + offset;
    }
  }
  if (!south || !west || !north || !east) {
    return { sw: null, ne: null };
  } else {
    return { sw: [west, south], ne: [east, north] };
  }
};
/**
 * 根据中心点出发的半径,得到合适的地图缩放系数
 * 高德地图缩放系数每减少1,则地图展示的实际距离放大1倍
 * 高德地图缩放系数范围[3, 18]
 * @param {*} d
 */
const distanceToZoom = (d) => {
  let baseDis = 250,
    z = 0;
  while (baseDis < d) {
    baseDis *= 2;
    z++;
  }
  // 多余的地图缩放系数
  const x = (baseDis - d) / (baseDis / 2);
  z -= x;
  z = z < 0 ? 0 : z;
  z = 18 - z;
  z = z < 3 ? 3 : z;
  return z;
};
export default {
  setCenter(lnglat) {
    if (isDragging) {
  setCenter(lnglat, ignore = false) {
    if (!ignore && isDragging) {
      return;
    }
    var now = new Date();
    if (
      this.lasttime == undefined ||
      now.getTime() - this.lasttime.getTime() >= 1000
      now.getTime() - this.lasttime.getTime() >= 200
    ) {
      map.setCenter(lnglat);
      this.lasttime = now;
@@ -20,7 +82,30 @@
  removeViews(view) {
    map.remove(view);
  },
  setFitView() {
    map.setFitView();
  clearMap() {
    marks.clearMassMarks();
    map.clearMap();
    Layer.clear();
  },
  setFitView(views) {
    if (views) {
      map.setFitView(views);
    } else {
      map.setFitView();
    }
  },
  setFitSector({ p, r }) {
    this.setCenter(p);
    const z = distanceToZoom(r);
    map.setZoom(z);
  },
  setBound(lnglats_GD) {
    const { sw, ne } = getBound(lnglats_GD);
    if (!sw || !ne) {
      return;
    }
    // eslint-disable-next-line no-undef
    var mybounds = new AMap.Bounds(sw, ne); // sw, ne > [xxx,xxx], [xxx,xxx]
    map.setBounds(mybounds);
  }
};