当前位置: 首页 > 知识库问答 >
问题:

three.js - Threejs的世界坐标如何转换经纬度?

归誉
2024-07-12

在threejs中自定义了一个场景,该场景的原点由经纬度转换而来,创建了一条以原点为起点的线段,hover到线段上的时候如何计算hover点的经纬度?

获取到的经纬度与实际经纬度存在较大偏差

共有2个答案

南门焱
2024-07-12
function worldToLatLon(vector3, radius) {
    if (!(vector3 instanceof THREE.Vector3)) {
        throw new Error("输入的坐标不是 Three.js 的 Vector3 对象");
    }
    
    const [x, y, z] = vector3; 

    const latitude = Math.asin(y / radius) * (180 / Math.PI);
    const longitude = Math.atan2(z, x) * (180 / Math.PI);
    
    return {
        latitude,
        longitude,
    };
}

const radius = 6371; // 地球的半径,单位为公里
const vector3 = new THREE.Vector3(1000, 2000, 3000); // 世界坐标

const latLon = worldToLatLon(vector3, radius);
console.log(`纬度: ${latLon.latitude}, 经度: ${latLon.longitude}`);
呼延宪
2024-07-12

在 Three.js 中,将世界坐标(通常是 x, y, z 的三维空间坐标)转换为经纬度并不是直接的过程,因为 Three.js 本身并不直接处理地理坐标。但是,如果你有一个从地理坐标(经纬度)到 Three.js 世界坐标的映射关系,你可以尝试逆向这个过程来估算 hover 点的经纬度。

假设和简化

  1. 地球是一个完美的球体:虽然实际上地球是一个椭球体,但为了简化,我们假设它是一个完美的球体。
  2. 原点:你已经有一个由经纬度转换而来的原点。这个原点通常位于球体的表面。
  3. 线段:你创建了一条从原点出发的线段。

转换方法

  1. 确定球体的半径:这取决于你的地图投影和地球模型。对于 WGS84 椭球体,平均半径约为 6,371 公里(或 6,371,000 米)。但你可能需要根据你的具体需求进行调整。
  2. 将 hover 点从世界坐标转换为方向向量:首先,你需要找到 hover 点相对于原点的方向向量。这可以通过将 hover 点的坐标减去原点的坐标来实现。
  3. 计算纬度:由于纬线是水平的,你可以通过计算 hover 点方向向量与 x-z 平面(或任何与纬度线平行的平面)的夹角来估算纬度。这个夹角可以使用点积和向量的模来计算。
  4. 计算经度:经度是围绕地球的水平线,因此你需要找到 hover 点方向向量在 x-y 平面(或任何与经度线平行的平面)上的投影。然后,你可以通过计算这个投影与 x 轴的夹角来估算经度。
  5. 调整和优化:由于这种方法是基于简化的地球模型,并且忽略了地球的真实形状和地图投影的影响,因此估算的经纬度可能会有偏差。你可能需要根据你的具体需求进行调整和优化。

示例代码(伪代码)

请注意,以下代码是伪代码,并不直接适用于 Three.js,但它展示了如何估算 hover 点的经纬度:

// 假设 origin 是由经纬度转换而来的原点(Three.js 坐标)
// hoverPoint 是 hover 点的 Three.js 坐标

// 计算方向向量
let directionVector = new THREE.Vector3().subVectors(hoverPoint, origin);

// 计算纬度(简化示例)
let latitudeRadians = Math.acos(directionVector.y / directionVector.length());
let latitudeDegrees = THREE.MathUtils.radToDeg(latitudeRadians);

// 计算经度(简化示例)
let longitudeRadians = Math.atan2(directionVector.z, directionVector.x);
let longitudeDegrees = THREE.MathUtils.radToDeg(longitudeRadians);

// 输出估算的经纬度
console.log(`Estimated latitude: ${latitudeDegrees.toFixed(2)}°`);
console.log(`Estimated longitude: ${longitudeDegrees.toFixed(2)}°`);

注意事项

  • 这个方法只是一个简化的示例,并不适用于所有情况。
  • 你可能需要根据你的具体需求和地图投影来调整和优化这个方法。
  • 如果精度要求很高,你可能需要使用更复杂的地理信息系统(GIS)库或 API 来处理经纬度到世界坐标的转换和反向转换。
 类似资料:
  • 通过前两节课的学习,想必你已经对Threejs的层级模型有了一定认识,那么本节课就在层级模型概念的基础上,继续给家讲解两个新的概念,即本地坐标系和世界坐标系。 如果你对本地坐标系和世界坐标系已经有了一定概念,那么可以直接访问模型的位置属性.position获得模型在本地坐标系或者说模型坐标系下的三维坐标,通过模型的.getWorldPosition()方法获得该模型在世界坐标下的三维坐标。 .ge

  • 问题内容: 我正在尝试将经纬度对转换为像素坐标。我发现了这种墨卡托投影,但我不理解代码。x_adj,y_adj变量是什么因素?当我在没有这些常量的情况下运行代码时,我的经/纬对就不在地图上,并且x和y像素坐标也不是我想要的。 问题答案: 这些变量从何而来 选择这些变量以使计算出的坐标与地图的背景图像匹配。如果知道地图的投影参数,则可以计算它们。但是我相信,它们很可能是通过反复试验而获得的。 如何计

  • 问题内容: 我具有纽约市纽约市的纬度/经度值;40.7560540,-73.9869510和地球的平面图像,即1000px×446px。 我希望能够使用Javascript将纬度/经度转换为X,Y坐标,该点将反映该位置。 因此,图像左上角的X,Y坐标将是;289、111 注意事项: 不用担心要使用哪种投影的问题,可以自己做假设,也可以按照自己知道的可行的方法进行操作 X,Y可以形成图像的任意一角

  • 我的表有两个浮动列,分别表示纬度和经度坐标。 我想使用PostGIS的ST_DWithin查找距离给定点一定距离内的所有记录。 的签名期望前两个参数是几何体或地理数据类型,因此我非常确定解决方案是将纬度/液化天然气坐标转换为地理坐标,但我无法让它工作。 以下是不起作用的: 我得到这个错误: 错误:函数st_geogfromtext(未知)不存在 第1行:从ST_DWithin(ST_GeogFro

  • 问题内容: 我有一个类型为(com.vividsolutions.jts.geom.Geometry)的几何对象。它目前是经度,纬度形式,我想翻转坐标,使其经度为纬度,这样我就可以将其以GeoJSON格式用于mongodb。 我看到的约束是:a)我想翻转坐标的输入是Geometry对象。b)几何对象将是多边形类型或多多边形。c)我想在将类型强制转换为Polygon / multipolygon之前

  • 问题内容: 我有一个类型为(com.vividsolutions.jts.geom.Geometry)的几何对象。它目前是经度,纬度形式,我想翻转坐标,使其经度为纬度,这样我就可以将其以GeoJSON格式用于mongodb。 我看到的约束是:a)我想翻转坐标的输入是Geometry对象。b)几何对象将是多边形类型或多多边形。c)我想在将类型强制转换为Polygon / multipolygon之前

  • 我正试图在OpenGL(C++)中使一个光源跟随鼠标。在world coords中,我的屏幕中心是,我的鼠标中心是(窗口res是1280,720)。我只转换了中心的坐标,但我不知道如何转换其余的坐标。 用于转换中心坐标: 我尝试的另一个转换是 其中x和y是鼠标坐标。 到目前为止,我在网上找到的所有解决方案都不起作用。 有什么想法吗?

  • 我有一张以色列地图。 我需要创建一个获得两个双参数(经度和纬度)的函数,该函数应该在地图图像中的那个区域上画一个小圆圈。 我有以下关于地图的信息: null 截图: https://gyazo.com/5a19dece37ebace496c6b8d68eb9ec3c