# 坐标转换,常见转换
//屏幕坐标 转换为 笛卡尔空间直角坐标
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);
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(); //转换为 地理坐标(弧度制)
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);
});
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 如何配置才能正确定位
参考示例中的这几个文件,首先需要运行浏览器访问你的位置,如果请求超时可能需要代理。
# 想获取到当前视窗的地图范围,请问有什么方法可以拿到吗
比如当前视窗地图范围的边界点,每个边界点的经纬度 mars3d 的 API 文档中有相关的方法:具体使用可以参考文档地址:http://mars3d.cn/api/Map.html?classFilter=map#getExtent 主要是 getExtent 方法,此方法的返回值为一个对象,可以使用如下方式进行从中取需要的值即可
const { xmin, xmax, ymin, ymax, height } = map.getExtent();
# 坐标没有高度,都是 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;
});
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;
}
});
2
3
4
5
6
7