外观
坐标转换问题
约 1765 字大约 6 分钟
2026-10-27
坐标转换的常见方法
回复// 屏幕坐标 转换为 笛卡尔空间直角坐标
// let cartesian3 = mars3d.PointUtil.getCurrentMousePosition(map.scene, windowPosition);//v3.8及之前版本
let cartesian3 = map.getCurrentMousePosition(windowPosition); // v3.9及之后版本
// 笛卡尔空间直角坐标 转换为 屏幕坐标
let windowPosition = mars3d.PointTrans.toWindowCoordinates(map.scene, cartesian3);
// 笛卡尔空间直角坐标 转换为 地理坐标(弧度制)
const cartographic = Cesium.Cartographic.fromCartesian(cartesian3);
// 笛卡尔空间直角坐标 转换为 地理坐标(经纬度)
const point = mars3d.LngLatPoint.fromCartesian(cartesian3);
// 地理坐标(弧度制) 转换为 笛卡尔空间直角坐标
let cartesian3 = Cesium.Cartesian3.fromRadians(lng, lat, height); // lng\lat为弧度制
// 地理坐标(经纬度) 转换为 笛卡尔空间直角坐标
let cartesian3 = Cesium.Cartesian3.fromDegrees(longitude, latitude, height);或者使用 mars3d.LngLatPoint 作为中间类进行转换
// 笛卡尔空间直角坐标 转换为 地理坐标(经纬度)
let point = mars3d.LngLatPoint.fromCartesian(cartesian3);
// 地理坐标(弧度制) 转换为 地理坐标(经纬度)
let point = mars3d.LngLatPoint.fromCartographic(cartographic);
// point 转换为 其他坐标
let cartesian3 = point.toCartesian(); // 转换为 笛卡尔空间直角坐标
let cartographic = point.toCartographic(); // 转换为 地理坐标(弧度制)示例代码:
map.on(mars3d.EventType.click, (event) => {
const point = mars3d.LngLatPoint.fromCartesian(event.cartesian); // 转为经纬度
console.log("鼠标单击坐标", point);
});Mars3D 根据经纬度能判断所在的城市吗?
回复调用高德、百度、天地图的逆地理编码即可,参考:http://mars3d.cn/api/GaodePOI.html?classFilter=gaode#getAddress
移动端定位精度差有没有好的解决办法?
回复目前的定位精度依赖手机浏览器实现,如果需要进一步优化,可以利用第 3 方库提高精度,例如百度或高德的 JS API,或者将项目封装为安卓 App 后使用 plus 的 H5 方式。同一页面能否展示不同坐标系的图层
basemap 是 EPSG4326 的,layer 图层是 EPSG4450 的,可以在一个页面中展示吗?
回复可以叠加不同坐标系,但 EPSG4450 的 layer 图层只支持 ArcGIS 动态服务,其他情况不支持。WMTS 只支持 3 个坐标系:EPSG4490、4326、3857。
Mars3D 中高德的定位 API 如何配置才能正确定位?
回复参考示例中的这几个文件,首先需要允许浏览器访问你的位置,如果请求超时可能需要配置代理。
如何获取当前视窗的地图范围
例如想获取当前视窗地图范围的边界点,以及每个边界点的经纬度。
回复Mars3D 的 API 文档中提供了相关方法,具体使用可以参考文档地址:http://mars3d.cn/api/Map.html?classFilter=map#getExtent主要是 getExtent 方法,此方法的返回值为一个对象,可以按如下方式从中取出需要的值:
const { xmin, xmax, ymin, ymax, height } = map.getExtent();坐标没有高度(都是 0)时,如何根据经纬度求高度?
回复const {position} = graphic;
mars3d.PointUtil.getSurfaceHeight(map.scene, graphic.position, {
has3dtiles: true,
}).then((result) => {
console.log(
`原始高度为:${
result.height_original.toFixed(2)
},贴地高度:${
result.height.toFixed(2)}`
);
graphic.position = result.position;
});能获取到图片最顶端的坐标吗?
回复需要进行 2 次转换:先转换为像素坐标,像素坐标减去高度值后再转换为笛卡尔空间直角坐标。如何根据经纬度计算对应切片的 xyz 坐标?
回复计算规则都是一致的,即所有 Web 墨卡托瓦片地图的通用规则。EPSG:4490 底图上 Billboard 的位置与高德拾取的位置对不上
回复在高德坐标拾取器上位置正确,说明这组坐标是 GCJ-02,而不是 WGS84。EPSG:4490(CGCS2000)底图如果是无偏移坐标,不能将 GCJ-02 坐标直接叠加使用,也不能先执行wgs2gcj 再叠加一次。应先确认底图是否为偏移坐标,再做一次转换:
const position = mars3d.PointTrans.gcj2wgs([lng, lat])
const graphic = new mars3d.graphic.BillboardEntity({
position,
style: {
image: "https://data.mars3d.cn/img/marker/lace-blue.png",
width: 40,
height: 40,
clampToGround: true
}
})
graphicLayer.addGraphic(graphic)如果同一组点切换到天地图影像上位置吻合,即可认定原始坐标是 GCJ-02。
