异曲同工:分批导出SU模型技巧与免插件导出方法【2019-19】
Highlights
1、用插件单次导出8000要素耗时超1小时;
2、用插件按少量多次导出可大幅提高效率;
3、用插件分批导出需要搭配一个定位要素;
4、面要素转多面体时要注意设置分组参数;
5、SU导入Collada耗时较长且会丢失坐标;
嗨~多磨,三连更第三弹
【插件导出效率测试】
书接前文,在【2019-011】中向大家介绍了SketchUp6ESRI插件及其犀利的导出功能,然而,面对大量待导出数据时,插件本身的性能却成了整套操作的瓶颈。为了充分说明其效率问题,以1000个为间隔,对单次导出1000至10000个要素的时间成本进行了测试,从点击导出数据的确定按钮开始计时,至生成SketchUp模型文件停止计时,精确到秒。测试平台的关键配置包括:CPU为i7-8550U,内存16GB(8GB×2),固态硬盘为镁光M.2接口256GB(走SATA-III通道),软件为ArcGIS 10.2.2。测试时已尽量关闭其他可能占用系统资源的程序,测试结果如表1、图1所示。
要素数量 (个) | 耗时 (时:分:秒) | 效率 (个/秒) |
---|---|---|
1000 | 00:00:06 | 166.7 |
2000 | 00:00:54 | 37.0 |
3000 | 00:03:05 | 16.2 |
4000 | 00:07:28 | 8.9 |
5000 | 00:14:46 | 5.6 |
6000 | 00:26:11 | 3.8 |
7000 | 00:41:11 | 2.8 |
8000 | 01:02:23 | 2.1 |
9000 | 01:35:11 | 1.6 |
10000 | 02:08:43 | 1.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的耗时,耗时3为SketchUp导入.dae文件的耗时。
要素数量 (个) | 耗时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)。
要素数量 (个) | 插件导出文件体积 (MB) | 免插件导出文件体积 (MB) |
---|---|---|
1000 | 2.91 | 3.58 |
2000 | 5.88 | 7.04 |
3000 | 9.04 | 10.7 |
4000 | 11.9 | 14.1 |
5000 | 14.7 | 17.3 |
6000 | 17.4 | 20.4 |
7000 | 20.4 | 23.9 |
8000 | 23.5 | 27.5 |
9000 | 27.1 | 31.9 |
10000 | 30.4 | 36.0 |
【知识链接】
东瑾同学的留言里还提供了两个与此相关推文,一并在此列出供同学们参考。《ArcScene与FME快速建模》(https://blog.csdn.net/panbg/article/details/83418600)、《在ArcScene中导入显示自己在SketchUp创建并经过修饰的模型》(https://www.cnblogs.com/gisk/p/3763374.html)。
【后记】
三连更更得自己头都大了,前两篇还能做到定时群发,结果第三篇又跳票到晚上,硬要说是中午的话,也是英国的中午了吧
【全文3794字,撰文耗时14h25m】