CityMaker平台下用C#实现不同场景切换的实现方法

5 篇文章 1 订阅
3 篇文章 0 订阅

最近在利用CityMaker做三维管廊的开发,需要根据场景切换到不同的位置和视角。客户提供的管廊数据分了5个分区,一个监控中心,加上管廊初始化加载时的视角共需要7组数据。在伟景行提供的SDK中如果要把地图切换到 某一点,需要的数据除了包括X、Y、Z外,还需要Angle数据。X、Y、Z可以理解为经纬度加高程。Angle为相机欧拉角,包括Heading、Tilt、Roll参数。其中Heading表示相机的(左右)摇摆角,单位为度,正北方向为0,值域[0,360),顺时针递增;Tilt表示相机的(上下)俯仰角,单位为度,平视为0,值域[-90,90]度,低头为负,抬头为正;Roll表示相机的倾斜角,单位为度,水平为0。如下图所示:


怎么获得上述参数?这里使用CityMaker Builder提供的特定场景功能获取。在主界面的右侧tab页中找到特别场景tab页,可以点击新建特定场景组,如下图: 


添加完特定场景后,把地图拉到你想要切换的位置,然后在特定场景组下边的面板中点击右键插入特定场景,如下图: 


输入场景名称、说明和播放间隔后点击确定,特定场景就生成完毕,生成后入下图: 


生成特定场景后,程序怎么用?或者说程序怎么得到该特定场景下的X、Y、Z及Angle?Builder提供了一个导出功能,在需要导出的特定场景组上点击右键选择导出,把建立的特定场景导出如下的xml:
<?xml version="1.0" encoding="UTF-8"?>
-<CameraGroup WKT="UNKNOWNCS["unnamed"]">
<Camera duration="5" comment="" roll="-4.29374881997575E-14" tilt="-15.333841267255" heading="-50.5252574662688" z="770.962000000316" y="24483.2877865981" x="10533.2696556843" Picture="b22d08c9-59f2-4b21-a254-d7133eb1b7bb.jpg" Name="初始界面"/>
<Camera duration="5" comment="" roll="-9.54166404439055E-15" tilt="-12.2364039278614" heading="-71.2583141496969" z="524.34103072128" y="24767.3735196134" x="10161.8880158652" Picture="6c7e6098-6064-401c-93c0-dce573f86b5d.jpg" Name="分区1"/>
</CameraGroup>
导出的xml中具体元素和属性这里就不在赘述的了,就是前文所述的几个参数,加上场景分类名称。得到这个xml文件后,我们可以利用编码把xml导入到程序中,具体C#中操作Xml可以参照本博文章: C#下使用XmlDocument详解  。得到参数后,我们场景定位时的代码如下:
                                IEulerAngle angle = new EulerAngle();
                                angle.Set(locationCamera.Heading, locationCamera.Tilt, locationCamera.Roll);
                                if (geoFactory == null)
                                    geoFactory = new GeometryFactory();
                                IPoint pos = geoFactory.CreatePoint(gviVertexAttribute.gviVertexAttributeZ);
                                pos.X = locationCamera.X;// 10533.269655684308;
                                pos.Y = locationCamera.Y;// 24483.287786598114;
                                pos.Z = locationCamera.Z;// 770.96200000031581;
                                pos.SpatialCRS = datasetCRS;
                                this.axRenderControl.Camera.LookAt2(pos, 50, angle);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凡梦_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值