最近在利用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);