美文网首页
Cesium工具集

Cesium工具集

作者: zhuyx0304 | 来源:发表于2024-04-01 10:26 被阅读0次
/**
 * WGS84坐标转笛卡尔空间直角坐标
 * @param { WGS84 }
 * @return { Cartesian3 }
 */
export function wgs84ToCartesian3(wgs84) {
  return Cesium.Cartesian3.fromDegrees(
    wgs84.longitude,
    wgs84.latitude,
    wgs84.height,
    Cesium.Ellipsoid.WGS84
  );
}

/**
 * 笛卡尔空间直角坐标转WGS84坐标
 * @param { Cartesian3 }
 * @return { WGS84 }
 */
export function cartesian3ToWgs84(cartesian3) {
  const cartographic =
    Cesium.Ellipsoid.WGS84.cartesianToCartographic(cartesian3);
  const longitude = Cesium.Math.toDegrees(cartographic.longitude);
  const latitude = Cesium.Math.toDegrees(cartographic.latitude);
  const height = cartographic.height;
  return { longitude, latitude, height };
}

/**
 * WGS84坐标转弧度
 * @param { WGS84 }
 * @return { Cartographic.Radians }
 */
export function wgs84ToRadians(wgs84) {
  return Cesium.Cartographic.fromDegrees(
    wgs84.longitude,
    wgs84.latitude,
    wgs84.height
  );
}

/**
 * 判断拾取模型的位置
 * @param { Cartesian2, Viewer }
 * @return { Boolean }
 */
export function isModel(cartesian2, viewer) {
  const LIST = viewer.scene.drillPick(cartesian2);
  return LIST.some((item) => {
    const { primitive } = item;
    return (
      (item && primitive instanceof Cesium.Cesium3DTileFeature) ||
      (item && primitive instanceof Cesium.Cesium3DTileset) ||
      (item && primitive instanceof Cesium.Model)
    );
  });
}

/**
 * 拾取位置
 * @param { Cartesian2, Viewer }
 * @return { Cartesian3, WGS84 }
 */
export function pickPosition(cartesian2, viewer) {
  const globePosition = pickGlobePosition(cartesian2, viewer);
  const terrainPosition = pickTerrainPosition(cartesian2, viewer);
  const modelPosition = pickModelPosition(cartesian2, viewer);
  const isPickModel = isModel(cartesian2, viewer);
  return isPickModel ? modelPosition : terrainPosition || globePosition;
}

/**
 * 拾取球面位置
 * @param { Cartesian2, Viewer }
 * @return { Cartesian3 }
 */
export function pickGlobePosition(cartesian2, viewer) {
  try {
    return viewer.scene.camera.pickEllipsoid(
      cartesian2,
      viewer.scene.globe.ellipsoid
    );
  } catch (error) {
    return null;
  }
}

/**
 * 拾取地形位置
 * @param { Cartesian2, Viewer }
 * @return { Cartesian3 }
 */
export function pickTerrainPosition(cartesian2, viewer) {
  try {
    const ray = viewer.scene.camera.getPickRay(cartesian2);
    return viewer.scene.globe.pick(ray, viewer.scene);
  } catch (error) {
    return null;
  }
}

/**
 * 拾取模型位置
 * @param { Cartesian2, Viewer }
 * @return { Cartesian3 }
 */
export function pickModelPosition(cartesian2, viewer) {
  try {
    const cartesian3 = viewer.scene.pickPosition(cartesian2);
    const cartographic = Cesium.Cartographic.fromCartesian(cartesian3);
    if (cartographic.height < 0) cartographic.height = 0;
    const longitude = Cesium.Math.toDegrees(cartographic.longitude);
    const latitude = Cesium.Math.toDegrees(cartographic.latitude);
    const height = cartographic.height;
    return wgs84ToCartesian3({ longitude, latitude, height });
  } catch (error) {
    return null;
  }
}

/**
 * 获取多边形中心点
 * @param { Polygon }
 * @return { Cartesian3 }
 */
export function getPolygonCenter(polygon) {
  const positions = polygon.hierarchy.getValue(
    Cesium.JulianDate.now()
  ).positions;
  return Cesium.BoundingSphere.fromPoints(positions).center;
}

/**
 * 视图定位方法,定位到点
 * @param lon 经度
 * @param lat 纬度
 * @param alt 范围(相机距离中心点的位置为5000)
 */
export function cameraFlyToLonLat(lon, lat, alt, viewer) {
  viewer.camera.flyTo({
    destination: Cesium.Cartesian3.fromDegrees(lon, lat, alt),
    orientation: {
      heading: Cesium.Math.toRadians(0.0),
      pitch: Cesium.Math.toRadians(-90.0),
      roll: 0.0,
    },
  });
}

// 获取屏幕中心点经纬度
export function getCenterPosition(viewer) {
  let centerResult = viewer.camera.pickEllipsoid(
    new Cesium.Cartesian2(
      viewer.canvas.clientWidth / 2,
      viewer.canvas.clientHeight / 2
    )
  );
  let curPosition =
    Cesium.Ellipsoid.WGS84.cartesianToCartographic(centerResult);
  let curLongitude = (curPosition.longitude * 180) / Math.PI;
  let curLatitude = (curPosition.latitude * 180) / Math.PI;
  return {
    lon: curLongitude,
    lat: curLatitude,
  };
}

相关文章

网友评论

      本文标题:Cesium工具集

      本文链接:https://www.haomeiwen.com/subject/iwkstjtx.html