查看原文
其他

异曲同工:分批导出SU模型技巧与免插件导出方法【2019-19】


Highlights

1、用插件单次导出8000要素耗时超1小时

2、用插件按少量多次导出可大幅提高效率

3、用插件分批导出需要搭配一个定位要素

4、面要素转多面体时要注意设置分组参数;

5、SU导入Collada耗时较长且会丢失坐标


嗨~多磨,三连更第三弹稍微跳了半天的票哈,反复测试导出效率花掉太多时间了。今天分享两个东西,一个是分批导出SU模型的技巧,一个是导出SU模型的免插件方法,顺带也对比了一下有无插件的效率差异。感谢工学部篮球场同学反映用插件导出SU崩溃的问题,并特别鸣谢东瑾同学留言分享的免插件导出SU模型流程。


【插件导出效率测试】

书接前文,在【2019-011】中向大家介绍了SketchUp6ESRI插件及其犀利的导出功能,然而,面对大量待导出数据时,插件本身的性能却成了整套操作的瓶颈。为了充分说明其效率问题,以1000个为间隔,对单次导出100010000个要素的时间成本进行了测试,从点击导出数据的确定按钮开始计时,至生成SketchUp模型文件停止计时,精确到秒。测试平台的关键配置包括:CPU为i7-8550U,内存16GB(8GB×2)固态硬盘为镁光M.2接口256GB(走SATA-III通道),软件为ArcGIS 10.2.2。测试时已尽量关闭其他可能占用系统资源的程序,测试结果如表1图1所示。


表1 插件导出SU模型耗时与效率统计表
要素数量
(个)
耗时
(时:分:秒)
效率
(个/秒)
1000
00:00:06
166.7
2000
00:00:54
37.0
3000

00:03:05

16.2
4000
00:07:288.9
5000
00:14:465.6
6000
00:26:113.8
7000
00:41:112.8
8000
01:02:232.1
9000
01:35:111.6
10000
02:08:431.3


图1 插件导出SU模型耗时与要素数量关系


随着导出要素数量的增加效率大幅降低耗时增长呈幂函数,当单次导出8000个要素时,时间成本已超过1小时。试想,这么长时间的运算,中间万一出点儿差错(比如同学、同事、熊孩子、主子等踩掉了你的电源之类的),岂不是亏大了。由于这里统计的是净时间,考虑到重复操作的枯燥以及后续在SkethUp中来回复制粘贴的时间成本,推荐单次至少导出2000或3000个要素。如果你想以导出数据占用电脑无法工作为由,偷懒去B站追个番,那么单次导出6000个要素是个不错的选择(足够让你从OP看到ED了);如果你更喜欢追美剧,那么单次导出7000至8000个也无妨;如果你的领导也凑巧看到了这篇推文……自己好好想一想吧。


【分批导出SU模型技巧】

导出崩溃基本上是因为单次导出数量太多(数量过多其实效率上也不划算啊),虽然不是每个人都需要导出几万十几万的建筑体块,但这种需求既然确实存在,那就值得讨论一下。分批导出有一个重要的技巧——建立定位要素。以【2019-018】分享的无锡市建筑栅格的部分数据为例(图2(栅格转面要素操作参见【2019-001】),先来看看一般的分批导出会有什么问题。


图2 无锡市中心区部分建筑物数据


将数据分为上下两部分,分别通过插件导出为SketchUp模型(详细操作参见【2019-011】)。用SketchUp打开输出的两个文件,将其中一个文件的模型全部选中并复制,切换到另一个SketchUp窗口,点击菜单栏上的编辑-原位粘贴图3)。这个命令算是整合数据基本操作,然而在这里显然不太好使


图3 试图通过原位粘贴整合数据


图3可以观察到,每个导出的模型都是以全体要素中心点作为原点,原位粘贴又是以原点为基准实现的,所以这样分批导出的模型没办法较为便捷地整合起来。

小明同学立刻就想到了一个好办法:分批选择导出时,再多选一个共同的要素,然后按照这个要素在SketchUp里面手动对齐不就行了么。思路的大方向是对的,但是手动对齐比较费事清理重复的公共要素也略显繁琐。根据要素中心点和原点的关系,这里有一个更好的办法:新建线要素shp文件并绘制一个能包围当前所有要素的矩形充当定位要素,由于定位要素的范围是最大的,每次导出时只要带着定位要素图4),就可以确保各模型的原点一致,原位粘贴就可以顺利工作啦,最后只要松地删除最外面的定位要素即可(图5(反正定位要素也没有用,无论重复了多少都可以很干脆地删除)


图4 带着定位要素分批导出


图5 用原位粘贴整合数据


【免插件导出SU模型方法】

研究完插件的效率问题和分批导出的整合问题,还有什么问题呢,那就是插件有些情况下安装不上。毕竟是个很老的插件(输出的SketchUp文件版本还是7.0.1呢),兼容性也不是咱们这些外行能搞定的,装不上插件是不是就不能导出SketchUp模型了呢,山人自有妙计,我们可以通过Collada文件(SketchUp和Lumion交互也可以用这个格式,一般以文件夹形式出现,包括模型和贴图等数据,存储模型的文件后缀名为.dae)作为中间媒介来完成这项任务,并且这次我们要启用一位新的伙伴ArcScene。流程大致如下:拉伸面要素图层转为多面体导出为Collada导入SketchUp,中间还有些需要注意的地方,下文逐一展开。

打开ArcScene,将待转换的面要素添加进来,在图层属性里找到拉伸选项卡,勾选拉伸图层中的要素,在表达式构建器中设置好相应的字段图6),这一步是为了让面要素成为3D图层。


图6 拉伸面要素图层


然后打开图层的属性表新建一个字段,类型就用默认的短整型即可,随便起个名字(图7(这里为了好理解就叫做Group吧),这个字段会用于后续的分组,本例中不需要再细分,所以也不用额外编辑该字段的数值。如果不把面要素分组的话,导出Collada时每个体块是一个独立的文件,然而SketchUp并不能批量导入.dae,所以…不需要更多的解释了吧。


图7 建立用于分组的字段


打开【3D Analyst 工具】-【转换】-【3D 图层转要素类】工具,将设置好拉伸参数面要素图层作为输入要素,记得设置分组字段图8)。经过这一步的转换就得到了多面体文件。


图8 3D图层转要素类工具的参数设置


打开【转换工具】-【转为 Collada】-【多面体转 Collada】工具,将多面体文件作为输入要素,该工具会自动按照输出文件夹路径新建文件夹(图9),该路径不能指向任何已存在的文件夹,否则会报错。未提及的参数原则上不需要调整,如果感兴趣可以查阅ArcGIS帮助文件来了解各参数的用途(或者望文生义地猜一下也可以~)


图9 多面体转Collada工具的参数设置


打开SketchUp,点击菜单栏上的文件-导入,在右下角将导入格式改为Collada,找到前一步导出的Collada文件夹中的.dae文件,选中并导入(图10),耐心等待一会儿,导入后需要手动给模型定个位(图11)。


图10 SketchUp导入.dae文件


图11 手动定位模型


【免插件导出效率测试】

虽然免插件的导出方法步骤更加繁琐,但是效率其实远胜于使用插件,为了清晰地展示这一点,这里也对免插件的导出效率做了测试,基本条件和前文一致,导入模型采用SketchUp Pro 2018(64位)。本次测试特意开了个Firefox浏览器窗口播放B站的视频,营造一个更接近真实使用环境的运算负载(通过创造不利条件来展示巨大的效率差距,才不是等得无聊打发时间),测试结果如表2图12所示,其中耗时1面要素转多面体的耗时,耗时2多面体转Collada的耗时,耗时3SketchUp导入.dae文件的耗时。


表2 免插件导出SU模型耗时与效率统计表
要素数量
(个)
耗时1
(秒)
耗时2
(秒)
耗时3
(时:分:秒)
效率
(个/秒)
1000
4
1
00:00:21
38.5
2000
6
4
00:01:16
23.3
3000
9
7
00:02:53
15.9
4000
13
10
00:05:00
12.4
5000
18
15
00:07:45
10.0
6000
23
19
00:11:05
8.5
7000
31
25
00:15:11
7.2
8000
40
31
00:20:00
6.3
9000
48
39
00:26:35
5.4
10000
60
46
00:33:02
4.8


图12 免插件导出SU模型耗时与要素数量关系


随着导出要素数量的增加效率同样出现较大的下降耗时增长呈多项式函数免插件方法导出1000个要素的效率和用插件导出2000个要素的效率持平,但随着要素数量的增加,免插件方法效率下降的幅用插件方法更小,直接比较二者的耗时与要素数量关系(图13)可以更为清晰地看到,如果导出要素数量小于等于4000,那么二者效率不分伯仲,当要素数量增加至6000时,二者的耗时则相差一倍。用免插件方法导出数据还想追番的同学,可以选择单次导出9000个,比有插件的方法多导出50%呢(扣工资警告)


图13 不同导出方法耗时与要素数量关系


所以初步结论就出来了,如果不在意导出次数,推荐使用有插件的方法(再联动一次【2019-011】),并且将单次导出要素的数量控制在4000左右;如果希望以较少的导出次数完成任务(或者干脆装不上插件),那么就请使用免插件的方法


【两种导出方法的其他差异】

还有几个细节上的区别值得说一下。

第一,插件导出的文件自带坐标,方便设置日照参数,而且按照原来的方法还可以和地形一并导出,相对来说更方便;免插件导出不带坐标了,这样也很难和地形文件对齐,所以更适合不需要坐标不需要地形的情况。

第二,插件导出可以利用定位要素比较方便地实现分批导出数据整合;而免插件分批导出的话,除了需要额外绘制一个定位要素还需要手动对齐,目前还没想到什么特别好的办法解决,所以免插件更适合单次即可导出全部要素(建议10000以下,超过10000未经测试,确有此需求的同学自行尝试一下吧)的任务。

第三,插件导出的文件中每个体块是一个单独群组,非常方便编辑;而免插件导出的.dae导入SketchUp之后所有体块都在一个群组里,里面的体块也没有单独的群组,如果体块数量众多,那么编辑起来可能会非常困难

第四,正因为群组组成方式不同,所以存储出来的文件大小也不同,这里给出两组测试输出的SketchUp模型文件体积供参考(表3)。


表3 不同导出方法模型文件体积
要素数量
(个)
插件导出文件体积
(MB)
免插件导出文件体积
(MB)
1000
2.91
3.58
2000
5.88
7.04
3000

9.04

10.7
4000
11.914.1
5000
14.717.3
6000
17.420.4
7000
20.423.9
8000
23.527.5
9000
27.131.9
10000
30.436.0


【知识链接】

东瑾同学的留言里还提供了两个与此相关推文,一并在此列出供同学们参考。《ArcScene与FME快速建模》(https://blog.csdn.net/panbg/article/details/83418600)、《在ArcScene中导入显示自己在SketchUp创建并经过修饰的模型》(https://www.cnblogs.com/gisk/p/3763374.html)。


【后记】

三连更更得自己头都大了,前两篇还能做到定时群发,结果第三篇又跳票到晚上,硬要说是中午的话,也是英国的中午了吧。其实免插件导出SU模型的方法在撰写【2019-011】之前我也有尝试过,不过当时没有弄明白分组参数的作用(不分组就得一个一个导入SketchUp,还没有坐标,这是自寻死路,于是搁置了好久。这次有幸在东瑾同学留言的启发下总算把技术细节梳理清楚了,特撰此文,以飨众人~

【全文3794字,撰文耗时14h25m】



继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存