cesium加载3dtile并将geojson进行叠加(保姆级教程)

这段时间一直在研究这个问题,今天终于是解决了,受到了很多人的帮助,不然可能还要很久才能摸索出方法。

在开始之前,我们假设你已经知道了cesium的最基础的使用方法,比如下载cesium,启动cesium等。

好了,步入正题。首先你除了需要准备cesium的那些源码文件外还需要:1、相应的osgb文件和dwg文件(本篇文章以这种为例)。2、Qgis软件。3、cesiumlab。4、arcmap软件。

分为两个部分进行操作:

1、对dwg文件的处理:

使用你的arcmap打开dwg文件,将dwg格式转换为shp文件(方法为:选中文件->右键->数据->导出数据)。将导出的shp文件加载进arcmap,此时你需要知道你要转换的文件的初始坐标系,我这里是CGCS2000 114E,于是将导入的shp文件定义投影为CGCS2000 114E,之后再使用工具箱中的投影,将该shp文件的投影修改为wgs 84(因为cesium的默认坐标系使它,如果你不想自己之后的json文件出现一些奇奇怪怪的问题,转它就对了)。

cesium加载3dtile并将geojson进行叠加(保姆级教程)_第1张图片

转换完成后,此时记得查看你的arcmap的右下角,看看数字是多大,如果还是很大的数字(上万的那种),说明你只是定义了坐标系但是没有正确转换,此时如果你用这个数据进行后续的操作,你的cesium的结果应该是这样的。

cesium加载3dtile并将geojson进行叠加(保姆级教程)_第2张图片

如果正确转换(很明显的是地理经纬度),那么此时记得查看你的shp的属性,看看有没有这个ZM,如果有的话,就需要先将三维的矢量数据转换成二维的,再进行下一步的操作。

 cesium加载3dtile并将geojson进行叠加(保姆级教程)_第3张图片

 三维转二维方法:1、打开arcmap菜单栏地理处理->环境->将M值和Z值都调整为Disabled,保存。2、打开工具栏,选择要素转为shapefile,不要像上文一样使用数据导出。

cesium加载3dtile并将geojson进行叠加(保姆级教程)_第4张图片

 cesium加载3dtile并将geojson进行叠加(保姆级教程)_第5张图片

 导出后发现ZM不见了就说明已经转换成功。

此时打开Qgis软件,将刚刚处理完成的shp文件加载进去,按照图片方法选择,之后选择格式为Geojson,直接进行导出即可。

cesium加载3dtile并将geojson进行叠加(保姆级教程)_第6张图片

 cesium加载3dtile并将geojson进行叠加(保姆级教程)_第7张图片

导出数据后,记得删除掉geojson中的name和crs属性,然后将geojson的后缀名直接改为json,就可以在cesium的代码中调用了。

好了,到此第一部分完成,下面开始第二部分。

2、对osgb文件进行处理:

打开你下载好的cesiumlab(下载地址:Cesium实验室官网),首页的下载点击即可,下载后完成安装。之后打开cesiumlab,注册一个账号,就会进入到该页面。

cesium加载3dtile并将geojson进行叠加(保姆级教程)_第8张图片

点击上图中红色框(倾斜模型切片),选择你的文件,设置参数,注意将存储类型改为散列。然后点击开始转换,接下来就静静等待转换即可。

cesium加载3dtile并将geojson进行叠加(保姆级教程)_第9张图片

转换成功之后就会发现你的输出路径中存在一个tileset.json文件,这个就是你到使用cessium时url指向的文件。

完成上述两步之后,就可以使用cesium进行加载了。

附上加载的代码:

// 这个就是你通过Qgis转换出来的geojson文件
function load_shp3d() {
  var tileset = viewer.dataSources.add(Cesium.GeoJsonDataSource.load('xxx.json', {
    fill: Cesium.Color.PINK.withAlpha(0.5),
    clampToGround: true        // 叠加就用它
  }))
   viewer.zoomTo(tileset);     // 定位到你的数据
   viewer.homeButton.viewModel.command.beforeExecute.addEventListener(function (e) {
    e.cancel = true;
    viewer.zoomTo(tileset);    // 重写homebutton
  })
}

// 这个是你通过cessiumlab转化的osgb文件
function load_tileset() {
  var tileset = new Cesium.Cesium3DTileset({ url: 'xxx.json' })
  viewer.scene.primitives.add(tileset);
  viewer.zoomTo(tileset);  // 在初始化时定位至模型位置
  viewer.homeButton.viewModel.command.beforeExecute.addEventListener(function (e) {
    e.cancel = true;
    viewer.zoomTo(tileset);
  });
}

最后,为了防止Qgis下载速度慢,将我的Qgis安装包分享给大家:链接:https://pan.baidu.com/s/1giG5jQxlcVZN1b8GiMWaUg?pwd=bsds 
提取码:bsds

你可能感兴趣的:(3d)