球面坐标中已知起点坐标、终点坐标、最大长度、当前长、当前宽求终点坐标(三角函数)

球面坐标中已知起点坐标、终点坐标、最大长度、当前长、当前宽求终点坐标-三角函数

// 球面坐标系,通过三角函数求终点坐标
// startPoint(lng,lat): 起点
// endPoint(lng,lat): 当前终点
// distance: 距离
//long:  当前长
//wide: 当前宽
function getInFivePath(startPoint, endPoint, distance, long, wide) {
      const { lng, lat } = endPoint;
      const point = { lng, lat };
      const perimeter = 2 * Math.PI * 6371000;   //经线 周长 计算 : 2 π × 6371000 = 40030173 米 1维度 ≈ perimeter米
      const rate = Math.cos(startPoint.lat * Math.PI / 180); // 指定维度球面长度和赤道长度的比率
      const lngPerM = 360 / (latPerimeter * rate) ; //1米对应经度
      // 即x偏移量需要根据所在维度进行计算 不同维度球面周长不同
      const latPerM = 360 / perimeter; //1 米对应纬度 
      // 计算纬度, 对应的度数是固定的 ;
     if (long > distance) {
        //当前长度大于最大长度时
        if (startPoint.lng > endPoint.lng) {
          //当起点经度大于终点经度 则减去5000米对应经度
          point.lng = startPoint.lng - lngPerM * distance;
        } else {
          point.lng = startPoint.lng + lngPerM * distance;
        }
      }
      if (short > distance) {
        //当前宽度大于最大长度时
        if (startPoint.lat > endPoint.lat) {
          point.lat = startPoint.lat - latPerM * distance;
        } else {
          point.lat = startPoint.lat + latPerM * distance;
        }
      }
      return [
        startPoint,
        this.mapInstance.lngLat({ lng: point.lng, lat: startPoint.lat }),
        this.mapInstance.lngLat(point),
        this.mapInstance.lngLat({ lng: startPoint.lng, lat: point.lat }),
      ];
}

你可能感兴趣的:(前端)