版权声明:CityMaker技术服务中心——小白 https://blog.csdn.net/weixin_38476447/article/details/86686779
**
加载地形数据
**
一: 技术原理
地形是指地表各种各样的形态,是现实世界最真实的写照。在二维地图中,地形只能用等值线、格网DEM等抽象的表示,人们理解起来有一定的难度,而在三维场景中,地形能够加上高程以立体的方式展现。
CityMaker的地形文件后缀名为.ted,是由CityMaker TerrainPush制作的,我们可以将img、tif等DEM/DOM数据导入TerrainPush中制作成ted。
本节主要介绍在二次开发中如何用sdk加载ted类型的地形数据,CityMaker支持对地形数据的显隐设置、透明度设置、获取指定高程等。
主要接口:
ITerrain::RegisterTerrain (BSTR LayerInfo, BSTR Password, [out, retval] VARIANT_BOOL * pVal)
说明:
注册地形数据源。目前要求待注册的地形文件的坐标系与工程坐标系(即RenderControl坐标系)完全一致,否则注册失败。
输入参数:
LayerInfo:地形文件路径
Password:地形文件密码
返回值:
pVal:地形注册成功则返回true,失败则返回false
详细参数请参考SDKHelp文件中的ITerrain接口。
二:实现步骤
1. .Net步骤
(1)注册地形
private void registerTerrain()
{
string tmpTedPath = "D:\\citymakerbookdata\\terrain.ted"; //地形文件地址
// string tmpTedPath = "testTerrain:澳门@127.0.0.1:8040"; //以服务的形式加载:“LogicDataSourceName:TerrainDataSetName@Host:Port”
this.axRenderControl1.Terrain.RegisterTerrain(tmpTedPath, ""); //注册地形,参数:文件地址,密码
this.axRenderControl1.Terrain.FlyTo(gviTerrainActionCode.gviFlyToTerrain); //将相机飞至地形上方
}
(2)开关高程、地形显隐
private void switchTerrainDem(bool showDem, bool showTerrain)
{
this.axRenderControl1.Terrain.DemAvailable = showDem; //开启或关闭高程
if(showTerrain)
{
this.axRenderControl1.Terrain.VisibleMask = gviViewportMask.gviViewAllNormalView; //正常的四个视口都显示(默认值)。注意:不包含PIP(画中画)视口!
}
else if(!showTerrain)
{
this.axRenderControl1.Terrain.VisibleMask = gviViewportMask.gviViewNone; //所有视口都不显示
}
}
(3)获取高程值
public void getElevation(IPoint point, string modeName)
{
gviGetElevationType mode = gviGetElevationType.gviGetElevationFromMemory;
switch (modeName)
{
//设置获取高程的模式
case "GetElevationFromMemory":
mode = gviGetElevationType.gviGetElevationFromMemory; //从内存中获取高程值,是当时视角看到的地形值,在高处看到的是地形粗糙网格的值, 高程值通常比精细网格要高;
break;
case "GetElevationFromDatabase":
mode = gviGetElevationType.gviGetElevationFromDatabase; //从数据库中获取高程,数据库里存的是地形精细网格的值
break;
}
double elevatation = this.axRenderControl1.Terrain.GetElevation(point.X, point.Y, mode);
MessageBox.Show("高程为:"+elevatation);
}
2. JS步骤
(1)注册地形
function registerTerrain()
{
string tmpTedPath = "D:\\citymakerbookdata\\terrain.ted"; //地形文件地址
__g.terrain.registerTerrain(tmpTedPath, ""); //注册地形,参数:文件地址,密码
__g.terrain.flyTo(0); //将相机飞至地形上方
}
(2)开关高程、地形显隐
function switchTerrainDem(showDem, showTerrain)
{
__g.terrain.demAvailable = showDem; //开启或关闭高程
//地形显隐
if(showTerrain)
{
__g.terrain.visibleMask = 15; // 15:gviViewportMask.gviViewAllNormalView; 正常的四个视口都显示(默认值)。注意:不包含PIP(画中画)视口!
}
else if(!showTerrain)
{
__g.terrain.terrain.visibleMask = 0; // 0:gviViewportMask.gviViewNone; 所有视口都不显示
}
}
(3)获取高程值
function getElevation(point, modeName)
{
gviGetElevationType mode = 1;
switch (modeName)
{
//设置获取高程的模式
case "GetElevationFromMemory":
mode = 1 //从内存中获取高程值,是当时视角看到的地形值,在高处看到的是地形粗糙网格的值, 高程值通常比精细网格要高;
break;
case "GetElevationFromDatabase":
mode = 0; //从数据库中获取高程,数据库里存的是地形精细网格的值
break;
}
var elevatation = __g.terrain.getElevation(point.x, point.y, mode);
alert("高程为:"+elevatation);
}
三:注意事项
若地形数据注册失败,请调用IRenderControl.GetLastErro()获取错误码,与地形相关的错误码如下: