Skip to content

取得鼠标处经纬度海拔高度

loading

three-tile 插件提供辅助函数,简化取得鼠标位置信息

ts
function showLocation(viewer, map, id) {
  const pointer = new THREE.Vector2();
  viewer.container.addEventListener("pointermove", (evt) => {
    // 取得鼠标所指位置经纬度海拔高度信息
    const lonlat = plugin.getLocalFromMouse(evt, map, viewer.camera);
    if (lonlat) {
      const el = document.querySelector(id);
      el.innerHTML = `经度:${lonlat.x.toFixed(6)}° 纬度:${lonlat.y.toFixed(6)}° 海拔:${lonlat.z.toFixed(6)}m`;
    }
  });
}
showLocation(viewer, map, "#local-info");

three-tile 提供多种取得地面信息的方法,包括通过屏幕坐标、经纬度、世界坐标取得地面信息(地形采样):

1. 根据屏幕坐标取得地面信息

通过 TileMap.getLocalInfoFromScreen()屏幕坐标处的地图经纬度以及海拔高度,鼠标在地图上移动时,取得屏幕坐标再调用它取得地面信息。函数的定义如下:

ts
/**
 * 获取指定屏幕坐标的地面信息
 * @param camera 摄像机
 * @param pointer 点的屏幕坐标(-0.5~0.5)
 * @returns 位置信息(经纬度、高度等)
 */
getLocalInfoFromScreen(camera: Camera, pointer: Vector2): LocationInfo | undefined;

返回类型为 LocationInfo,类型定义如下:

  • distance —— 射线投射原点和相交部分之间的距离。
  • point —— 相交部分的点(世界坐标)
  • face —— 相交的面
  • faceIndex —— 相交的面的索引
  • object —— 相交的物体
  • uv —— 相交部分的点的 UV 坐标。
  • uv1 —— 相交部分的点的第二组 UV 坐标
  • normal - 交点处的内插法向量
  • instanceId – 与 InstancedMesh 物体相交时的 instance 索引
  • location: Verctor3 —— 经纬度信息(经度、纬度、高度[米])

最后一项 location 即为经纬度海拔高度信息,其中 x 为经度、y 为纬度、z 为海拔高度(m)。

主要代码代码:

ts
// 显示地理位置信息

function showLocation(viewer, map, id) {
  const pointer = new THREE.Vector2();
  viewer.container.addEventListener("pointermove", (evt) => {
    // 计算屏幕坐标(-0.5到+0.5范围)
    pointer.x = (evt.clientX / viewer.renderer.domElement.clientWidth) * 2 - 1;
    pointer.y = -(evt.clientY / viewer.renderer.domElement.clientHeight) * 2 + 1;
    // 取得该坐标的信息
    const info = map.getLocalInfoFromScreen(viewer.camera, pointer);
    if (info) {
      const el = document.querySelector(id);
      el.innerHTML = `经度:${info.location.x.toFixed(6)}° 纬度:${info.location.y.toFixed(6)}° 海拔:${info.location.z.toFixed(1)}m`;
    }
  });
}
showLocation(viewer, map, "#local-info");

2. 根据经纬度取得地面信息

类似的,TileMap.getLocalInfoFromGeo()根据经纬度取得地面信息:

ts
 /**
 * Get the ground infomation from latitude and longitude
 * 获取指定经纬度的地面信息(法向量、高度等)
 * @param geo 地理坐标
 * @returns 地面信息
 */
getLocalInfoFromGeo(geo: Vector3): LocationInfo | undefined;

3. 根据海拔高度取得地面信息

同样,TileMap.getLocalInfoFromWorld()根据世界坐标取得地面信息:

ts
/**
 * Get loacation infomation from world position
 * 获取指定世界坐标的地面信息
 * @param pos 世界坐标
 * @returns 地面信息
 */
getLocalInfoFromWorld(pos: Vector3): LocationInfo | undefined;

4. 应用场景

  • 实时显示鼠标处的经纬度、海拔高度、世界坐标、法向量(可以计算坡向)等
  • 取得指定经纬度的海拔高度、世界坐标、法向量等
  • 取得指定世界坐标处的经纬度和海拔高度等
  • 鼠标点击放置模型到地面

TIP

这几个函数是通过计算射线与地形交点取得,所以需要等地形瓦片加载完毕后才能取得,否则会返回空值。


Released under the MIT License.