坐标转换问题

8/26/2024

# 坐标转换,常见转换

//屏幕坐标 转换为 笛卡尔空间直角坐标
var cartesian3 = mars3d.PointUtil.getCurrentMousePosition(
  map.scene,
  windowPosition
);

//笛卡尔空间直角坐标 转换为 屏幕坐标
var windowPosition = Cesium.SceneTransforms.wgs84ToWindowCoordinates(
  map.scene,
  cartesian3
); //v1.119之前版本
var windowPosition = Cesium.SceneTransforms.worldToWindowCoordinates(
  map.scene,
  cartesian3
); //v1.119及之后版本

//笛卡尔空间直角坐标   转换为   地理坐标(弧度制)
var cartographic = Cesium.Cartographic.fromCartesian(cartesian3);

//笛卡尔空间直角坐标   转换为   地理坐标(经纬度)
var point = mars3d.LngLatPoint.fromCartesian(cartesian3);

//地理坐标(弧度制)   转换为   笛卡尔空间直角坐标
var cartesian3 = Cesium.Cartesian3.fromRadians(lng, lat, height); //lng\lat为弧度制

//地理坐标(经纬度)  转换为  笛卡尔空间直角坐标
var cartesian3 = Cesium.Cartesian3.fromDegrees(longitude, latitude, height);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

或者使用 mars3d.LngLatPoint 作为中间类来做转换

//笛卡尔空间直角坐标   转换为   地理坐标(经纬度)
var point = mars3d.LngLatPoint.fromCartesian(cartesian3);

//地理坐标(弧度制)   转换为    地理坐标(经纬度)
var point = mars3d.LngLatPoint.fromCartographic(cartographic);

//point 转换为  其他坐标
var cartesian3 = point.toCartesian(); //转换为  笛卡尔空间直角坐标
var cartographic = point.toCartographic(); //转换为  地理坐标(弧度制)
1
2
3
4
5
6
7
8
9

示例代码:

map.on(mars3d.EventType.click, function (event) {
  var point = mars3d.LngLatPoint.fromCartesian(event.cartesian); //转为经纬度
  console.log("鼠标单击坐标", point);
});
1
2
3
4

# 问:Mars3d 根据经纬度能知道是哪个城市吗?

调用高德、百度、天地图的逆地理编码就行 http://mars3d.cn/api/GaodePOI.html?classFilter=gaode#getAddress

# app 项目定位精度很差有没有好的解决办法?

定位精度目前依赖手机浏览器来定位的 , 如果再优化就需要利用第 3 方库来提高精度,如百度或高德 js,或封装安卓 app 后的 plus 的 h5 方式

# 同一个页面,可以展示不同坐标系吗

basemap 是 epsg4326 的。,layer 图层是 epsg 4450 的。可以在一个页面中展示吗?
回复: 可以不同坐标系叠加,但 layer 图层是 epsg 4450 的只支持 arcgis 动态服务,其他情况的不支持
wmts 只支持 3 个坐标系,EPSG4490\4326\3857

# Mars3d 高德的定位 api 如何配置才能正确定位

参考示例中的这几个文件,首先需要运行浏览器访问你的位置,如果请求超时可能需要代理。

image

# 想获取到当前视窗的地图范围,请问有什么方法可以拿到吗

比如当前视窗地图范围的边界点,每个边界点的经纬度 mars3d 的 API 文档中有相关的方法:具体使用可以参考文档地址:http://mars3d.cn/api/Map.html?classFilter=map#getExtent 主要是 getExtent 方法,此方法的返回值为一个对象,可以使用如下方式进行从中取需要的值即可

const { xmin, xmax, ymin, ymax, height } = map.getExtent();
1

# 坐标没有高度,都是 0,怎么计算坐标,根据经纬度求高度

const position = graphic.position;
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;
});
1
2
3
4
5
6
7
8
9
10
11
12
13

# 能取得到图片最顶端的坐标吗?

要做 2 次转换,先转像素坐标,像素坐标减去高度值后转笛卡尔空间坐标

# 根据经纬度如何能计算得到这个经纬度切片的 xyz 坐标?

这个规则都一致的,所有 web 墨卡托的瓦片地图规则

# 如何修改 Entity 的位置

entity.postion = xxxx,修改坐标位置,直接赋值修改

# 怎么根据 id 定位?

getLayerById,拿到对应 id 的矢量数据然后再 flyTo

如果是 pathEntity.flyToPoint(),目前只能定位到他所在的实时定位。如果想要定位,还得同步时钟。可以外部记录下 path 的所有坐标 map.flyToPositions

# 模型在 2d 视图下,和 3d 视图下的高度不一致怎么办

map.on(mars3d.EventType.terrainChange, function (event) {
  if (map.hasTerrain) {
    tiles3dLayer.alt = 11.5;
  } else {
    tiles3dLayer.alt = -118.5;
  }
});
1
2
3
4
5
6
7

#

最后更新: 8/30/2024, 3:28:06 PM