在skyline中将井盖、雨水箅子等部件放到地面模型上
公司三维建模组遇到这样的一个问题,怎样将井盖、雨水盖子恰好放在做好的地面模型上。传统的方法是在skyline中逐个调整井盖的对地高度,就是调整为恰好能放在地面上。或者选择很粗糙的一个方法,在“高度”属性中设一个固定值,这样可以实现大部分得井盖在地面模型上,但是这不符合精细的要求。对于一个100平方公里三维场景,成千上万个井盖、雨水箅子等部件,按传统方法做,工作量是大之又大,几乎不去想了,而且很容易导致某个井盖没有给调整到,跑到地面模型下面去了或者飘起来,要是客户刚好就发现这个井盖找不到了(因为不在地面上),那就糟糕,超级工作量会被客户在几秒钟时间内否定掉。通过查阅skyline的相关接口,找到了Terrain对象的GetGroundHeightInfo方法,这个方法恰好解决了三维建模组的需求。分享如下:
我们先看skyline中是如何介绍GetGroundHeightInfo这个方法的:
“The GetGroundHeight method Returns the height of a given coordinate on the terrain using the given accuracy level. If there is an object, derived from ITerrainObject61 with the GroundObject property set to TRUE, at the selected coordinate and the parameter is set to TRUE in this method,
the method returns the ObjectID of the object, and its height at the coordinate.”
大体意思是这样的:”GetGroundHeight方法将返回给定的精度级别下,地形上某个指定地理位置的高度。假设这里有个ITerrainObject61派生的对象,将该对象设置为地面对象(在工程树中图层属性中设置),在GetGroundHeight方法中指定地理位置(就是x,y坐标),并将IncludeGroundObject参数设为true,那么该方法将返回这个对象的ObjectID和该指定地理位置的高度。“ 这个高度就是最后我们想要的高度。其中”给定的精度级别“实际上就是该方法中的level参数,有2、1、0三个值,精度级别越高,计算的越慢,但越精确。
那么如何应用上面的方法来解决我们的实际需求呢?想必熟悉skyline二次开发的朋友已经知道怎么做了。下面以雨水箅子为例讲述该方法的应用过程。
我们以层模式将所有地面模型,包括道路面模型加载到三维场景中,地面对象属性值设为”是“,英文版的话设为”yes“,其余属性默认(默认情况下,图层属性中点的位置属性高程方式是”相对地表“)。然后以层模式加载雨水箅子图层,导入过程中,要将所有的属性字段都导入。这里注意我加载的雨水箅子图层已经在arcmap中做好如下处理:1、雨水箅子图层坐标系是WGS84,与skyline三维场景的坐标系一致;2、坐标转换后,在属性表中计算了每个要素点的X、Y值,即每个雨水箅子的经纬度坐标,并添加Z字段,用来存储后面计算出的高度值。

上面的工作做好后,就可以开始编写代码计算了。在VS2012中(事实上随便一个代码编写工具都行)添加一个HTML页面,加载上面创建的fly工程。我们只需要获取到工程树中雨水箅子图层,遍历每个要素点(即每个雨水箅子所在的位置),得到X、Y字段属性值,从而对每个点应用var pWorldPointInfo = SGWorld.Terrain.GetGroundHeightInfo(X, Y, 1,true);再根据返回的pWorldPointInfo对象的position属性就可以得到我们想要的高度值,将高度值赋给每个要素点的Z字段值,这样就完成程序的功能。最后,我们在fly工程中,将雨水箅子图层点位置属性高程方式设为”绝对值“,将高度值引用”Z“字段值,我们会发现所有的雨水箅子都跑到地面、道路上了。
主要代码如下:
function Calculate() {
var item = SGWorld.ProjectTree.FindItem("JN_0103_ysjg");
var layer = SGWorld.ProjectTree.GetLayer(item);
var fGroup = layer.FeatureGroups(0);
var j = 0;
for (i = 0; i < fGroup.Count; i++) {
var feature = fGroup(i);
var X = feature.FeatureAttributes.GetFeatureAttribute("X").Value;
var Y = feature.FeatureAttributes.GetFeatureAttribute("Y").Value;
var pWorldPointInfo = SGWorld.Terrain.GetGroundHeightInfo(X, Y, 1,true);
var pos = pWorldPointInfo.Position;
feature.FeatureAttributes.GetFeatureAttribute("Z").Value = pos.Altitude;
j++;
}
alert("计算成功,共计算:" + j + "个点");
}
讲到这里,或许大家都想这很简单嘛!确实很简单,好像skyline的GetGroundHeight这个方法就专门来解决这个需求的哈!但是,我们实际使用中确还是出现各种问题,公司三维组的同事还一直怀疑是我的程序有问题(他们不做编程,可以理解滴),就在年前的最后一天班,同事总发现计算出来的结果不对。现在问题找到了一并分享给出来。
大家在计算前一定保证如下:(1)所有的地面模型,包括草地、路面等都已经设置为地面对象;(2)要计算的图层,每个要素点的位置属性的高程方式为相对地表,而不是绝对值;(3)保证要计算的图层的X,Y 字段确实是每个要素点的实际位置。比如,原始数据是西安80坐标系,已经计算过X、Y字段,在进行坐标转后务必重新计算X、Y字段值。(4)以层模式加载要计算的图层,特别是计算的图层包括的点非常多的时候,加载完浏览下场景,保证所有的点都已经加载完成,然后再开始计算。
最后分享我们计算的结果:

欢迎大家交流!敬请关注:skyline中文社区www.skylinecn.com 社区QQ:205915164
在skyline中将井盖、雨水箅子等部件放到地面模型上的更多相关文章
- C++框架_之Qt的窗口部件系统的详解-上
C++框架_之Qt的窗口部件系统的详解-上 第一部分概述 第一次建立helloworld程序时,曾看到Qt Creator提供的默认基类只有QMainWindow.QWidget和QDialog三种. ...
- 桌面小部件----LED电子时钟实现
桌面控件是通过 Broadcast 的形式来进行控制的,因此每个桌面控件都对应于一个BroadcastReceiver.为了简化桌面控件的开发,Android 系统提供了一个 AppWidgetPro ...
- Tkinter类之窗口部件类
Tkinter类之窗口部件类 Tkinter支持15个核心的窗口部件,这个15个核心窗口部件类列表如下:窗口部件及说明:Button:一个简单的按钮,用来执行一个命令或别的操作.Canvas:组织图形 ...
- SharePoint Framework 构建你的第一个web部件(一)
博客地址:http://blog.csdn.net/FoxDave SharePoint客户端web部件是出现在SharePoint页面的控件,但却是在浏览器本地运行的.他们是SharePoint ...
- 基于SCADA数据驱动的风电机组部件故障预警
吴亚联 1 , 梁坤鑫 1 , 苏永新 1* , 詹 俊 2(1.湘潭大学 信息工程学院, 湖南 湘潭 411105: 2.湖南优利泰克自动化系统有限公司, 湖南 长沙 410205) 摘 要: 为提 ...
- Web UI开发推荐!Kendo UI for jQuery自定义小部件——处理事件
Kendo UI for jQuery最新试用版下载 Kendo UI目前最新提供Kendo UI for jQuery.Kendo UI for Angular.Kendo UI Support f ...
- ArccGIS 10发布WFS服务并加载到Skyline中
下面用ArcGIS Server 10.0将建筑物图层发布为WFS服务. (1)创建mxd文件.ArcMap打开建筑物图层,存为Buildings.mxd文件.注意:必须统一空间参考系,且要与图层的坐 ...
- PyQt(Python+Qt)学习随笔:基于项的项部件(Item Widgets(Item-Based))概述
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 Model/View架构中的视图部件是基于模型的项视图(Item Views(Model-Based ...
- PyQt(Python+Qt)学习随笔:Qt Designer中部件的toolTip、toolTipDuration、statusTip、whatsThis属性
toolTip属性 toolTip属性设置部件的toolTip提示信息,toolTip提示信息在鼠标放到控件上会浮动出一个小框显示提示信息.默认情况下,仅显示活动窗口子部件的toolTip,可以通过在 ...
随机推荐
- MySQL高可用(Galera Cluster)
Galera Cluster简介 Galera Cluster是集成了Galera插件的MySQL集群,是一种新型的,数据不共享的,高度冗余的高可用方案,目前Galera Cluster有两个版本,分 ...
- from Crypto.Cipher import AES加密解密
一.代码 from Crypto.Cipher import AES import base64 """ AES加密算法 """ #加密 d ...
- AutoLayout(自动布局)入门
这是WWDC2012笔记系列中的一篇,完整的笔记列表可以参看这里.如果您是首次来到本站,也许您会有兴趣通过RSS的方式订阅本站. AutoLayout在去年的WWDC上被引入Cocoa,而在今年的WW ...
- System.Clollections.IEnumerable.cs
ylbtech-System.Clollections.IEnumerable.cs 1.程序集 mscorlib, Version=4.0.0.0, Culture=neutral, PublicK ...
- iOS扩展Extension之Today
1.简介 扩展(Extension)是iOS 8中引入的一个新特性.扩展让app之间的数据交互成为可能.在iOS 8系统之前,每一个app在物理上都是彼此独立的,app之间不能互访彼此的私有数据.而在 ...
- Pycharm2019.1.3安装程序以及教程
链接:https://pan.baidu.com/s/1TF--EyCUQgmPeXFaCMJm8w 提取码:5vme
- POJ - 2406 ~SPOJ - REPEATS~POJ - 3693 后缀数组求解重复字串问题
POJ - 2406 题意: 给出一个字符串,要把它写成(x)n的形式,问n的最大值. 这题是求整个串的重复次数,不是重复最多次数的字串 这题很容易想到用KMP求最小循环节就没了,但是后缀数组也能写 ...
- c#使用打印机
在windows应用程序中文档的打印是一项非常重要的功能,在以前一直是一个非常复杂的工作,Microsoft .net Framework的打印功能都以组件的方式提供,为程序员提供了很大的方便,但是这 ...
- ajax无刷新上传
我们在使用上传控件的时候,会遇到刷新的问题,最近使用ajax做的上传,觉得效果还是很不错. 首先,我们需要在页面上放上上传控件:需要注意的是,我们必须放在form里面,实现表单上传. <for ...
- angular 页签
HTML: <link rel="stylesheet" href="views/show/tab.css"/> <div> <u ...