-
Notifications
You must be signed in to change notification settings - Fork 599
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
倾斜摄影OSGB是基于CGCS2000的,如何转换成GCJ02 的3dtiles #200
Comments
不明白你的意思, CGCS2000、GCJ02 应该都是说的基准点坐标。 |
对倾斜摄影不太了解,第三方机构提供的是基于CGCS2000的,通过3dtiles 转换成 3dtiles 文件,需要在高德地图进行加载,空间参考填写 高德的经纬度坐标点?我尝试过,转换过之后是无法正常加载的 |
高德地图支持加载 3dtiles 了? 这个项目只支持 EPSG: 4549 这种写法的解析。 |
你注意下 3dtile.exe 执行时的输出里,有没有打印 x -> {}, y -> {} 的日志。 这个坐标就是经纬度坐标。 |
输出的 坐标是 118.788434239726, 32.057578129300 |
那你高德地图经纬度填写这个坐标试试呢? 没用过 高德这个功能, 3dtile 里 b3dm 里是不涉及坐标系的, 只有 tileset.json/transform 和坐标有关 |
问题最后怎么解决的?我们也有同样的3Dtile需要展示在高德地图上 |
您好,您的邮件已收到,谢谢!
|
你好,请问问题最后怎么解决的? |
您好,您的邮件已收到,谢谢!
|
谈一些我的经验,抛砖引玉。我经历了两套b3dm要转为gcj-02坐标系。 (PS,我的b3dm文件不是通过本项目生成的,而是从别的软件导出的。所以如果是跟本项目相关的特定问题,那下面的描述帮不到您) Case 1这套文件,有多个树状结构的 Case 1.1有些文件通过 "boundingVolume": {
"box": [
0, 0, 10,
100, 0, 0,
0, 100, 0,
0, 0, 10
]
} 根据文档,前三个值就是中心点坐标。使用类似如下的代码来变更box前三个值 import { Ellipsoid } from '@math.gl/geospatial';
const updateBox = boundingVolume => {
const center = Ellipsoid.WGS84.cartesianToCartographic(boundingVolume.box.slice(0, 3));
const { lng, lat } = toGCJ02(center[0], center[1]);
const transformed = Ellipsoid.WGS84.cartographicToCartesian([lng, lat, center[2]]);
boundingVolume.box[0] = transformed[0];
boundingVolume.box[1] = transformed[1];
boundingVolume.box[2] = transformed[2];
} Case 1.2有些文件通过
if (obj.transform) obj.transform = newTransform; Case 2这是我拿到的另一套b3dm文件。这次关键的位置信息在 import { promises as fs } from "fs";
import path from "path";
import { Ellipsoid } from '@math.gl/geospatial';
const handleFile = async (file) => {
const fullPath = path.resolve(file);
const content = (await fs.readFile(fullPath));
const jsonStart = 28; // 按照协议,feature table从28开始
const jsonLength = content[12]; // 按照协议,这里是json的长度
const jsonObj = JSON.parse(content.slice(jsonStart, jsonStart + jsonLength));
const center = Ellipsoid.WGS84.cartesianToCartographic(jsonObj.RTC_CENTER);
const { lng, lat } = toGCJ02(center[0], center[1]);
const transformed = Ellipsoid.WGS84.cartographicToCartesian([lng, lat, center[2]]);
const buffer = Buffer.alloc(jsonLength, 32); // 结果中需要保持jsonLength的长度不变,如果长度不足,用'32'填充(不知道为什么,但原数据就是这样)
Buffer.from(`{"BATCH_LENGTH":1,"RTC_CENTER":[${transformed.map(val => val.toFixed(6)).join()}]}`).copy(buffer);
for (let i = 0; i < jsonLength; i++) {
content[jsonStart + i] = buffer[i];
}
await fs.writeFile(fullPath, content);
} 上述代码是处理一个 |
@lianzhao 需要您这样有分享精神的人 |
像您学习😁 顺便再分享下处理boundingVolume.region的方法,根据文档,region里的经纬度是“角度”,因此先把角度转化为经纬度,再转gcj-02,再转回角度就行了。处理一个 import { promises as fs } from "fs";
import path from "path";
import { degrees, radians } from '@math.gl/core';
const updateRegion = boundingVolume => {
const [west, south, east, north, minHeight, maxHeight] = boundingVolume.region;
const northWest = toGCJ02(degrees(west), degrees(north));
const southEast = toGCJ02(degrees(east), degrees(south));
boundingVolume.region[0] = radians(northWest.lng);
boundingVolume.region[1] = radians(southEast.lat);
boundingVolume.region[2] = radians(southEast.lng);
boundingVolume.region[3] = radians(northWest.lat);
// console.log(west, south, east, north);
// console.log(boundingVolume.region.slice(0, 4));
}
const handleObject = obj => {
updateRegion(obj.boundingVolume);
obj.children?.forEach(handleObject);
}
const handleFile = async file => {
const fullPath = path.resolve(file);
const obj = JSON.parse(await fs.readFile(fullPath));
handleObject(obj.root);
await fs.writeFile(fullPath, JSON.stringify(obj));
}; |
你好,麻烦问下,倾斜摄影OSGB是基于CGCS2000的,如何转换成GCJ02 的3dtiles
The text was updated successfully, but these errors were encountered: