公司三维建模组遇到这样的一个问题,怎样将井盖、雨水盖子恰好放在做好的地面模型上。传统的方法是在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中将井盖、雨水箅子等部件放到地面模型上的更多相关文章

  1. C++框架_之Qt的窗口部件系统的详解-上

    C++框架_之Qt的窗口部件系统的详解-上 第一部分概述 第一次建立helloworld程序时,曾看到Qt Creator提供的默认基类只有QMainWindow.QWidget和QDialog三种. ...

  2. 桌面小部件----LED电子时钟实现

    桌面控件是通过 Broadcast 的形式来进行控制的,因此每个桌面控件都对应于一个BroadcastReceiver.为了简化桌面控件的开发,Android 系统提供了一个 AppWidgetPro ...

  3. Tkinter类之窗口部件类

    Tkinter类之窗口部件类 Tkinter支持15个核心的窗口部件,这个15个核心窗口部件类列表如下:窗口部件及说明:Button:一个简单的按钮,用来执行一个命令或别的操作.Canvas:组织图形 ...

  4. SharePoint Framework 构建你的第一个web部件(一)

    博客地址:http://blog.csdn.net/FoxDave SharePoint客户端web部件是出现在SharePoint页面的控件,但却是在浏览器本地运行的.他们是SharePoint ...

  5. 基于SCADA数据驱动的风电机组部件故障预警

    吴亚联 1 , 梁坤鑫 1 , 苏永新 1* , 詹 俊 2(1.湘潭大学 信息工程学院, 湖南 湘潭 411105: 2.湖南优利泰克自动化系统有限公司, 湖南 长沙 410205) 摘 要: 为提 ...

  6. Web UI开发推荐!Kendo UI for jQuery自定义小部件——处理事件

    Kendo UI for jQuery最新试用版下载 Kendo UI目前最新提供Kendo UI for jQuery.Kendo UI for Angular.Kendo UI Support f ...

  7. ArccGIS 10发布WFS服务并加载到Skyline中

    下面用ArcGIS Server 10.0将建筑物图层发布为WFS服务. (1)创建mxd文件.ArcMap打开建筑物图层,存为Buildings.mxd文件.注意:必须统一空间参考系,且要与图层的坐 ...

  8. PyQt(Python+Qt)学习随笔:基于项的项部件(Item Widgets(Item-Based))概述

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 Model/View架构中的视图部件是基于模型的项视图(Item Views(Model-Based ...

  9. PyQt(Python+Qt)学习随笔:Qt Designer中部件的toolTip、toolTipDuration、statusTip、whatsThis属性

    toolTip属性 toolTip属性设置部件的toolTip提示信息,toolTip提示信息在鼠标放到控件上会浮动出一个小框显示提示信息.默认情况下,仅显示活动窗口子部件的toolTip,可以通过在 ...

随机推荐

  1. 二分查找总结及部分Lintcode题目分析 3

    Search in rotated sorted array,题目中也给出了相应的例子,就是在sorted array某个节点发生了翻转(ie.0 1 2 4 5 6 7 might become 4 ...

  2. Failed to read artifact descriptor for org.springframework.cloud:spring-cloud-starter-config:jar:unk

    <dependencyManagement> <dependencies> <dependency> <groupId>org.springframew ...

  3. 深入分析Service启动、绑定过程

    Service是Android中一个重要的组件,它没有用户界面,可以运行在后太做一些耗时操作.Service可以被其他组件启动,甚至当用户切换到其他应用时,它仍然可以在后台保存运行.Service 是 ...

  4. vue通过修改element-ui相关类的样式修改element-ui组件的样式

    可以在App.vue中的style中修改element-ui的样式. .el-menu{ width:160px !important; } 注意:一定要在属性值后面加上 !important 使自己 ...

  5. 本地项目通过 git 同步到 github

    1. github创建仓库并克隆仓库地址 2. 在本地通过git命令:git clone <仓库地址> 生成github仓库文件夹 3. 将本地项目复制到该文件夹 4. 通过git命令:g ...

  6. BezierCode 工具使用

    概要 今天无意间看到一个视频,发现了一款绘画Bezier 图形绘制并自动生成OC代码的神器, 因此马上先记录下. 之前一直很纠结如果程序员自己去绘制图片,久那么使用bezier 自己去画吗? 答案是: ...

  7. LuoguP3338 [ZJOI2014]力

    题目描述 给出n个数qi,给出Fj的定义如下: \[F_j = \sum_{i<j}\frac{q_i q_j}{(i-j)^2 }-\sum_{i>j}\frac{q_i q_j}{(i ...

  8. python全栈开发:字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存. 1.百分号方式 %[(name ...

  9. 【daydayup】weTalk

    先看一下项目效果 这个是我运行的作者的项目的wetalk-server项目,他还有wetalk-client 项目 先放下作者的github项目地址:https://github.com/mangyu ...

  10. 网站PC端和移动端,用户通过设备识别

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <!--<me ...