【二次开发】CityMaker数据加载——地形

版权声明: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()获取错误码,与地形相关的错误码如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_38476447/article/details/86686779