2.5.6 动态路径漫游


动态路径漫游

动态路径漫游是指根据指定路径进行场景漫游的功能。路径漫游是一个图层对象,因此它具备图层对象的添加、更新和删除功能。

  1. 添加路径漫游时,主要是对路径图层的初始参数进行设定,如跟随模型、播放状态、播放速度、路径线颜色、关键点等。
  2. 更新路径漫游时,主要是对路径进行再编辑和控制播放状态、观察视角等。
  3. 删除路径漫游时,是取消路径漫游状态和从场景中移除路径漫游图层。

一般来说,路径漫游的更新包含两个过程:路径编辑过程和路径播放过程。

路径编辑过程

路径编辑过程主要是创建路径的关键点列表,以及对关键点进行添加、更新、删除操作。

路径漫游播放的前提条件是需要有播放路径和播放参数,播放路径是由N个关键点组成的。路径的编辑过程就是在生成路径关键点以及播放参数。

一般播放路径有3种方式产生:

  1. 直接传入。 可以在创建路径图层时,通过KeyPoints参数直接传入播放路径(关键点列表)。这是常用的一种方式,也是导入路径漫游的使用方式。
  2. 手动传入。 可以先创建空的路径图层,然后通过更新图层的方式传入一个/一批关键点。传入的同时可设置单个关键点的播放参数。该方法需要更新OperationName,KeyPointIndex, KeyPoints 等参数。
  3. 场景编辑。 可以开启场景编辑功能,开启后已有的关键点会有编号,在场景中点击可以添加新的关键点等。该方法需要更新EditType, EditObject 参数。

路径播放过程

路径播放过程是在路径关键点列表确定之后,进行路径的播放。播放时可切换播放状态、改变跟随模式、改变观察位置等。一般主要有以下几种方式切换。

  1. 切换播放状态。 可通过更新PlayerState 参数, 控制路径漫游在播放、暂停和停止3个状态任意切换。
  2. 切换跟随移动状态。 可通过更新NodeActive 参数, 控制场景是跟随移动还是不跟随。通过该方式可以达到第一人称视角观察(跟随)和第三人称视角观察(不跟随)。
  3. 切换播放类型。 可通过更新PlayAsKeyPoint 参数, 控制路径漫游的播放类型。 当PlayAsKeyPoint=true 时,播放类型切换成以关键点参数进行播放,后续无法再进行视角切换和播放速度控制;当PlayAsKeyPoint=false 时,播放类型切换成以路径参数进行播放,在播放时可以随意更改观察视角和播放速度。
  4. 切换观察视角。 在播放的过程中,可以切换观察视角,达到左视、右视、前视、后视等多种效果。切换视角的前提是:PlayAsKeyPoint=false, NodeActive=true。
  5. 控制播放速度。 在以路径参数进行播放的过程中,可以通过更新Velocity 参数控制播放的速度。

下图是开启路径漫游的效果:

  

参数说明

路径漫游可配置的参数如下表所示:

配置项 配置说明 值类型 备注
LayerOptionsName 图层配置对象名称 string 动态路径图层需配置为:DynamicPathLayerOptions
Url 跟随模型路径 string 跟随模型路径地址
NodeXScale 模型X轴缩放比例 float 跟随模型在X轴方向的缩放比例,默认1.0
NodeYScale 模型Y轴缩放比例 float 跟随模型在Y轴方向的缩放比例,默认1.0
NodeZScale 模型Z轴缩放比例 float 跟随模型在Z轴方向的缩放比例,默认1.0
ModelRoll 模型X轴旋转量 float 跟随模型在X轴方向的旋转量,默认0.0。单位弧度
ModelPitch 模型Y轴旋转量 float 跟随模型在Y轴方向的旋转量,默认0.0。单位弧度
ModelHeading 模型Z轴旋转量 float 跟随模型在Z轴方向的旋转量,默认0.0。单位弧度
ModelLiftUp 模型抬高值 float 跟随模型相对于关键点的抬高高度,默认0.0。单位m
PlayerMode 播放模式 string 路径漫游的播放模式。PLAYER_ONEWAY-播放一次; PLAYER_ONEWAY_LOOP-循环播放;
PLAYER_ROUND_LOOP-往返播放; PLAYER_ONEWAY_STAY-实时播放。默认: PLAYER_ONEWAY
PlayerState 播放状态 string 路径漫游的播放状态。PLAYER_PLAY-播放;
PLAYER_PAUSE-暂停; PLAYER_STOP停止。 默认:PLAYER_STOP
ViewObjectMode 设置视角对象 string 视角对象的格式为"水平方位角, 垂直俯仰角, 视点到关键点距离"。 默认:"0.0,-0.708,500"
Velocity 播放速度 float 路径漫游的播放速度,默认12.5。 单位m/s
Accelerator 加速度 float 路径漫游的播放时的加速度,当>0时会加速播放。默认0.0。 单位m/s
CornerSpeedScale 转角速度比例 float 在拐弯转角位置时速度比例, 实际速度= CornerSpeedScale * Velocity。 默认1.0
Radius 拐弯处平滑半径 float 路径拐弯位置平滑处理半径。 默认: 0
LineWidth 线宽度 float 线宽度取值范围在1-10之间。 默认:1.0
LineColor 线颜色 R,G,B,A 颜色取值范围在0-1.0之间,如 "0.9,0.8,0.8,1.0"
LineStipple 线样式 short 线显示样式,可控制实线/虚线显示。取值范围-32768-32767之间。-1-实线,其他-虚线。默认-1
InterpLineWidth 差值线宽度 float 线宽度取值范围在1-10之间。 默认:1.0
InterpLineColor 差值线颜色 R,G,B,A 颜色取值范围在0-1.0之间,如 "0.9,0.8,0.8,1.0"
InterpLineStipple 差值线样式 short 差值线显示样式,可控制实线/虚线显示。取值范围-32768-32767之间。-1-实线,其他-虚线。默认-1
KeyPointLiftUp 关键点抬高 float 所有关键点的抬高高度,默认0.0。单位m
PlayAsKeyPoint 播放类型 bool 播放类型。true-以关键点参数进行播放; false-以路径参数进行播放。 默认:false
IsOnGround 是否保持视点在地面以上 bool 在跟随移动时,是否保证相机视点一直在地面以上。 默认为false
IsSwerveControl 是否弯道减速 bool 设置在弯道位置是否减速再加速播放, 该值需与CornerSpeedScale配合使用。 默认为false
NodeActive 跟随状态 bool 场景相机的跟随状态。 true-跟随移动;false-不跟随。 默认为false
KeyPoints 关键点集 x,y,z列表 路径线上的关键点列表。 需传入经度,纬度,高程坐标集,中间用;分隔,并以;结尾
OperationName 更新操作类型 string 对关键点更新时的操作类型。 InsertKeyPoints-插入关键点;
UpdateKeyPoints-更新关键点; GetKeyPoint-获取关键点;
DeleteKeyPoint-删除关键点
KeyPointIndex 关键点索引 int 需要更新的关键点索引值。默认:0
EditType 编辑类型 string 开启场景编辑时的编辑类型。 ADD-添加操作; SELECT-拾取操作; MOVE-移动操作; NONE-关闭操作。 默认:NONE
EditObject 编辑对象 string 开启场景编辑时的编辑对象。 POINT-编辑关键点; PATH-整体编辑。 默认:PATH

获取结果说明

路径漫游可以通过图层对象的GetLayerResult() 方法获取结果。

注意1: 在播放过程中,主要通过图层的回调获取播放信息,因此需要添加FireOnLayerNotify 事件处理。 在回调事件触发时,该方法会有两个回调参数,参数1是layerId, 代表图层Id,参数2是type,代表事件类型。在路径漫游里面,当type=2时,代表路径漫游的编辑过程;当type=3时,代表路径漫游的播放过程。

注意2: 在实际使用中,判断是否经过路径上的关键点,一般是通过判断PassKeyPointIndex参数值来确定的。也可以通过判断RealTimePositionGeo坐标与目标位置的距离来触发某些特殊操作。如调用当前位置的监控视频、加载周边的兴趣点位等等。

路径漫游获取的结果值对象参数如下表所示:

配置项 配置说明 值类型 备注
DataSourceTypeName 数据源类型 string dynamicpath代表路径漫游
EditState 编辑状态 string 在编辑过程中的状态值。 Insert-插入; Update-更新; Get-获取; Load-导入; Delete-删除; Down-完成
PlayState 播放状态 string 路径漫游的播放状态。PLAYER_PLAY-播放;
PLAYER_PAUSE-暂停; PLAYER_STOP停止。 默认:PLAYER_STOP
KeyPointsGeo 关键点坐标 x,y,z列表 路径图里里全部关键点的经度,纬度,高程坐标列表,中间用;分隔,并以;结尾
KeyPoints 关键点信息 string 每个关键点的详细信息,包括关键点坐标、角度、速度等。 格式为:
0:x坐标,y坐标,z坐标:方位角,俯仰角,视距:速度:加速度:插值半径:抬高;
每个参数中间用:分隔,每组参数用;分隔
PassKeyPointIndex 行驶位置索引 int 表示已经通过的关键点索引。 在第0和第1个关键点之间, 返回值一直是0
IsPlayForward 是否正向行驶 bool 当播放类型为PLAYER_ROUND_LOOP 时,会反正当前是正向还是逆向行驶
RealTimePositionGeo 实时位置坐标 x,y,z 当前播放位置的经度,纬度,高程坐标。 该坐标的高程值会受KeyPointLiftUp参数影响, 高程值 = 路径线上点的高程 + KeyPointLiftUp

代码调用示例

Javascript调用

//Html部分代码
图层控制:  
<input id="Button1" type="button" value="创建路径图层" onclick="createDynamicPathLayer(true,keyPointList)" />    
<input id="Button1" type="button" value="创建路径图层(无关键点)" onclick="createDynamicPathLayer(true,false)" />
<input id="Button3" type="button" value="删除路径漫游" onclick="RemoveDynamicPathLayer()" />
<input id="Button3" type="button" value="路径序列化" onclick="PathSerializer()" />
<input id="Button3" type="button" value="路径反序列化" onclick="PathDeserializer()" />
</Br>
关键点编辑:
<input id="Button1" type="button" value="获取关键点索引" onclick="AddOption()" />
<select id ="SelOption"  style="width:60px;height= 44px " />&nbsp;&nbsp;&nbsp;
<input id="Button1" type="button" value="获取参数" onclick="FindDynamicPathPointByIndex()" />
&nbsp;&nbsp;坐标信息<input id="posInfo" style="width: 250px; type="text" value=""/>
视角参数<input id="viewInfo" style="width: 100px;" type="text" value=""/>
点位速度<input id="speed" style="width: 28px;" type="text" value=""/>
加速度<input id="accelerator" style="width: 28px;" type="text" value=""/>
拐弯半径<input id="radius" style="width: 28px;" type="text" value=""/>
抬高高度<input id="liftUp" style="width: 28px;" type="text" value=""/>
<input id="Button1" type="button" value="是否鼠标左键获取坐标" onclick="FindTransformation()" />
<input id="Button1" type="button" value="插入关键点" onclick="AddDynamicPathPointByIndex()" />
<input id="Button1" type="button" value="更新关键点" onclick="UpdateDynamicPathPointByIndex()" />
<input id="Button1" type="button" value="删除关键点" onclick="DeleteDynamicPathPointByIndex()" />
<input id="Button1" type="button" value="末尾追加关键点" onclick="LoadDynamicPathPoint()" />
</Br>
场景控制编辑:
<input id="Button1" type="button" value="创建关键点" onclick="AddDynamicPathPoint()" />
<input id="Button1" type="button" value="拾取关键点" onclick="SelectDynamicPathPoint()" />
<input id="Button1" type="button" value="更新拾取关键点" onclick="UpdateDynamicPathPoint()" />
<input id="Button1" type="button" value="移动关键点" onclick="MoveDynamicPathPoint()" />
<input id="Button1" type="button" value="删除关键点" onclick="DeleteDynamicPathPoint()" />
<input id="Button1" type="button" value="整体编辑" onclick="EditPath()" />
<input id="Button1" type="button" value="关键点编辑" onclick="EditPoint()" />
<input id="Button1" type="button" value="关闭编辑状态" onclick="CloseDynamicPathResponser()" />
</Br>
播放控制:&nbsp;&nbsp;
<input id="Button1" type="button" value="切换播放类型" onclick="UpdatePlayAsKeyPoint()" />
<input id="Button4" type="button" value="切换跟随移动" onclick="UpdateNodeActive()" />
<input id="Button6" type="button" value="切换路径显隐" onclick="SetVisibleRoamPath()" />
<input id="Button8" type="button" value="播放" onclick="Play()" />
<input id="Button9" type="button" value="暂停" onclick="Pause()" />
<input id="Button10" type="button" value="停止" onclick="Stop()" />
<input id="Button11" type="button" value="加速" onclick="Accelerate()" />
<input id="Button12" type="button" value="减速" onclick="SlowDown()" />
<input id="Button13" type="button" value="恢复速度" onclick="Restore()" />
<input id="Button14" type="button" value="左视" onclick="LeftView()" />
<input id="Button15" type="button" value="右视" onclick="RightView()" />
<input id="Button16" type="button" value="上视" onclick="UpView()" />
<input id="Button17" type="button" value="前视" onclick="FrontView()" />
<input id="Button18" type="button" value="后视" onclick="BackView()" />
//JS代码
var event = null;
var SelectIndex=null;
var dynamicPathLayer = null;
var preSetPoint = "";
var bIsFollow = true;
var bIsVisible = true;
var bIsFindTransformation=false;
var layermap = new Array();
var mKeyPointIndex=0;
var speed = 3;
var pickIndex = null;
var indexSize = 0;
var keyPointList = "120.219652381,30.2102796597,14.8471973008;120.219228677,30.2109204111,14.7999731209;120.219066611,30.2109525583,14.7999699935;120.218700324,30.2108002945,14.799943476;120.218728451,30.2106748092,14.7999742515;120.218952979,30.2100989073,14.7999547897;120.219026376,30.2098925768,14.799970909;120.218995824,30.2098632529,14.8299724646;120.218730274,30.2097854181,14.7999352217;";
var myPosInput = document.getElementById("posInfo");
var myViewInput = document.getElementById("viewInfo");
var mySpeednput = document.getElementById("speed");
var myAcceleratorInput = document.getElementById("accelerator");
var myRadiusInput = document.getElementById("radius");
var myLiftUpInput = document.getElementById("liftUp");

//回调实现函数
function callBackFun(layerId, type){
    //layerID回调值为"窗口id|图层id"
    var info = new Array();
    info = layerId.split("|");//idinfo通过|进行分隔
    var mapviewid = info[0].substr(10, info[0].length - 10);//MapviewId:
    var layerId = info[1].substr(8, info[1].length - 8);//LayerId:
    var layer = layermap[layerId];
    var opt=layer.GetLayerResult();
    SelectIndex = opt.GetConfigValueByKey("CurrentKeyPointIndex");//获取拾取的关键点索引
    //非播放中事件
    if((opt.GetConfigValueByKey("DataSourceTypeName") == "dynamicpath") && (type == 2))
    {

        var mEditState = opt.GetConfigValueByKey("EditState");//编辑状态,Insert-插入;Update:-更新;Get-获取;Load-导入;Delete-删除;Down-完成;
        var mKeyPointsGeo = opt.GetConfigValueByKey("KeyPointsGeo");//所有关键点坐标
        //所有关键点信息(包含参数),参数以":"划分,格式如下
        //类型:x坐标,y坐标,z坐标:方位角,俯仰角,视距:速度:加速度:插值半径:抬高;
        var mKeyPoints = opt.GetConfigValueByKey("KeyPoints");                               
        //alert("关键点坐标:"+mKeyPointsGeo + "; 关键点信息:"+mKeyPoints + ";编辑状态:" + mEditState);
    }
    //播放中事件
    if((opt.GetConfigValueByKey("DataSourceTypeName") == "dynamicpath") && (type == 3))
    {
        var mCurrentLinearPos = opt.GetConfigValueByKey("CurrentLinearPos");//当前路径行驶的位置
        var mPassKeyPointIndex = opt.GetConfigValueByKey("PassKeyPointIndex");//已通过的关键点索引
        var mIsPlayForward = opt.GetConfigValueByKey("IsPlayForward");//是否为正向行驶
        var mRealTimePositionGeo = opt.GetConfigValueByKey("RealTimePositionGeo");//路径行驶的实时位置(经纬-高程)
        var mPlayState = opt.GetConfigValueByKey("PlayState");//播放状态
        if(mPassKeyPointIndex==0)
        {
            mKeyPointIndex=1;
        }
        //路径播放中返回
        if(mPassKeyPointIndex==mKeyPointIndex)
        {
            mKeyPointIndex++;
            //alert("当前行驶到第"+mPassKeyPointIndex+"个关键点" + "\n行驶位置:"+mCurrentLinearPos+";是否为正向:"+mIsPlayForward+";实时位置坐标:"+mRealTimePositionGeo);

        }
    }
}
function callBackFun1(x, y){
    var transformate = map.CreateTransformation();
    var destPos = transformate.ScreenPosToWorldPos(x, y);//将屏幕坐标点转换成经纬度坐标
    if(bIsFindTransformation)
    {
        myPosInput.value = destPos.GetX() + "," + destPos.GetY() + "," + destPos.GetZ() + ";";
    }
    //console.log(destPos.GetX() + "," + destPos.GetY() + "," + destPos.GetZ() + ";");
}

//********************************************************
//1.图层对象操作
//********************************************************
//创建动态路径图层
function createDynamicPathLayer(bIsModel, bIsPreset){
    if(event == null){
        addEvent(obj, "FireOnLayerNotify", callBackFun);
    }
    if(dynamicPathLayer == null){
        var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建路径动画图层配置,给配置起个名称,任意名称
        tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//创建配置类型,
        if(bIsModel){//模型路径配置配置
            tlo.AddConfig("Url", gModelDeviceFolderPath + "/car.wrl"); //配置的动画的模型
            tlo.AddConfig("NodeXScale", "0.5");//模型x轴缩放大小
            tlo.AddConfig("NodeYScale", "0.5");//模型Y轴缩放大小
            tlo.AddConfig("NodeZScale", "0.5");//模型Z轴缩放大小
            tlo.AddConfig("ModelRoll", "0");//模型x轴旋转量
            tlo.AddConfig("ModelPitch", "3.116");//模型Y轴旋转量
            tlo.AddConfig("ModelHeading", "0");//模型Z轴旋转量
        }
        tlo.AddConfig("PlayerMode", "PLAYER_ONEWAY");//播放模式. PLAYER_ONEWAY-播放一次; PLAYER_ONEWAY_LOOP-循环播放;  PLAYER_ROUND_LOOP-往返播放; PLAYER_ONEWAY_STAY-实时播放
        tlo.AddConfig("PlayerState", "PLAYER_STOP");//播放状态. PLAYER_PLAY-播放; PLAYER_PAUSE-暂停; PLAYER_STOP停止
        tlo.AddConfig("ViewObjectMode", "0,-0.2,3");//设置视角对象;视角对象的格式为"水平方位角,垂直俯仰角,视点到关键点距离"
        tlo.AddConfig("Velocity", String(speed));//速度. 单位m/s
        tlo.AddConfig("Accelerator", "0.0");//加速度. 单位m/s,加速度大于0会进行加速行驶
        tlo.AddConfig("CornerSpeedScale", "0.5");//转角速度比例(0-1之间)
        tlo.AddConfig("LineWidth", "2.0");//线宽(0-10)
        tlo.AddConfig("LineStipple", "-1");//线样式
        tlo.AddConfig("LineColor", "1.0,1.0,0.0,1");//路径线颜色
        tlo.AddConfig("Radius", "3.0");//拐弯处平滑半径(圆角)
        if(bIsPreset){
            tlo.AddConfig("KeyPoints", keyPointList);//输入关键点列表
        }
        tlo.AddConfig("InterpLineWidth", "2.0");//差值线线宽
        tlo.AddConfig("InterpLineStipple", "500");//差值线线样式
        tlo.AddConfig("InterpLineColor", "1.0,1.0,1.0,1.0");//差值线颜色,不需要差值线去掉颜色
        tlo.AddConfig("KeyPointLiftUp", "0"); //关键点抬高
        tlo.AddConfig("PlayAsKeyPoint", "false");//播放类型。true-以关键点参数进行播放;false-以路径参数进行播放
        tlo.AddConfig("IsSwerveControl", "true");//是否弯道减速,需配合CornerSpeedScale来使用
        tlo.AddConfig("NodeActive", String(bIsFollow));//跟随移动状态。true-跟随移动;false-不跟随
        dynamicPathLayer = map.CreateLayer("DynamicPathLayer", tlo);//创建路径图层
        map.AddLayer(dynamicPathLayer);//添加图层
        layermap[dynamicPathLayer.GetLayerID()] = dynamicPathLayer;
        dynamicPathLayer.AddObserver();//添加路径图层监视
        AddOption();
    }else{
        alert("图层已创建,请勿重复创建!");
    }
}
//删除动态路径图层
function RemoveDynamicPathLayer(){
    if(dynamicPathLayer){
        map.RemoveLayer(dynamicPathLayer);//移除图层
        dynamicPathLayer = null;
    }else{
        alert("图层为空,无需移除!");
    }
    if(event){
        delEvent(obj, "FireOnLayerNotify", callBackFun, event);
        event = null;
    }
}

//路径序列化
function PathSerializer() 
{
    dynamicPathLayer.SerializeLayer("E:\\Test\\path.xml");//序列化路径图层
}

//路径反序列化
function PathDeserializer() 
{
    dynamicPathLayer=map.DeserializeLayer("E:\\Test\\path.xml");//反序列化路径图层
}

//*************************************************************************
//2.关键点编辑
//*************************************************************************
//OperationName代表对关键点的更新操作类型,可选值为
//InsertKeyPoints - 插入关键点
//UpdateKeyPoints - 更新关键点
//GetKeyPoint     - 获取关键点
//DeleteKeyPoint  - 删除关键点    
//获取关键点索引
 function AddOption()
 {
    var opt = dynamicPathLayer.GetLayerResult();
    var index = opt.GetConfigValueByKey("KeyPointSize");//获取关键点的个数
    var Option = document.getElementById("SelOption");
    Option.options.length=0;
    if ( null != Option ) 
    {
        var TextNode;
        var ElementOption;
        for (var i = 0; i < index; ++i) 
        {
           ElementOption = document.createElement("option");
           TextNode = document.createTextNode(i);
           ElementOption.appendChild( TextNode );
           Option.appendChild(ElementOption);
        }
     }
   }

//获取对应索引的关键点信息
function FindDynamicPathPointByIndex()
{
    if(dynamicPathLayer){
        var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
        tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
        tlo.AddConfig("OperationName","GetKeyPoint");//更新操作类型
        tlo.AddConfig("KeyPointIndex", SelOption.selectedIndex);//将对应关键点的索引传入
        dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游
        var opt = dynamicPathLayer.GetLayerResult();//获取图层结果
        var KeyPointValue = opt.GetConfigValueByKey("CurrentKeyPoint");//获取索引对应的关键点信息
        if(!KeyPointValue)
        {
            return;
        }
        var KeyPoint = new Array();
        KeyPoint=KeyPointValue.split(":");//将获取的信息以:划分
        myPosInput.value = KeyPoint[1];
        var ViewInput= KeyPoint[2];
        var mViewInput = ViewInput.split(",");//将获取的信息以:划分
        myazimuth.value =mViewInput[0];
        mypitch.value =mViewInput[1];
        myrange.value =mViewInput[2];
        mySpeednput.value = KeyPoint[3];
        myAcceleratorInput.value = KeyPoint[4];
        myRadiusInput.value = KeyPoint[5];
        myLiftUpInput.value = KeyPoint[6].substring(0, KeyPoint[6].indexOf(";"));
    }else{
        alert("图层为空,获取信息失败!");
    }
}

//开关鼠标获取坐标信息
function FindTransformation()
{
    bIsFindTransformation=!bIsFindTransformation;
}

//在对应索引的点前增加关键点
function AddDynamicPathPointByIndex()
{
    var selOption = document.getElementById("SelOption");
    var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo.AddConfig("OperationName","InsertKeyPoints"); //插入关键点
    tlo.AddConfig("KeyPointIndex", SelOption.selectedIndex); //新增关键点会添加在该序号的点之前,-1代表添加在末尾
    if(myPosInput.value)//如果未设置坐标参数,则不更新
    {
        tlo.AddConfig("KeyPoints",myPosInput.value+";");//插入的关键点坐标,最后一位必须为;
    }
    else
    {
        return;
    }
    //可设关键点自身参数,如果不设置,则默认使用图层参数
    if(myazimuth.value &&mypitch.value&&myrange.value)//如果设置了参数
    {
        tlo.AddConfig("ViewObjectMode",myazimuth.value+","+mypitch.value+","+myrange.value);//设置视角
    }
    if(mySpeednput.value)//如果设置了参数
    {
        tlo.AddConfig("Velocity", mySpeednput.value);//速度 单位m/s
    }
    if(myAcceleratorInput.value)//如果设置了参数
    {
        tlo.AddConfig("Accelerator", myAcceleratorInput.value);//加速度 单位m/s,加速度大于0会进行加速行驶
    }
    if(myRadiusInput.value)//如果设置了参数
    {
        tlo.AddConfig("Radius", myRadiusInput.value);//拐弯处平滑半径(圆角)
    }
    if(myLiftUpInput.value)//如果设置了参数
    {
        tlo.AddConfig("KeyPointLiftUp", myLiftUpInput.value);//对于关键点抬高
    }
    dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游
}

//更换对应索引的关键点参数
function UpdateDynamicPathPointByIndex()
{
    var selOption = document.getElementById("SelOption");
    var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo.AddConfig("OperationName","UpdateKeyPoints");//对关键点进行更新
    tlo.AddConfig("KeyPointIndex", SelOption.selectedIndex);  //更新对应索引的关键点
    //可设关键点自身参数,如果不设置,则默认使用图层参数
    if(myazimuth.value &&mypitch.value&&myrange.value)//如果设置了参数
    {
        tlo.AddConfig("ViewObjectMode",myazimuth.value+","+mypitch.value+","+myrange.value);//设置视角
    }
    if(mySpeednput.value)//如果设置了参数
    {
        tlo.AddConfig("Velocity", mySpeednput.value);//速度 单位m/s
    }
    if(myAcceleratorInput.value)//如果设置了参数
    {
        tlo.AddConfig("Accelerator", myAcceleratorInput.value);//加速度 单位m/s,加速度大于0会进行加速行驶
    }
    if(myRadiusInput.value)//如果设置了参数
    {
        tlo.AddConfig("Radius", myRadiusInput.value);//拐弯处平滑半径(圆角)
    }
    if(myLiftUpInput.value)//如果设置了参数
    {
        tlo.AddConfig("KeyPointLiftUp", myLiftUpInput.value);//对于关键点抬高
    }
    dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游    
}

//删除对应索引的关键点
function DeleteDynamicPathPointByIndex()
{
    var selOption = document.getElementById("SelOption");
    var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo.AddConfig("OperationName","DeleteKeyPoint");//删除关键点
    tlo.AddConfig("KeyPointIndex", SelOption.selectedIndex);//删除该索引的关键点
    dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游    
}

//末尾追加关键点,以下配置要对添加的关键点生效,PlayAsKeyPoint必须为true
function LoadDynamicPathPoint()
{
    var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo.AddConfig("OperationName","InsertKeyPoints");//插入关键点
    tlo.AddConfig("KeyPointIndex", -1);//插入关键点,-1代表在末尾
    tlo.AddConfig("KeyPoints","120.218982652,30.211800004,14.7999729766;");//插入的关键点坐标,最后一位必须为;
    tlo.AddConfig("ViewObjectMode","0.0,-0.708,20.0");//设置视角对象;视角对象的格式为"水平方位角,垂直俯仰角,视点到关键点距离"
    tlo.AddConfig("Velocity", "5.0"); //速度 单位m/s
    tlo.AddConfig("Accelerator", "1.0");//加速度 单位m/s,加速度大于0会进行加速行驶
    tlo.AddConfig("KeyPointLiftUp", "0.0");//对于关键点抬高
    dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游    
}

//*************************************************************************
//3.场景控制关键点编辑:
//*************************************************************************    
//EditType代表内部响应器编辑操作,可选值为
//ADD    - 添加操作
//SELECT - 拾取操作
//MOVE   - 移动操作
//NONE   - 关闭响应器操作

//EditObject代表编辑对象
//POINT - 编辑关键点
//PATH - 整体编辑
//开启响应器添加关键点
function AddDynamicPathPoint()
{
    var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo.AddConfig("EditType", "ADD");  // //将响应器编辑状态改为添加
    dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游    
}

//拾取关键点
function SelectDynamicPathPoint()
{
    var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo.AddConfig("EditType", "SELECT");//将响应器编辑状态改为拾取
    dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游    
}

//更新关键点
function UpdateDynamicPathPoint()
{
    if(SelectIndex)
    {
        var selOption = document.getElementById("SelOption");
        var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
        tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
        tlo.AddConfig("OperationName", "UpdateKeyPoints");//对关键点进行更新
        tlo.AddConfig("KeyPointIndex", SelectIndex);  //新增关键点会添加在该序号的点之前,-1代表添加在末尾
        tlo.AddConfig("ViewObjectMode","0.0,-0.708,200.0");//设置视角对象;视角对象的格式为"水平方位角,垂直俯仰角,视点到关键点距离"
        tlo.AddConfig("Velocity", "15.0"); ///速度 单位m/s
        tlo.AddConfig("KeyPointLiftUp", "5.0"); ///对于关键点抬高
        dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游    
    }        
}

//移动拾取的关键点
function MoveDynamicPathPoint()
{
    var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo.AddConfig("EditType", "MOVE");  //将响应器编辑状态改为移动
    dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游
}

//删除拾取的关键点
function DeleteDynamicPathPoint()
{
    if(SelectIndex)
    {
    var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo.AddConfig("OperationName","DeleteKeyPoint"); //设置对关键点的删除
    tlo.AddConfig("KeyPointIndex", SelectIndex);  //删除对应索引的点
    dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游
    SelectIndex=null;
    }
}


//整体编辑
function EditPath()
{
    var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo.AddConfig("EditObject", "PATH"); //编辑对象。 PATH-整体编辑    
    dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游
}

//关键点编辑
function EditPoint()
{
    var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo.AddConfig("EditObject", "POINT"); //编辑对象。 POINT-单个关键点编辑    ,默认值为 POINT
    dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游
}

//关闭路径编辑状态
function CloseDynamicPathResponser()
{
    var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo.AddConfig("EditType", "NONE");//将响应器编辑状态关闭
    dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游
    SelectIndex=null;
}

//*************************************************************************
//4.播放控制:
//*************************************************************************
//切换播放类型
var IsPlayAsKeyPoint=true;
function UpdatePlayAsKeyPoint() {
    var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    if(IsPlayAsKeyPoint)
    {
        tlo.AddConfig("PlayAsKeyPoint", "false");//播放类型。true-以关键点参数进行播放;false-以路径参数进行播放
        IsPlayAsKeyPoint=false;
        alert("当前以路径参数进行播放");
    }
    else{
        tlo.AddConfig("PlayAsKeyPoint", "true");//播放类型。true-以关键点参数进行播放;false-以路径参数进行播放
        IsPlayAsKeyPoint=true;
        alert("当前以关键点参数进行播放");
    }
    dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游    
}
//切换跟随移动状态
function UpdateNodeActive(){
    if(dynamicPathLayer){
        var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
        tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
        tlo.AddConfig("NodeActive", String(bIsFollow = !bIsFollow));//跟随移动状态
        dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游    
    }else{
        alert("图层为空,无法切换");
    }
}
//显隐动态路径
function SetVisibleRoamPath(){
    if(dynamicPathLayer){
        dynamicPathLayer.SetVisible(bIsVisible = !bIsVisible);//修改路径线显隐
    }else{
        alert("图层为空,无法显隐");
    }
}
//播放
function Play(){
    if(dynamicPathLayer){
        var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
        tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
        tlo.AddConfig("PlayerState", "PLAYER_PLAY");//设置播放状态
        dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游    
    }else{
        alert("图层为空,无法播放!");
    }
}
//暂停
function Pause(){
    if(dynamicPathLayer){
        var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
        tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
        tlo.AddConfig("PlayerState", "PLAYER_PAUSE");//设置播放状态
        dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游    
    }else{
        alert("图层为空,无法暂停!");
    }
}
//停止
function Stop(){
    if(dynamicPathLayer){
        var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
        tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
        tlo.AddConfig("PlayerState", "PLAYER_STOP");//设置播放状态
        dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游    
    }else{
        alert("图层为空,无法停止!");
    }
}
//加速
function Accelerate(){//加速,PlayAsKeyPoint必须为false
    if(dynamicPathLayer){
        speed += 5;
        var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
        tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
        tlo.AddConfig("Velocity", String(speed));//速度
        dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游    
    }else{
        alert("图层为空,无法加速!");
    }
}
//减速
function SlowDown(){//减速,PlayAsKeyPoint必须为false
    if(dynamicPathLayer){
        speed -= 5;
        if(speed < 0)
        {
            speed = 1;
        }
        var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
        tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
        tlo.AddConfig("Velocity", String(speed));//速度
        dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游    
    }else{
        alert("图层为空,无法减速!");
    }
}
//恢复速度
function Restore(){//重置速度,PlayAsKeyPoint必须为false
    if(dynamicPathLayer){
        speed = 15;
        var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
        tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
        tlo.AddConfig("Velocity", String(speed));//速度
        dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游
    }else{
        alert("图层为空,无法恢复速度!");
    }
}

//左视 ,PlayAsKeyPoint必须为false
function LeftView() {
    var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions"); //动态路径配置信息 必须为DynamicPathLayerOptions
    tlo.AddConfig("ViewObjectMode", "1.57,-0.708,100.0"); //设置视角对象;视角对象的格式为"水平方位角,垂直俯仰角,视点到关键点距离"
    dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游
}

//右视 ,PlayAsKeyPoint必须为false
function RightView() {
    var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions"); //动态路径配置信息 必须为DynamicPathLayerOptions
    tlo.AddConfig("ViewObjectMode", "4.71,-0.708,100.0");//设置视角对象;视角对象的格式为"水平方位角,垂直俯仰角,视点到关键点距离"
    dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游
}

//前视 ,PlayAsKeyPoint必须为false
function FrontView() {
    var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions"); //动态路径配置信息 必须为DynamicPathLayerOptions
    tlo.AddConfig("ViewObjectMode", "3.14,-0.708,100.0");//设置视角对象;视角对象的格式为"水平方位角,垂直俯仰角,视点到关键点距离"
    dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游
}

//后视 ,PlayAsKeyPoint必须为false
function BackView() {
    var tlo = map.CreateLayerOptions("dynamicpathlayer");
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions"); //动态路径配置信息 必须为DynamicPathLayerOptions
    tlo.AddConfig("ViewObjectMode", "0,-0.708,100.0");//设置视角对象;视角对象的格式为"水平方位角,垂直俯仰角,视点到关键点距离"
    dynamicPathLayer.UpdateLayerOptions(tlo);
}

//上视 ,PlayAsKeyPoint必须为false
function UpView() {
    var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions"); //动态路径配置信息 必须为DynamicPathLayerOptions
    tlo.AddConfig("ViewObjectMode", "0,-1.57,100.0");//设置视角对象;视角对象的格式为"水平方位角,垂直俯仰角,视点到关键点距离"
    dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游
}

C++调用

BaseObjectCOMLib::ILayerObjectPtr dynamicPathLayer;//路径图层
CComboBox m_combo;//关键点索引下拉框对象
long keyPointsindex;//关键点个数
std::string keyPointindex;//关键点索引
bool bIsFindTransformation;//是否鼠标左键获取坐标
std::string SelectIndex;//拾取获取的关键点
bool IsPlayAsKeyPoint;//播放类型控制
bool bIsFollow;//是否跟随移动控制
bool bIsVisible;//路径显隐控制
int mKeyPointIndex;//行驶关键点索引

std::string myPosInput;//关键点坐标
std::string myViewInput;//视角信息
std::string mySpeednput;//速度
std::string myAcceleratorInput;//加速度
std::string myRadiusInput;//差值半径
std::string myLiftUpInput;//关键点抬高

CEdit PosInputEdit;//关键点坐标输入框对象
CEdit ViewInputEdit;//视角信息输入框对象
CEdit SpeedInputEdit;//速度输入框对象
CEdit AcceleratorInpuEdit;//加速度输入框对象
CEdit RadiusInputEdit;//差值半径输入框对象
CEdit LiftUpInputEdit;//关键点抬高输入框对象

//加载路径图层
void Cf4c5DynamicPathDlg::loadDynamicPathLayer(bool bIsModel,bool bIsPreset,std::string gModelDeviceFolderPath,std::string keyPointList)
{
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions(""); //创建图层配置对象,任意名称
    tlo->AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//创建配置类型,
    if(bIsModel){//模型路径配置配置
        tlo->AddConfig("Url", gModelDeviceFolderPath.c_str()); //配置的动画的模型
        tlo->AddConfig("NodeXScale", "0.5");//模型x轴缩放大小
        tlo->AddConfig("NodeYScale", "0.5");//模型Y轴缩放大小
        tlo->AddConfig("NodeZScale", "0.5");//模型Z轴缩放大小
        tlo->AddConfig("ModelRoll", "0");//模型x轴旋转量
        tlo->AddConfig("ModelPitch", "3.116");//模型Y轴旋转量
        tlo->AddConfig("ModelHeading", "0");//模型Z轴旋转量
    }
    tlo->AddConfig("PlayerMode", "PLAYER_ONEWAY");//播放模式. PLAYER_ONEWAY-播放一次; PLAYER_ONEWAY_LOOP-循环播放;  PLAYER_ROUND_LOOP-往返播放; PLAYER_ONEWAY_STAY-实时播放
    tlo->AddConfig("PlayerState", "PLAYER_STOP");//播放状态. PLAYER_PLAY-播放; PLAYER_PAUSE-暂停; PLAYER_STOP停止
    tlo->AddConfig("ViewObjectMode", "0,-0.2,3");//设置视角对象;视角对象的格式为"水平方位角,垂直俯仰角,视点到关键点距离"
    tlo->AddConfig("Velocity", "5");//速度. 单位m/s
    tlo->AddConfig("Accelerator", "0.0");//加速度. 单位m/s,加速度大于0会进行加速行驶
    tlo->AddConfig("CornerSpeedScale", "0.5");//转角速度比例(0-1之间)
    tlo->AddConfig("LineWidth", "2.0");//线宽(0-10)
    tlo->AddConfig("LineStipple", "-1");//线样式
    tlo->AddConfig("LineColor", "1.0,1.0,0.0,1");//路径线颜色
    tlo->AddConfig("Radius", "3.0");//拐弯处平滑半径(圆角)
    if(bIsPreset){
        tlo->AddConfig("KeyPoints", keyPointList.c_str());//输入关键点列表
    }
    tlo->AddConfig("InterpLineWidth", "2.0");//差值线线宽
    tlo->AddConfig("InterpLineStipple", "500");//差值线线样式
    tlo->AddConfig("InterpLineColor", "1.0,1.0,1.0,1.0");//差值线颜色,不需要差值线去掉颜色
    tlo->AddConfig("KeyPointLiftUp", "0"); //关键点抬高
    tlo->AddConfig("PlayAsKeyPoint", "false");//播放类型。true-以关键点参数进行播放;false-以路径参数进行播放
    tlo->AddConfig("IsSwerveControl", "true");//是否弯道减速,需配合CornerSpeedScale来使用
    tlo->AddConfig("NodeActive", "true");//跟随移动状态。true-跟随移动;false-不跟随
    dynamicPathLayer = map->CreateLayer("DynamicPathLayer", tlo);//创建路径图层
    map->AddLayer(dynamicPathLayer);//添加图层
    dynamicPathLayer->AddObserver();//添加路径图层监视
}

//设置输入框内容
void Cf4c5DynamicPathDlg::setDynamicPathPoint(std::string KeyPointValue)
{
    std::vector<std::string> KeyPoint;
    SplitString(KeyPointValue,KeyPoint,":");//分割结果
    myPosInput = KeyPoint[1];
    myViewInput = KeyPoint[2];
    mySpeednput = KeyPoint[3];
    myAcceleratorInput = KeyPoint[4];
    myRadiusInput = KeyPoint[5];
    myLiftUpInput = KeyPoint[6].substr(0, KeyPoint[6].find(";"));
    _bstr_t t = myPosInput.c_str();
    PosInputEdit.SetWindowText(t);
    t = myViewInput.c_str();
    ViewInputEdit.SetWindowText(t);
    t = mySpeednput.c_str();
    SpeedInputEdit.SetWindowText(t);
    t = myAcceleratorInput.c_str();
    AcceleratorInpuEdit.SetWindowText(t);
    t = myRadiusInput.c_str();
    RadiusInputEdit.SetWindowText(t);
    t = myLiftUpInput.c_str();
    LiftUpInputEdit.SetWindowText(t);
}

//创建路径图层
void Cf4c5DynamicPathDlg::OnBnClickedcreatedynamicpathlayer()
{
    if(dynamicPathLayer)
    {
        return;
    }
    char temp_status[MAX_PATH];
    GetPrivateProfileStringA("Path", "ModelDeviceFolderPath", "", temp_status, MAX_PATH, mIniPath.c_str());
    std::string ModelPath(temp_status);
    loadDynamicPathLayer(TRUE,TRUE, ModelPath, "120.219652381,30.2102796597,14.8471973008;120.219228677,30.2109204111,14.7999731209;120.219066611,30.2109525583,14.7999699935;120.218700324,30.2108002945,14.799943476;120.218728451,30.2106748092,14.7999742515;120.218952979,30.2100989073,14.7999547897;120.219026376,30.2098925768,14.799970909;120.218995824,30.2098632529,14.8299724646;120.218730274,30.2097854181,14.7999352217;");//加载路径图层
}

//创建路径图层(无关键点)
void Cf4c5DynamicPathDlg::OnBnClickedcreatedynamicpathlayernopoint()
{
    if(dynamicPathLayer)
    {
        return;
    }
    char temp_status[MAX_PATH];
    GetPrivateProfileStringA("Path", "ModelDeviceFolderPath", "", temp_status, MAX_PATH, mIniPath.c_str());
    std::string ModelPath(temp_status);
    loadDynamicPathLayer(TRUE,FALSE, ModelPath, "");//加载路径图层
}

//删除路径图层
void Cf4c5DynamicPathDlg::OnBnClickedRemovedynamicpathlayer()
{
    if(!dynamicPathLayer)
    {
        return;
    }
    map->RemoveLayer(dynamicPathLayer);//删除图层
    keyPointsindex = 0;
    myPosInput.clear();
    myViewInput.clear();
    mySpeednput.clear();
    myAcceleratorInput.clear();
    myRadiusInput.clear();
    myLiftUpInput.clear();
}


//路径序列化
void Cf4c5DynamicPathDlg::OnBnClickedPathserializer()
{
    if(!dynamicPathLayer)
    {
        return;
    }
    dynamicPathLayer->SerializeLayer("E:\\Test\\path.xml");//序列化路径图层
}

//路径反序列化
void Cf4c5DynamicPathDlg::OnBnClickedPathdeserializer()
{
    if(dynamicPathLayer)
    {
        return;
    }
    map->DeserializeLayer("E:\\Test\\path.xml");//序列化路径图层
}

//获取关键点索引个数
void Cf4c5DynamicPathDlg::OnBnClickedgetkeypointindex()
{
    if(!dynamicPathLayer)
    {
        return;
    }
    ConfigOptionsCOMLib::ILayerOptionsPtr opt = dynamicPathLayer->GetLayerResult();
    std::string index = opt->GetConfigValueByKey("KeyPointSize");//获取关键点的个数
    keyPointsindex = atoi(index.c_str());

}

//获取下拉框内容
void Cf4c5DynamicPathDlg::OnCbnSetfocusCombo1()
{
    m_combo.ResetContent();//清空下拉框
    CString str;
    for (long i = 0; i < keyPointsindex; ++i) 
    {
        str.Format(_T("%d"),i);
        m_combo.AddString(str);
    }
    m_combo.SetCurSel(-1);
}

//获取关键点索引
void Cf4c5DynamicPathDlg::OnCbnSelchangeCombo1()
{
    CString m_paramname;
    m_combo.GetLBText(m_combo.GetCurSel(),m_paramname);
    keyPointindex = CT2A(m_paramname.GetBuffer());
}

//获取参数
void Cf4c5DynamicPathDlg::OnBnClickedFinddynamicpathpointbyindex()
{
    if(!dynamicPathLayer)
    {
        return;
    }
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions(""); //创建图层配置对象,任意名称
    tlo->AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo->AddConfig("OperationName","GetKeyPoint");//更新操作类型
    tlo->AddConfig("KeyPointIndex", keyPointindex.c_str());//将对应关键点的索引传入
    dynamicPathLayer->UpdateLayerOptions(tlo);//更新路径漫游
    ConfigOptionsCOMLib::ILayerOptionsPtr opt = dynamicPathLayer->GetLayerResult();
    std::string KeyPointValue = opt->GetConfigValueByKey("CurrentKeyPoint");//获取索引对应的关键点信息
    setDynamicPathPoint(KeyPointValue);
}

//是否鼠标左键获取坐标
void Cf4c5DynamicPathDlg::OnBnClickedFindtransformation()
{
    bIsFindTransformation=!bIsFindTransformation;
}

//插入关键点
void Cf4c5DynamicPathDlg::OnBnClickedAdddynamicpathpointbyindex()
{
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions(""); //创建图层配置对象,任意名称
    tlo->AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo->AddConfig("OperationName","InsertKeyPoints"); //插入关键点
    tlo->AddConfig("KeyPointIndex", keyPointindex.c_str()); //新增关键点会添加在该序号的点之前,-1代表添加在末尾
    if(!myPosInput.empty())//如果未设置坐标参数,则不更新
    {
        std::string myPosInput1 = myPosInput+";";
        tlo->AddConfig("KeyPoints",myPosInput1.c_str());//插入的关键点坐标,最后一位必须为;
    }
    else
    {
        return;
    }
    //可设关键点自身参数,如果不设置,则默认使用图层参数
    if(!myViewInput.empty())//如果设置了参数
    {
        tlo->AddConfig("ViewObjectMode",myViewInput.c_str());//设置视角
    }
    if(!mySpeednput.empty())//如果设置了参数
    {
        tlo->AddConfig("Velocity", mySpeednput.c_str());//速度 单位m/s
    }
    if(!myAcceleratorInput.empty())//如果设置了参数
    {
        tlo->AddConfig("Accelerator", myAcceleratorInput.c_str());//加速度 单位m/s,加速度大于0会进行加速行驶
    }
    if(!myRadiusInput.empty())//如果设置了参数
    {
        tlo->AddConfig("Radius", myRadiusInput.c_str());//拐弯处平滑半径(圆角)
    }
    if(!myLiftUpInput.empty())//如果设置了参数
    {
        tlo->AddConfig("KeyPointLiftUp", myLiftUpInput.c_str());//对于关键点抬高
    }
    dynamicPathLayer->UpdateLayerOptions(tlo);//更新路径漫游
}

//更换对应索引的关键点参数
void Cf4c5DynamicPathDlg::OnBnClickedUpdatedynamicpathpointbyindex()
{
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions(""); //创建图层配置对象,任意名称
    tlo->AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo->AddConfig("OperationName","UpdateKeyPoints"); //更新关键点
    tlo->AddConfig("KeyPointIndex", keyPointindex.c_str()); 
    //可设关键点自身参数,如果不设置,则默认使用图层参数
    if(!myViewInput.empty())//如果设置了参数
    {
        tlo->AddConfig("ViewObjectMode",myViewInput.c_str());//设置视角
    }
    if(!mySpeednput.empty())//如果设置了参数
    {
        tlo->AddConfig("Velocity", mySpeednput.c_str());//速度 单位m/s
    }
    if(!myAcceleratorInput.empty())//如果设置了参数
    {
        tlo->AddConfig("Accelerator", myAcceleratorInput.c_str());//加速度 单位m/s,加速度大于0会进行加速行驶
    }
    if(!myRadiusInput.empty())//如果设置了参数
    {
        tlo->AddConfig("Radius", myRadiusInput.c_str());//拐弯处平滑半径(圆角)
    }
    if(!myLiftUpInput.empty())//如果设置了参数
    {
        tlo->AddConfig("KeyPointLiftUp", myLiftUpInput.c_str());//对于关键点抬高
    }
    dynamicPathLayer->UpdateLayerOptions(tlo);//更新路径漫游
}

//删除对应索引的关键点
void Cf4c5DynamicPathDlg::OnBnClickedDeletedynamicpathpointbyindex()
{
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions(""); //创建图层配置对象,任意名称
    tlo->AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo->AddConfig("OperationName","DeleteKeyPoint"); //删除关键点
    tlo->AddConfig("KeyPointIndex", keyPointindex.c_str());
    dynamicPathLayer->UpdateLayerOptions(tlo);//更新路径漫游
}

//末尾追加关键点,以下配置要对添加的关键点生效,PlayAsKeyPoint必须为true
void Cf4c5DynamicPathDlg::OnBnClickedLoaddynamicpathpoint()
{
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions(""); //创建图层配置对象,任意名称
    tlo->AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo->AddConfig("OperationName","InsertKeyPoints");//插入关键点
    tlo->AddConfig("KeyPointIndex", "-1");//插入关键点,-1代表在末尾
    tlo->AddConfig("KeyPoints","120.218982652,30.211800004,14.7999729766;");//插入的关键点坐标,最后一位必须为;
    tlo->AddConfig("ViewObjectMode","0.0,-0.708,20.0");//设置视角对象;视角对象的格式为"水平方位角,垂直俯仰角,视点到关键点距离"
    tlo->AddConfig("Velocity", "5.0"); //速度 单位m/s
    tlo->AddConfig("Accelerator", "1.0");//加速度 单位m/s,加速度大于0会进行加速行驶
    tlo->AddConfig("KeyPointLiftUp", "0.0");//对于关键点抬高
    dynamicPathLayer->UpdateLayerOptions(tlo);//更新路径漫游    
}

//*************************************************************************
//场景控制关键点编辑:
//*************************************************************************    
//EditType代表内部响应器编辑操作,可选值为
//ADD    - 添加操作
//SELECT - 拾取操作
//MOVE   - 移动操作
//NONE   - 关闭响应器操作

//EditObject代表编辑对象
//POINT - 编辑关键点
//PATH - 整体编辑
//开启响应器添加关键点
void Cf4c5DynamicPathDlg::OnBnClickedAdddynamicpathpoint()
{
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions(""); //创建图层配置对象,任意名称
    tlo->AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo->AddConfig("EditType", "ADD");  // //将响应器编辑状态改为添加
    dynamicPathLayer->UpdateLayerOptions(tlo);//更新路径漫游    
}

//拾取关键点
void Cf4c5DynamicPathDlg::OnBnClickedSelectdynamicpathpoint()
{
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions(""); //创建图层配置对象,任意名称
    tlo->AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo->AddConfig("EditType", "SELECT");  //将响应器编辑状态改为拾取
    dynamicPathLayer->UpdateLayerOptions(tlo);//更新路径漫游    
}

//更新关键点
void Cf4c5DynamicPathDlg::OnBnClickedUpdatedynamicpathpoint()
{
    if(SelectIndex.empty())
    {
        return;
    }
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions(""); //创建图层配置对象,任意名称
    tlo->AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo->AddConfig("OperationName", "UpdateKeyPoints");//对关键点进行更新
    tlo->AddConfig("KeyPointIndex", SelectIndex.c_str());  //新增关键点会添加在该序号的点之前,-1代表添加在末尾
    tlo->AddConfig("ViewObjectMode","0.0,-0.708,200.0");//设置视角对象;视角对象的格式为"水平方位角,垂直俯仰角,视点到关键点距离"
    tlo->AddConfig("Velocity", "15.0"); ///速度 单位m/s
    tlo->AddConfig("KeyPointLiftUp", "5.0"); ///对于关键点抬高
    dynamicPathLayer->UpdateLayerOptions(tlo);//更新路径漫游    
}


//移动拾取的关键点
void Cf4c5DynamicPathDlg::OnBnClickedMovedynamicpathpoint()
{
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions(""); //创建图层配置对象,任意名称
    tlo->AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo->AddConfig("EditType", "MOVE");  //将响应器编辑状态改为移动
    dynamicPathLayer->UpdateLayerOptions(tlo);//更新路径漫游    
}

//删除拾取的关键点
void Cf4c5DynamicPathDlg::OnBnClickedDeletedynamicpathpoint()
{
    if(SelectIndex.empty())
    {
        return;
    }
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions(""); //创建图层配置对象,任意名称
    tlo->AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo->AddConfig("OperationName","DeleteKeyPoint"); //设置对关键点的删除
    tlo->AddConfig("KeyPointIndex", SelectIndex.c_str());  //删除对应索引的点
    dynamicPathLayer->UpdateLayerOptions(tlo);//更新路径漫游
    SelectIndex.clear();
}

//整体编辑
void Cf4c5DynamicPathDlg::OnBnClickedEditpath()
{
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions(""); //创建图层配置对象,任意名称
    tlo->AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo->AddConfig("EditObject", "PATH"); //编辑对象。 PATH-整体编辑    
    dynamicPathLayer->UpdateLayerOptions(tlo);//更新路径漫游
}

//关键点编辑
void Cf4c5DynamicPathDlg::OnBnClickedEditpoint()
{
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions(""); //创建图层配置对象,任意名称
    tlo->AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo->AddConfig("EditObject", "POINT"); //编辑对象。 POINT-单个关键点编辑,默认值为 POINT
    dynamicPathLayer->UpdateLayerOptions(tlo);//更新路径漫游
}

//关闭路径编辑状态
void Cf4c5DynamicPathDlg::OnBnClickedClosedynamicpathresponser()
{
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions(""); //创建图层配置对象,任意名称
    tlo->AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo->AddConfig("EditType", "NONE");//将响应器编辑状态关闭
    dynamicPathLayer->UpdateLayerOptions(tlo);//更新路径漫游
    SelectIndex.clear();
}


//*************************************************************************
//4.播放控制:
//*************************************************************************
//切换播放类型
void Cf4c5DynamicPathDlg::OnBnClickedUpdateplayaskeypoint()
{
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions(""); //创建图层配置对象,任意名称
    tlo->AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    if(IsPlayAsKeyPoint)
    {
        tlo->AddConfig("PlayAsKeyPoint", "false");//播放类型。true-以关键点参数进行播放;false-以路径参数进行播放
        IsPlayAsKeyPoint = FALSE;
    }
    else{
        tlo->AddConfig("PlayAsKeyPoint", "true");//播放类型。true-以关键点参数进行播放;false-以路径参数进行播放
        IsPlayAsKeyPoint = TRUE;
    }
    dynamicPathLayer->UpdateLayerOptions(tlo);//更新路径漫游    
}

//切换跟随移动状态
void Cf4c5DynamicPathDlg::OnBnClickedUpdatenodeactive()
{
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions(""); //创建图层配置对象,任意名称
    tlo->AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    if(IsPlayAsKeyPoint)
    {
        tlo->AddConfig("NodeActive", "false");//跟随移动状态
        IsPlayAsKeyPoint = FALSE;
    }
    else{
        tlo->AddConfig("NodeActive", "true");//跟随移动状态
        IsPlayAsKeyPoint = TRUE;
    }
    dynamicPathLayer->UpdateLayerOptions(tlo);//更新路径漫游    
}

//显隐动态路径
void Cf4c5DynamicPathDlg::OnBnClickedSetvisibleroampath()
{
    dynamicPathLayer->SetVisible(bIsVisible = !bIsVisible);//修改路径线显隐
}


//播放
void Cf4c5DynamicPathDlg::OnBnClickedPlay()
{
    if(!dynamicPathLayer)
    {
        return;
    }
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions(""); //创建图层配置对象,任意名称
    tlo->AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo->AddConfig("PlayerState", "PLAYER_PLAY");//设置播放状态
    dynamicPathLayer->UpdateLayerOptions(tlo);//更新路径漫游    
}

//暂停
void Cf4c5DynamicPathDlg::OnBnClickedPause()
{
    if(!dynamicPathLayer)
    {
        return;
    }
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions(""); //创建图层配置对象,任意名称
    tlo->AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo->AddConfig("PlayerState", "PLAYER_PAUSE");//设置播放状态
    dynamicPathLayer->UpdateLayerOptions(tlo);//更新路径漫游    
}

//停止
void Cf4c5DynamicPathDlg::OnBnClickedStop()
{
    if(!dynamicPathLayer)
    {
        return;
    }
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions(""); //创建图层配置对象,任意名称
    tlo->AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo->AddConfig("PlayerState", "PLAYER_STOP");//设置播放状态
    dynamicPathLayer->UpdateLayerOptions(tlo);//更新路径漫游    
}

//加速
void Cf4c5DynamicPathDlg::OnBnClickedAccelerate()
{
    if(!dynamicPathLayer)
    {
        return;
    }
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions(""); //创建图层配置对象,任意名称
    tlo->AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo->AddConfig("Velocity", "30");//速度
    dynamicPathLayer->UpdateLayerOptions(tlo);//更新路径漫游    
}

//减速
void Cf4c5DynamicPathDlg::OnBnClickedSlowdown()
{
    if(!dynamicPathLayer)
    {
        return;
    }
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions(""); //创建图层配置对象,任意名称
    tlo->AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo->AddConfig("Velocity", "5");//速度
    dynamicPathLayer->UpdateLayerOptions(tlo);//更新路径漫游
}

//恢复速度
void Cf4c5DynamicPathDlg::OnBnClickedRestore()
{
    if(!dynamicPathLayer)
    {
        return;
    }
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions(""); //创建图层配置对象,任意名称
    tlo->AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo->AddConfig("Velocity", "15");//速度
    dynamicPathLayer->UpdateLayerOptions(tlo);//更新路径漫游
}

//左视 ,PlayAsKeyPoint必须为false
void Cf4c5DynamicPathDlg::OnBnClickedLeftview()
{
    if(!dynamicPathLayer)
    {
        return;
    }
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions(""); //创建图层配置对象,任意名称
    tlo->AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo->AddConfig("ViewObjectMode", "1.57,-0.708,100.0"); //设置视角对象;视角对象的格式为"水平方位角,垂直俯仰角,视点到关键点距离"
    dynamicPathLayer->UpdateLayerOptions(tlo);//更新路径漫游
}

//右视 ,PlayAsKeyPoint必须为false
void Cf4c5DynamicPathDlg::OnBnClickedRightview()
{
    if(!dynamicPathLayer)
    {
        return;
    }
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions(""); //创建图层配置对象,任意名称
    tlo->AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo->AddConfig("ViewObjectMode", "4.71,-0.708,100.0"); //设置视角对象;视角对象的格式为"水平方位角,垂直俯仰角,视点到关键点距离"
    dynamicPathLayer->UpdateLayerOptions(tlo);//更新路径漫游
}

//上视 ,PlayAsKeyPoint必须为false
void Cf4c5DynamicPathDlg::OnBnClickedUpview()
{
    if(dynamicPathLayer)
    {
        return;
    }
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions(""); //创建图层配置对象,任意名称
    tlo->AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo->AddConfig("ViewObjectMode", "0,-1.57,100.0"); //设置视角对象;视角对象的格式为"水平方位角,垂直俯仰角,视点到关键点距离"
    dynamicPathLayer->UpdateLayerOptions(tlo);//更新路径漫游
}

//前视 ,PlayAsKeyPoint必须为false
void Cf4c5DynamicPathDlg::OnBnClickedFrontview()
{
    if(!dynamicPathLayer)
    {
        return;
    }
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions(""); //创建图层配置对象,任意名称
    tlo->AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo->AddConfig("ViewObjectMode", "3.14,-0.708,100.0"); //设置视角对象;视角对象的格式为"水平方位角,垂直俯仰角,视点到关键点距离"
    dynamicPathLayer->UpdateLayerOptions(tlo);//更新路径漫游
}

//后视 ,PlayAsKeyPoint必须为false
void Cf4c5DynamicPathDlg::OnBnClickedBackview()
{
    if(!dynamicPathLayer)
    {
        return;
    }
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions(""); //创建图层配置对象,任意名称
    tlo->AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo->AddConfig("ViewObjectMode", "3.14,-0.708,100.0"); //设置视角对象;视角对象的格式为"水平方位角,垂直俯仰角,视点到关键点距离"
    dynamicPathLayer->UpdateLayerOptions(tlo);//更新路径漫游
}

//路径图层回调
void Cf4c5DynamicPathDlg::FireOnLayerNotifyVpsdkctrl1(long layerId, long layerType)
{
    ConfigOptionsCOMLib::ILayerOptionsPtr opt = dynamicPathLayer->GetLayerResult();//获取图层结果
    SelectIndex = opt->GetConfigValueByKey("CurrentKeyPointIndex"); //获取拾取的关键点索引
    std::string DataSourceTypeName = opt->GetConfigValueByKey("DataSourceTypeName");
    //非播放中事件
    if((DataSourceTypeName == "dynamicpath") && (layerType == 2))
    {
        std::string mEditState = opt->GetConfigValueByKey("EditState");///编辑状态,Insert:插入;Update:更新;Get:获取;Load:导入;Delete:删除;Down:完成;
        std::string mKeyPointsGeo = opt->GetConfigValueByKey("KeyPointsGeo");//关键点坐标
        //关键点信息(包含参数),参数以":"划分,格式如下
        //类型:x坐标,y坐标,z坐标:方位角,俯仰角,视距:速度:加速度:插值半径:抬高;
        std::string mKeyPoints = opt->GetConfigValueByKey("KeyPoints");                               
    }
    //播放中事件
    if((DataSourceTypeName == "dynamicpath") && (layerType == 3))
    {
        std::string mCurrentLinearPos = opt->GetConfigValueByKey("CurrentLinearPos");//当前路径行驶的位置
        std::string mPassKeyPointIndex = opt->GetConfigValueByKey("PassKeyPointIndex");//已通过的关键点索引
        std::string mIsPlayForward = opt->GetConfigValueByKey("IsPlayForward");//是否为正向行驶
        std::string mRealTimePositionGeo = opt->GetConfigValueByKey("RealTimePositionGeo"); //路径行驶的实时位置(经纬-高程)
        std::string mPlayState = opt->GetConfigValueByKey("PlayState");//播放状态
        int iPassIndex = atoi(mPassKeyPointIndex.c_str());
        if(iPassIndex==0)
        {
            mKeyPointIndex=1;
        }
        //路径播放中返回
        if(iPassIndex==mKeyPointIndex)
        {
            mKeyPointIndex++;
            std::cout << "当前行驶到第" << mPassKeyPointIndex.c_str() << "个关键点.\n是否为正向:" << mIsPlayForward.c_str() << 
                ";实时位置坐标:" << mRealTimePositionGeo.c_str() << std::endl;
        }
    }
}

void Cf4c5DynamicPathDlg::FireOnLButtonUpVpsdkctrl1(short xPos, short yPos)
{
    CoordinateSystemCOMLib::ITransformatePtr transformate = map->CreateTransformation();
    BaseObjectCOMLib::IPositionPtr destPos = transformate->ScreenPosToWorldPos(xPos, yPos);//将屏幕坐标点转换成经纬度坐标
    if(bIsFindTransformation)
    {
        std::stringstream streamX,streamY,streamZ;
        streamX << destPos->GetX();
        streamY << destPos->GetY();;
        streamZ << destPos->GetZ();
        myPosInput = streamX.str() + "," + streamY.str() + "," + streamZ.str() + ";";
        _bstr_t t = myPosInput.c_str();
        PosInputEdit.SetWindowText(t);
    }
}

void  Cf4c5DynamicPathDlg::SplitString(const std::string& s,std::vector<std::string>& v,const std::string& c)
{
    std::string::size_type pos1,pos2;
    pos2 = s.find(c);
    pos1 = 0;
    while(std::string::npos !=pos2)
    {
        v.push_back(s.substr(pos1,pos2-pos1));
        pos1 = pos2 + c.size();
        pos2= s.find(c,pos1);
    }
    if(pos1 !=s.length())
    {
        v.push_back(s.substr(pos1));
    }
}

C#调用

ILayerObject dynamicPathLayer;//路径图层
string SelectIndex;
int mKeyPointIndex = 0;
double speed = 30;
string gModelDeviceFolderPath = "E:\data\LocalData\Other\models";
private void axVPSDKCtrl1_FireOnLayerNotify(object sender, AxSDKCtrlLib._IVPSDKCtrlEvents_FireOnLayerNotifyEvent e)
{
    var opt = dynamicPathLayer.GetLayerResult();
    SelectIndex = opt.GetConfigValueByKey("CurrentKeyPointIndex"); //获取拾取的关键点索引
    if ((opt.GetConfigValueByKey("DataSourceTypeName") == "dynamicpath") && (e.layerType == 2))
    {
        var mEditState = opt.GetConfigValueByKey("EditState");//编辑状态,Insert:插入;Update:更新;Get:获取;Load:导入;Delete:删除;Down:完成;
        var mKeyPointsGeo = opt.GetConfigValueByKey("KeyPointsGeo");//关键点坐标
        //关键点信息(包含参数),参数以":"划分,格式如下
        //类型:x坐标,y坐标,z坐标:方位角,俯仰角,视距:速度:加速度:插值半径:抬高;
        var mKeyPoints = opt.GetConfigValueByKey("KeyPoints");
        MessageBox.Show("关键点坐标:" + mKeyPointsGeo + "; 关键点信息:" + mKeyPoints + ";编辑状态:" + mEditState);
    }
    //播放中事件
    if ((opt.GetConfigValueByKey("DataSourceTypeName") == "dynamicpath") && (e.layerType == 3))
    {
        string mCurrentLinearPos = opt.GetConfigValueByKey("CurrentLinearPos");//当前路径行驶的位置
        string mPassKeyPointIndex = opt.GetConfigValueByKey("PassKeyPointIndex");//已通过的关键点索引
        string mIsPlayForward = opt.GetConfigValueByKey("IsPlayForward");//是否为正向行驶
        string mRealTimePositionGeo = opt.GetConfigValueByKey("RealTimePositionGeo"); //路径行驶的实时位置(经纬-高程)
        string mPlayState = opt.GetConfigValueByKey("PlayState");//播放状态
        if (mPassKeyPointIndex == "0")
        {
            mKeyPointIndex = 1;
        }
        //路径播放中返回
        if (mPassKeyPointIndex == mKeyPointIndex.ToString())
        {
            mKeyPointIndex++;
            MessageBox.Show("当前行驶到第" + mPassKeyPointIndex + "个关键点" + "\n行驶位置:" + mCurrentLinearPos + ";是否为正向:" + mIsPlayForward + ";实时位置坐标:" + mRealTimePositionGeo);

        }
    }
}
//*************************************************************************
//1.图层对象操作
//*************************************************************************
//创建动态路径图层
private void createDynamicPathLayer_Click(object sender, EventArgs e)
{
    if (dynamicPathLayer == null)
    {
        var tlo = map.CreateLayerOptions("");//创建路径动画图层配置,给配置起个名称,任意名称
        tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//创建配置类型,
        tlo.AddConfig("Url", gModelDeviceFolderPath+"/car.wrl"); //配置的动画的模型
        tlo.AddConfig("NodeXScale", "0.5");//模型x轴缩放大小
        tlo.AddConfig("NodeYScale", "0.5");//模型Y轴缩放大小
        tlo.AddConfig("NodeZScale", "0.5");//模型Z轴缩放大小
        tlo.AddConfig("ModelRoll", "0");//模型x轴旋转量
        tlo.AddConfig("ModelPitch", "3.116");//模型Y轴旋转量
        tlo.AddConfig("ModelHeading", "0");//模型Z轴旋转量

        tlo.AddConfig("PlayerMode", "PLAYER_ONEWAY");//播放模式. PLAYER_ONEWAY-播放一次; PLAYER_ONEWAY_LOOP-循环播放;  PLAYER_ROUND_LOOP-往返播放; PLAYER_ONEWAY_STAY-实时播放
        tlo.AddConfig("PlayerState", "PLAYER_STOP");//播放状态. PLAYER_PLAY-播放; PLAYER_PAUSE-暂停; PLAYER_STOP停止
        tlo.AddConfig("ViewObjectMode", "0,0,1");//设置视角对象;视角对象的格式为"水平方位角,垂直俯仰角,视点到关键点距离"
        tlo.AddConfig("Velocity","30");//速度. 单位m/s
        tlo.AddConfig("Accelerator", "0.0");//加速度. 单位m/s,加速度大于0会进行加速行驶
        tlo.AddConfig("CornerSpeedScale", "0.5");//转角速度比例(0-1之间)
        tlo.AddConfig("LineWidth", "2.0");//线宽(0-10)
        tlo.AddConfig("LineStipple", "-1");//线样式
        tlo.AddConfig("LineColor", "1.0,1.0,0.0,1");//路径线颜色
        tlo.AddConfig("Radius", "3.0");//拐弯处平滑半径(圆角)
        tlo.AddConfig("KeyPoints", "120.219652381,30.2102796597,14.8471973008;120.219228677,30.2109204111,14.7999731209;120.219066611,30.2109525583,14.7999699935;120.218700324,30.2108002945,14.799943476;120.218728451,30.2106748092,14.7999742515;120.218952979,30.2100989073,14.7999547897;120.219026376,30.2098925768,14.799970909;120.218995824,30.2098632529,14.8299724646;120.218730274,30.2097854181,14.7999352217;");//输入关键点列表        
        tlo.AddConfig("InterpLineWidth", "2.0");//差值线线宽
        tlo.AddConfig("InterpLineStipple", "500");//差值线线样式
        tlo.AddConfig("InterpLineColor", "1.0,1.0,1.0,1.0");//差值线颜色,不需要差值线去掉颜色
        tlo.AddConfig("KeyPointLiftUp", "0"); //关键点抬高
        tlo.AddConfig("PlayAsKeyPoint", "false");//播放类型。true-以关键点参数进行播放;false-以路径参数进行播放
        tlo.AddConfig("IsSwerveControl", "true");//是否弯道减速,需配合CornerSpeedScale来使用
        tlo.AddConfig("NodeActive", "true");//跟随移动状态。true-跟随移动;false-不跟随
        dynamicPathLayer = map.CreateLayer("DynamicPathLayer", tlo);//创建路径图层
        map.AddLayer(dynamicPathLayer);//添加图层
        dynamicPathLayer.AddObserver();//添加路径图层监视
    }
    else
    {
        MessageBox.Show("图层已创建,请勿重复创建!");
    }
}
//创建动态路径图层无关键点
private void createDynamicPathLayerNoPoint_Click(object sender, EventArgs e)
{
    if (dynamicPathLayer == null)
    {
        var tlo = map.CreateLayerOptions("");//创建路径动画图层配置,给配置起个名称,任意名称
        tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//创建配置类型,
        tlo.AddConfig("Url", "http://192.168.1.50:8088/files/car.wrl"); //配置的动画的模型
        tlo.AddConfig("NodeXScale", "0.5");//模型x轴缩放大小
        tlo.AddConfig("NodeYScale", "0.5");//模型Y轴缩放大小
        tlo.AddConfig("NodeZScale", "0.5");//模型Z轴缩放大小
        tlo.AddConfig("ModelRoll", "0");//模型x轴旋转量
        tlo.AddConfig("ModelPitch", "3.116");//模型Y轴旋转量
        tlo.AddConfig("ModelHeading", "0");//模型Z轴旋转量

        tlo.AddConfig("PlayerMode", "PLAYER_ONEWAY");//播放模式. PLAYER_ONEWAY-播放一次; PLAYER_ONEWAY_LOOP-循环播放;  PLAYER_ROUND_LOOP-往返播放; PLAYER_ONEWAY_STAY-实时播放
        tlo.AddConfig("PlayerState", "PLAYER_STOP");//播放状态. PLAYER_PLAY-播放; PLAYER_PAUSE-暂停; PLAYER_STOP停止
        tlo.AddConfig("ViewObjectMode", "0,0,1");//设置视角对象;视角对象的格式为"水平方位角,垂直俯仰角,视点到关键点距离"
        tlo.AddConfig("Velocity", "30");//速度. 单位m/s
        tlo.AddConfig("Accelerator", "0.0");//加速度. 单位m/s,加速度大于0会进行加速行驶
        tlo.AddConfig("CornerSpeedScale", "0.5");//转角速度比例(0-1之间)
        tlo.AddConfig("LineWidth", "2.0");//线宽(0-10)
        tlo.AddConfig("LineStipple", "-1");//线样式
        tlo.AddConfig("LineColor", "1.0,1.0,0.0,1");//路径线颜色
        tlo.AddConfig("Radius", "3.0");//拐弯处平滑半径(圆角)
        tlo.AddConfig("InterpLineWidth", "2.0");//差值线线宽
        tlo.AddConfig("InterpLineStipple", "500");//差值线线样式
        tlo.AddConfig("InterpLineColor", "1.0,1.0,1.0,1.0");//差值线颜色,不需要差值线去掉颜色
        tlo.AddConfig("KeyPointLiftUp", "0"); //关键点抬高
        tlo.AddConfig("PlayAsKeyPoint", "false");//播放类型。true-以关键点参数进行播放;false-以路径参数进行播放
        tlo.AddConfig("IsSwerveControl", "true");//是否弯道减速,需配合CornerSpeedScale来使用
        tlo.AddConfig("NodeActive", "true");//跟随移动状态。true-跟随移动;false-不跟随
        dynamicPathLayer = map.CreateLayer("DynamicPathLayer", tlo);//创建路径图层
        map.AddLayer(dynamicPathLayer);//添加图层
        dynamicPathLayer.AddObserver();//添加路径图层监视
    }
    else
    {
        MessageBox.Show("图层已创建,请勿重复创建!");
    }
}
//删除动态路径图层
private void RemoveDynamicPathLayer_Click(object sender, EventArgs e)
{
    if (dynamicPathLayer!=null)
    {
        map.RemoveLayer(dynamicPathLayer);//移除图层
        dynamicPathLayer = null;
    }
    else
    {
        MessageBox.Show("图层为空,无需移除!");
    }
}
//路径序列化
private void PathSerializer_Click(object sender, EventArgs e)
{
    dynamicPathLayer.SerializeLayer("E:\\Test\\path.xml");//序列化路径图层
}
//路径反序列化
private void PathDeserializer_Click(object sender, EventArgs e)
{
    dynamicPathLayer = map.DeserializeLayer("E:\\Test\\path.xml");//反序列化路径图层
}

//*************************************************************************
//2.关键点编辑
//*************************************************************************
//OperationName代表对关键点的更新操作类型,可选值为
//InsertKeyPoints - 插入关键点
//UpdateKeyPoints - 更新关键点
//GetKeyPoint     - 获取关键点
//DeleteKeyPoint  - 删除关键点    
//获取关键点索引
private void AddOption_Click(object sender, EventArgs e)
{
    comboBox1.Items.Clear();
    var opt = dynamicPathLayer.GetLayerResult();
    var index = opt.GetConfigValueByKey("KeyPointSize");//获取关键点的个数
    for (int i = 0; i < Convert.ToInt32(index); ++i)
    {
        comboBox1.Items.Add(i.ToString());
    }
}
//获取对应索引的关键点信息
private void FindDynamicPathPointByIndex_Click(object sender, EventArgs e)
{
    Console.WriteLine("Text:" + comboBox1.SelectedItem.ToString());
    if (dynamicPathLayer!=null)
    {
        var tlo = map.CreateLayerOptions("");//创建图层配置对象,任意名称
        tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
        tlo.AddConfig("OperationName", "GetKeyPoint");//更新操作类型
        tlo.AddConfig("KeyPointIndex", comboBox1.SelectedItem.ToString());//将对应关键点的索引传入
        dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游
        var opt = dynamicPathLayer.GetLayerResult();//获取图层结果
        var KeyPointValue = opt.GetConfigValueByKey("CurrentKeyPoint");//获取索引对应的关键点信息

        var KeyPoint = KeyPointValue.Split(':');//将获取的信息以:划分
        textBox1.Text = KeyPoint[1];
        textBox2.Text = KeyPoint[2];
        textBox3.Text = KeyPoint[3];
        textBox4.Text = KeyPoint[4];
        textBox5.Text = KeyPoint[5];
        textBox6.Text = KeyPoint[6].Substring(0, KeyPoint[6].IndexOf(";"));
    }
    else
    {
        MessageBox.Show("图层为空,获取信息失败!");
    }
}
//开关鼠标获取坐标信息
bool bIsFindTransformation = false;
private void FindTransformation_Click(object sender, EventArgs e)
{
    bIsFindTransformation = !bIsFindTransformation;
}
//在对应索引的点前增加关键点
private void AddDynamicPathPointByIndex_Click(object sender, EventArgs e)
{
    Console.WriteLine("Text:" + comboBox1.SelectedItem.ToString());
    var tlo = map.CreateLayerOptions("");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo.AddConfig("OperationName", "InsertKeyPoints"); //插入关键点
    tlo.AddConfig("KeyPointIndex", comboBox1.SelectedItem.ToString()); //新增关键点会添加在该序号的点之前,-1代表添加在末尾
    if (textBox1.Text!=null)//如果未设置坐标参数,则不更新
    {
        tlo.AddConfig("KeyPoints", textBox1.Text + ";");//插入的关键点坐标,最后一位必须为;
    }
    else
    {
        return;
    }
    //可设关键点自身参数,如果不设置,则默认使用图层参数
    if (textBox2.Text!=null)//如果设置了参数
    {
        tlo.AddConfig("ViewObjectMode", textBox2.Text);//设置视角
    }
    if (textBox3.Text != null)//如果设置了参数
    {
        tlo.AddConfig("Velocity", textBox3.Text);//速度 单位m/s
    }
    if (textBox4.Text!=null)//如果设置了参数
    {
        tlo.AddConfig("Accelerator", textBox4.Text);//加速度 单位m/s,加速度大于0会进行加速行驶
    }
    if (textBox5.Text != null)//如果设置了参数
    {
        tlo.AddConfig("Radius", textBox5.Text);//拐弯处平滑半径(圆角)
    }
    if (textBox6.Text != null)//如果设置了参数
    {
        tlo.AddConfig("KeyPointLiftUp", textBox6.Text);//对于关键点抬高
    }
    dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游
}
//更换对应索引的关键点参数
private void UpdateDynamicPathPointByIndex_Click(object sender, EventArgs e)
{
    Console.WriteLine("Text:" + comboBox1.SelectedItem.ToString());
    var tlo = map.CreateLayerOptions("");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo.AddConfig("OperationName", "UpdateKeyPoints");//对关键点进行更新
    tlo.AddConfig("KeyPointIndex", comboBox1.SelectedItem.ToString());  //更新对应索引的关键点
    //可设关键点自身参数,如果不设置,则默认使用图层参数
    if (textBox2.Text != null)//如果设置了参数
    {
        tlo.AddConfig("ViewObjectMode", textBox2.Text);//设置视角
    }
    if (textBox3.Text != null)//如果设置了参数
    {
        tlo.AddConfig("Velocity", textBox3.Text);//速度 单位m/s
    }
    if (textBox4.Text != null)//如果设置了参数
    {
        tlo.AddConfig("Accelerator", textBox4.Text);//加速度 单位m/s,加速度大于0会进行加速行驶
    }
    if (textBox5.Text != null)//如果设置了参数
    {
        tlo.AddConfig("Radius", textBox5.Text);//拐弯处平滑半径(圆角)
    }
    if (textBox6.Text != null)//如果设置了参数
    {
        tlo.AddConfig("KeyPointLiftUp", textBox6.Text);//对于关键点抬高
    }
    dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游    
}
//删除对应索引的关键点
private void DeleteDynamicPathPointByIndex_Click(object sender, EventArgs e)
{
    Console.WriteLine("Text:" + comboBox1.SelectedItem.ToString());
    var tlo = map.CreateLayerOptions("");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo.AddConfig("OperationName", "DeleteKeyPoint");//删除关键点
    tlo.AddConfig("KeyPointIndex", comboBox1.SelectedItem.ToString());//删除该索引的关键点
    dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游    
}
//末尾追加关键点,以下配置要对添加的关键点生效,PlayAsKeyPoint必须为true
private void LoadDynamicPathPoint_Click(object sender, EventArgs e)
{
    var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo.AddConfig("OperationName", "InsertKeyPoints");//插入关键点
    tlo.AddConfig("KeyPointIndex", "-1");//插入关键点,-1代表在末尾
    tlo.AddConfig("KeyPoints", "120.218982652,30.211800004,14.7999729766;");//插入的关键点坐标,最后一位必须为;
    tlo.AddConfig("ViewObjectMode", "0.0,-0.708,20.0");//设置视角对象;视角对象的格式为"水平方位角,垂直俯仰角,视点到关键点距离"
    tlo.AddConfig("Velocity", "5.0"); //速度 单位m/s
    tlo.AddConfig("Accelerator", "1.0");//加速度 单位m/s,加速度大于0会进行加速行驶
    tlo.AddConfig("KeyPointLiftUp", "0.0");//对于关键点抬高
    dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游    
}
//*************************************************************************
//3.场景控制关键点编辑:
//*************************************************************************    
//EditType代表内部响应器编辑操作,可选值为
//ADD    - 添加操作
//SELECT - 拾取操作
//MOVE   - 移动操作
//NONE   - 关闭响应器操作

//EditObject代表编辑对象
//POINT - 编辑关键点
//PATH - 整体编辑
//开启响应器添加关键点
private void AddDynamicPathPoint_Click(object sender, EventArgs e)
{
    var tlo = map.CreateLayerOptions("");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo.AddConfig("EditType", "ADD");  // //将响应器编辑状态改为添加
    dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游    
}
//拾取关键点
private void SelectDynamicPathPoint_Click(object sender, EventArgs e)
{
    var tlo = map.CreateLayerOptions("");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo.AddConfig("EditType", "SELECT");//将响应器编辑状态改为拾取
    dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游    
}
//更新关键点
private void UpdateDynamicPathPoint_Click(object sender, EventArgs e)
{
    if (SelectIndex !=null)
    {
        var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
        tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
        tlo.AddConfig("OperationName", "UpdateKeyPoints");//对关键点进行更新
        tlo.AddConfig("KeyPointIndex", SelectIndex);  //新增关键点会添加在该序号的点之前,-1代表添加在末尾
        tlo.AddConfig("ViewObjectMode", "0.0,-0.708,200.0");//设置视角对象;视角对象的格式为"水平方位角,垂直俯仰角,视点到关键点距离"
        tlo.AddConfig("Velocity", "15.0"); ///速度 单位m/s
        tlo.AddConfig("KeyPointLiftUp", "5.0"); ///对于关键点抬高
        dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游    
    }        
}
//移动拾取的关键点
private void MoveDynamicPathPoint_Click(object sender, EventArgs e)
{
    var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo.AddConfig("EditType", "MOVE");  //将响应器编辑状态改为移动
    dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游
}
//删除拾取的关键点
private void DeleteDynamicPathPoint_Click(object sender, EventArgs e)
{
    if (SelectIndex!=null)
    {
        var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
        tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
        tlo.AddConfig("OperationName", "DeleteKeyPoint"); //设置对关键点的删除
        tlo.AddConfig("KeyPointIndex", SelectIndex);  //删除对应索引的点
        dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游
        SelectIndex = null;
    }
}
//整体编辑
private void EditPath_Click(object sender, EventArgs e)
{
    var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo.AddConfig("EditObject", "PATH"); //编辑对象。 PATH-整体编辑    
    dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游
}
//关键点编辑
private void EditPoint_Click(object sender, EventArgs e)
{
    var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo.AddConfig("EditObject", "POINT"); //编辑对象。 POINT-单个关键点编辑    ,默认值为 POINT
    dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游
}
//关闭路径编辑状态
private void CloseDynamicPathResponser_Click(object sender, EventArgs e)
{
    var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    tlo.AddConfig("EditType", "NONE");//将响应器编辑状态关闭
    dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游
    SelectIndex = null;
}
//*************************************************************************
//4.播放控制:
//*************************************************************************
//切换播放类型
bool IsPlayAsKeyPoint = false;
private void UpdatePlayAsKeyPoint_Click(object sender, EventArgs e)
{
    var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
    if (IsPlayAsKeyPoint)
    {
        tlo.AddConfig("PlayAsKeyPoint", "false");//播放类型。true-以关键点参数进行播放;false-以路径参数进行播放
        IsPlayAsKeyPoint = false;
        MessageBox.Show("当前以路径参数进行播放");
    }
    else
    {
        tlo.AddConfig("PlayAsKeyPoint", "true");//播放类型。true-以关键点参数进行播放;false-以路径参数进行播放
        IsPlayAsKeyPoint = true;
        MessageBox.Show("当前以关键点参数进行播放");
    }
    dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游    
}
//切换跟随移动状态
bool bIsFollow;
private void UpdateNodeActive_Click(object sender, EventArgs e)
{
    if (dynamicPathLayer!=null)
    {
        var tlo = map.CreateLayerOptions("");//创建图层配置对象,任意名称
        tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
        tlo.AddConfig("NodeActive", (bIsFollow = !bIsFollow).ToString());//跟随移动状态
        dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游    
    }
    else
    {
        MessageBox.Show("图层为空,无法切换");
    }
}
//显隐动态路径
bool bIsVisible;
private void SetVisibleRoamPath_Click(object sender, EventArgs e)
{
    if (dynamicPathLayer!=null)
    {
        dynamicPathLayer.SetVisible(bIsVisible = !bIsVisible);//修改路径线显隐
    }
    else
    {
        MessageBox.Show("图层为空,无法显隐");
    }
}
//播放
private void Play_Click(object sender, EventArgs e)
{
    if (dynamicPathLayer!=null)
    {
        var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
        tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
        tlo.AddConfig("PlayerState", "PLAYER_PLAY");//设置播放状态
        dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游    
    }
    else
    {
        MessageBox.Show("图层为空,无法播放!");
    }

}
//暂停
private void Pause_Click(object sender, EventArgs e)
{
    if (dynamicPathLayer!=null)
    {
        var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
        tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
        tlo.AddConfig("PlayerState", "PLAYER_PAUSE");//设置播放状态
        dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游    
    }
    else
    {
        MessageBox.Show("图层为空,无法暂停!");
    }
}
//停止
private void Stop_Click(object sender, EventArgs e)
{
    if (dynamicPathLayer!=null)
    {
        var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
        tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
        tlo.AddConfig("PlayerState", "PLAYER_STOP");//设置播放状态
        dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游    
    }
    else
    {
        MessageBox.Show("图层为空,无法停止!");
    }
}
//加速
private void Accelerate_Click(object sender, EventArgs e)
{
    if (dynamicPathLayer!=null)
    {
        speed += 5;
        var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
        tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
        tlo.AddConfig("Velocity", speed.ToString());//速度
        dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游    
    }
    else
    {
        MessageBox.Show("图层为空,无法加速!");
    }
}
//减速
private void SlowDown_Click(object sender, EventArgs e)
{
    if (dynamicPathLayer!=null)
    {
        speed -= 5;
        if (speed < 0)
        {
            speed = 1;
        }
        var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
        tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
        tlo.AddConfig("Velocity", speed.ToString());//速度
        dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游    
    }
    else
    {
        MessageBox.Show("图层为空,无法减速!");
    }
}
//恢复速度
private void Restore_Click(object sender, EventArgs e)
{
    if (dynamicPathLayer!=null)
    {
        speed = 30;
        var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
        tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions");//图层配置对象名称, DynamicPathLayerOptions代表路径图层配置
        tlo.AddConfig("Velocity", speed.ToString());//速度
        dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游
    }
    else
    {
        MessageBox.Show("图层为空,无法恢复速度!");
    }
}
//左视 ,PlayAsKeyPoint必须为false
private void LeftView_Click(object sender, EventArgs e)
{
    var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions"); //动态路径配置信息 必须为DynamicPathLayerOptions
    tlo.AddConfig("ViewObjectMode", "1.57,-0.708,100.0"); //设置视角对象;视角对象的格式为"水平方位角,垂直俯仰角,视点到关键点距离"
    dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游
}
//右视 ,PlayAsKeyPoint必须为false
private void RightView_Click(object sender, EventArgs e)
{
    var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions"); //动态路径配置信息 必须为DynamicPathLayerOptions
    tlo.AddConfig("ViewObjectMode", "4.71,-0.708,100.0");//设置视角对象;视角对象的格式为"水平方位角,垂直俯仰角,视点到关键点距离"
    dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游
}
//上视 ,PlayAsKeyPoint必须为false
private void UpView_Click(object sender, EventArgs e)
{
    var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions"); //动态路径配置信息 必须为DynamicPathLayerOptions
    tlo.AddConfig("ViewObjectMode", "0,-1.57,100.0");//设置视角对象;视角对象的格式为"水平方位角,垂直俯仰角,视点到关键点距离"
    dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游
}
//前视 ,PlayAsKeyPoint必须为false
private void FrontView_Click(object sender, EventArgs e)
{
    var tlo = map.CreateLayerOptions("dynamicpathlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions"); //动态路径配置信息 必须为DynamicPathLayerOptions
    tlo.AddConfig("ViewObjectMode", "3.14,-0.708,100.0");//设置视角对象;视角对象的格式为"水平方位角,垂直俯仰角,视点到关键点距离"
    dynamicPathLayer.UpdateLayerOptions(tlo);//更新路径漫游
}
//后视 ,PlayAsKeyPoint必须为false
private void BackView_Click(object sender, EventArgs e)
{
    var tlo = map.CreateLayerOptions("dynamicpathlayer");
    tlo.AddConfig("LayerOptionsName", "DynamicPathLayerOptions"); //动态路径配置信息 必须为DynamicPathLayerOptions
    tlo.AddConfig("ViewObjectMode", "0,-0.708,100.0");//设置视角对象;视角对象的格式为"水平方位角,垂直俯仰角,视点到关键点距离"
    dynamicPathLayer.UpdateLayerOptions(tlo);
}

private void axVPSDKCtrl1_FireOnLButtonUp(object sender, AxSDKCtrlLib._IVPSDKCtrlEvents_FireOnLButtonUpEvent e)
{
    var transformate = map.CreateTransformation();
    var destPos = transformate.ScreenPosToWorldPos(e.xPos, e.yPos);//将屏幕坐标点转换成经纬度坐标
    if (bIsFindTransformation)
    {
        textBox1.Text = destPos.GetX() + "," + destPos.GetY() + "," + destPos.GetZ() + ";";
    }
    //console.log(destPos.GetX() + "," + destPos.GetY() + "," + destPos.GetZ() + ";");
}

results matching ""

    No results matching ""