三维智慧管网数据处理与发布流程

标签: 三维 分类: Gis 创建时间:2020-10-12 06:02:05 更新时间:2024-11-15 10:49:44

从数据处理到三维发布,主要经过以下几个步骤,由于经费和技术有限,只能做到大体上相似了。

1.管线CAD处理

为了实现每米的管线颜色不同,就要实现按米对直线进行打断的操作。与其将三维管线模型建好之后,在进行分割,可以在cad图中,先将线段进行定距等分,然后使用分割好的线段,然后进行建模。

(1) 在CAD中可以使用me命令,对直线进行定距等分,这里的等分,其实是对直线上的点进行增密的操作,每隔一定的距离就增加一个点,但是最后直线还是那条直线,只不过现在多了好几个点罢了。

(2) 管线打断。

参考文章:
1.CAD打断(BREAK)命令的使用技巧 (CAD的打断点命令)
2.在CAD中如何在一条多段线中增加节点? (对线段进行增加节点的处理)
3.cad如何将线段等分 (这里使用me命令,包含了两种方式,一种就是定数等分,一种是定距等分)
4.SketchUp草图大师如何给直线等分? (这是在sketchup中进行定数等分直线的操作)
5.DIVIDE(命令) (使用DIVIDE命令进行定数等分)
6.“点样式”对话框 (设置点的样式)
7.cad中把一条直线从某点切断的方法有哪些?【AutoCAD教程】 (这里有两种方式,一种是打断线,一种是打断与点)
8.cad怎么打断直线 (这是打断线,估计没啥用)

2.管线建模

管线的模型创建,就是需要在3dmax或者是sketchup中进行手工建模了。因为我自己也不是非常的专业,我觉得主要就是将cad图导入到3dmax或者是sketchup进行放样处理,将绘制的二维管道线段,变成三维管道,可能还需要增加一些管点,阀门等设施。为了挂载属性和点击的方便,必要的时候,还需要对管道进行分割,分成一段一段的管道,这样就可以通过cesiumlab进行属性挂接和在cesium中,进行点击处理了。

如果经费充足,倒是有个好用的参数化建模工具,可以直接从shp文件生成漂亮的管网,当然价格还是不便宜的。

生成的效果我就贴一张在群里发现的图吧,其实效果还是不错的。

在建模时候,为了在赋值属性的时候方便,以及改变管线颜色的过程方便,需要将管线进行打断,按米进行,然后每一米赋值一个id号。可以参考 3DMax学习之绘制管道 这篇文章中分割和绘制管道的部分,我这里其实都是很水的,专业的建模人员应该不是这样做的。

参考文章:
1.CAD导入3ds Max建模步骤解析 (CAD图导入3dmax进行建模的步骤)
2.PipeSer管线管网云服务 除了个人开发的蚂蚁管线建模工具,我又在群里找到了这个叫PipeSecr的在线创建管线的服务,是开发CesiumLab的公司开发的。价格还是有点高,没有地方适用,不过如果单纯的制作管网的话,我觉得其实也还是OK的,毕竟业务量起来了,就不在乎这点小钱了吧。所见即所得、无限承载、标准服务、丰富的材质库、免费的附属物库、灵活的数据导入、无限制的图层配置、私有化部署、二次开发,主要的特点就是这些,如果有机会可以尝试一下。

3.位置确定

使用建模工具或者是sketchup中进行处理的模型,要想放到适当的地理位置上去,需要有一个参照,这个时候可以借助于openstreep数据,将openstreepmap数据导入到3dmax之后,作为参照,然后移动模型,将移动模型后的位置,放到合适的位置,再进行模型导出操作。

(1) 从openstreetmap网站,下载 osm 特定区域的数据

(2) 下载 osm2world 软件,使用osm2world软件将osm数据转换成obj模型,可以参考 Post not found: 三维技术研究之获取城市模型 三维技术研究之获取城市模型 中的软件使用。

(3) 将生成的底图的obj导入到3dmax,作为参考,将其他的模型,分别移动到合适的位置,我在移动的时候,其实就是按照一个大概的意思去移动的,没有很精确的移动到,这个我估计应该是有方法的。

(4) 移动编辑好模型之后,就可以将模型导出为obj

注意
还有一点要注意的是,物体坐标的中心位置在那里,这个决定了你使用局部坐标时进行坐标编写的位置,如果3dmax中的物体坐标中心在物体的中间,那么你设置局部坐标系的时候,这个坐标就是这个中心所在的经纬度。我的做法就是:

(1) 找到一个好认的点作为坐标中心点,然后选中该物体,通过3dmax右侧的->层次->轴->调整轴,将物体的坐标中心移动到该点,或者直接对其到世界坐标,也就是底图osm数据的中心,这样就可以直接使用osm底图的中心坐标为参考点了

(2) 然后找到该点对应的地理坐标,填入cesiumlab中的局部坐标中

3.属性编辑

属性编辑,就是要对生成的3Dtiles进行属性的赋值。属性文件要求如下:
(1)必须是csv格式,utf8编码。

(2)第一列必须是【唯一名称】。

(3)第一列的值和模型场景里的名称关联匹配。

参考文章:
1.CesiumLab属性文件 (这是CesiumLab管网提供的生成属性文件的方法)
2.图层列表

4.3Dtiles数据生成

3Dtiles主要使用的就是CesiumLab文件,操作方法也非常的简单。

(1) 打开CesiumLab程序,选中通用模型处理工具,选择导出的obj文件。

(2) 打开设置对话框,设置零点坐标和属性文件

(3) 选择要存储的属性数据,和输出的文件位置,开始处理,就可以将obj模型导出为3dtitle文件了。

5.Cesium数据加载

生成了3dtiles数据,就可以使用Cesiumjs进行数据加载了。这个可以参考 Post not found: Censium加载3dtiles Censium加载3dtiles 这篇文章。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 加载城市建筑物
let titleUrl="xxx";
let tileset=null;
// 加载3d管道模型
tileset = viewer.scene.primitives.add(new Cesium.Cesium3DTileset({
url: titleUrl+"/pipeline/tileset.json", //数据路径
maximumScreenSpaceError: 2, //最大的屏幕空间误差
maximumNumberOfLoadedTiles: 1000, //最大加载瓦片个数
}));
tileset.readyPromise.then(function(tileset) {
viewer.scene.primitives.add(tileset);

// 获取三维模型
var transparentStyle = new Cesium.Cesium3DTileStyle({
color : "color('blue', 0.3)",
show : true
});
tileset.style=transparentStyle;
}).otherwise(function(error) {
console.log(error);
});
// 跳到模型上
viewer.zoomTo(tileset);
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。