2.7.9 分屏


分屏

分屏是将三维场景进行多屏展示的功能。每个子屏都会独立渲染自身加载的数据,通过分屏功能,可以在同一位置加载不同数据进行数据对比,同时也可以进行分屏联动效果展示。

在使用分屏功能时,需要了解几个分屏相关的功能,分别是:坐标参考系、分屏窗口操作和分屏联动功能。

下图是分屏效果:

  

1.坐标参考系

三维场景中的所有元素相对于参考球都会有一套坐标来指定其所在位置的,而这个坐标是在某个坐标参考系里的坐标。比如常见的WGS84、CGCS2000坐标系。因此在创建窗口时需要指定该窗口的坐标参考系。

CooRun SDK默认使用的是WGS84坐标(epsg:4326),在创建分屏时,可以新建坐标参考系,也可以使用默认的坐标参考系。

在使用默认坐标参考系创建分屏窗口时,加载的地形影像数据是共享的,也可以做到模型数据的共享(只需要将已经创建的模型图层对象添加到新的窗口对象中)。在数据共享时,数据只占用一份内存。

在使用新建坐标参考系创建分屏窗口时,新窗口中的数据必须重新创建加载。

注意:如无特殊需求,建议使用默认的坐标参考系来创建分屏窗口。

参数说明

坐标参考系可配置的参数如下表所示:

配置项 配置说明 值类型 备注
SrsInitString 坐标系名称 string 坐标系名称
CoordSysType 坐标系类型 double 坐标系类型。0-地心坐标系(球面坐标系)
TileRangeFactor 地形影像调度缩放比例 float 地形影像调度缩放比例.一般设为2.0-20.0之间,在同一高度时,越大地形影像越清晰,但是调度数据越多,默认值为5.0
MinLongitude 最小经度 double 三维场景最小经度值
MaxLongitude 最大经度 double 三维场景最大经度值
MinLatitude 最小纬度 double 三维场景最小纬度值
MaxLatitude 最大纬度 double 三维场景最大纬度值
MaxExtent 包围盒最大值 x,y,z 三维场景包围盒最大值
MinExtent 包围盒最小值 x,y,z 三维场景包围盒最小值

2.窗口对象

窗口对象是用来控制分屏窗口的创建、更新和销毁等操作的对象。分屏时可以创建多个窗口对象进行显示,并且可以通过窗口对象更新每个窗口的显示位置和大小比例,以达到窗口横向、纵向平铺、四方格、九宫格等效果。

参数说明

窗口对象可配置的参数如下表所示:

配置项 配置说明 值类型 备注
CameraName 窗口相机名称 string 窗口相机名称
RenderOrder 绘制顺序 int 窗口绘制顺序
IsOrtho 是否正交投影 bool 窗口相机是否正交投影。true-正交投影;false-透视投影。默认false
Aspect 相机宽高比 double 相机宽高比
Fovy 相机视野角度 double 相机视野角度
ZNear 相机近截面距离 double 相机近截面距离
ZFar 相机远截面距离 double 相机远截面距离
ClearFlagColor 相机背景颜色 x,y,z,w 相机背景颜色(天空盒)。该参数与ClearFlagFilePath互斥
ClearFlagFilePath 相机背景纹理 string 相机背景纹理。该参数与ClearFlagColor互斥
ViewPort 相机视口大小 x,y,w,h 相机视口大小。用百分比表示。4个参数分别代表:x轴起始点比例,y轴起始点比例,宽度比例、高度比例
Eye 相机初始观察点 x,y,z 相机初始观察点。一般不需要改动
Center 相机初始目标点 x,y,z 相机初始目标点。一般不需要改动
Up 相机初始上方向 x,y,z 窗口初始上方向,一般不改动

3.分屏联动

分屏联动是指在创建分屏窗口后,当改变任一窗口观察视角,其他窗口也跟随移动。分屏联动是通过更新操作实现的。

参数说明

分屏联动可配置的参数如下表所示:

配置项 配置说明 值类型 备注
OptionsTypeName 更新操作类型名称 string LinkageOptions代表分屏联动配置
MapViewIdList 设置联动视口ID列表 int列表 联动视口ID列表.当传-1为所有的视口
IsLinkage 是否联动 bool 是否联动。true-联动;false-不联动。默认false
Rate 联动频率 int 联动频率。默认每5帧联动一次

代码调用示例

Javascript调用

var dataPath = obj.GetSDKPath().substring(0, obj.GetSDKPath().length - 4) + "\\data\\";//sdk data文件夹路径,存放默认文件用
var mv1;//窗口1
var mv2;//窗口2
var mvID;
var modelLayer = null;
var bVisible = true;
var distanceMeasure = null;

//添加O|O屏幕
function AddScreen(){
    //默认屏幕参数变化
    var mvCount = map.GetMapViewCount();
    mvID = map.GetMapViewIDByIndex(mvCount - 1);
    mv1 = map.GetMapViewByID(mvID);

    var mapviewDefOpt = map.CreateMapViewOptions();
    mapviewDefOpt.AddConfig("ViewPort", "0,0,0.5,1");//相机视口大小,4个值分别为x轴起点,y轴起点,宽度占比,高度占比,范围为0~1
    mv1.UpdateMapViewOptions(mapviewDefOpt);

    var mapviewOpt = map.CreateMapViewOptions();
    mapviewOpt.AddConfig("CameraName", "split1");//窗口名称
    mapviewOpt.AddConfig("RenderOrder", "2");//窗口绘制顺序
    mapviewOpt.AddConfig("IsOrtho", "false");//true正交投影 false透视投影,一般透视投影
    mapviewOpt.AddConfig("Aspect", "1");//宽高比
    mapviewOpt.AddConfig("Fovy", "35");//视野角度
    mapviewOpt.AddConfig("ZNear", "100");//近截面
    mapviewOpt.AddConfig("ZFar", "68000000");//远截面
    //mapviewOpt.AddConfig("ClearFlagFilePath", dataPath+"Skybox\\");//背景天空盒路径,与ClearFlagColor互斥
    mapviewOpt.AddConfig("ClearFlagColor", "1,0,0,1");//背景颜色,为RGBA,与ClearFlagColor互斥    
    mapviewOpt.AddConfig("ViewPort", "0.5,0,0.5,1");//相机视口大小,4个值分别为x轴起点,y轴起点,宽度占比,高度占比,范围为0~1
    mapviewOpt.AddConfig("Eye", "0,0,15");//窗口初始视点,一般不改动
    mapviewOpt.AddConfig("Center", "0,0,0");//窗口初始中心点,一般不改动
    mapviewOpt.AddConfig("Up", "0,1,0");//窗口初始上方向,一般不改动

    ///创建参考系(可选),可用默认的参考系,目前针对地形影像图层加载
    //var refOpt = map.CreateRefrenceSystemOptions();
    //refOpt.AddConfig("SrsInitString", "epsg:4326");//坐标参考系名称
    //refOpt.AddConfig("CoordSysType", "0");//坐标系类型,0-地心坐标系(球面坐标系)
    //refOpt.AddConfig("TileRangeFactor", "5.0");//地形影像调度缩放比例,一般设为2.0-20.0之间,在同一高度时,越大地形影像越清晰,但是调度数据越多,默认值为5.0
    //refOpt.AddConfig("MinLongitude", "-180");//最小经度
    //refOpt.AddConfig("MaxLongitude", "180");//最大经度
    //refOpt.AddConfig("MinLatitude", "-90");//最小纬度
    //refOpt.AddConfig("MaxLatitude", "90");//最大纬度
    //refOpt.AddConfig("MaxExtent", "1000,1000,1000");//包围盒最大值
    //refOpt.AddConfig("MinExtent", "0,0,0");//包围盒最小值
    //var refObj = map.CreateRefrenceSystem(refOpt);//使用创建的参考系
    var refObj = map.GetRefrenceSystem();//使用默认的参考系
    mv2 = map.CreateMapView(refObj, mapviewOpt);//根据参考系和窗口配置创建窗口对象
    SetScreen2();//设置当前操作窗口为mv2
    //LoadDefDom();//加载默认地球数据
}

function ModifyScreen(){
    var opt1 = map.CreateMapViewOptions();
    opt1.AddConfig("ViewPort", "0,0,1,0.5");//相机视口大小,4个值分别为x轴起点,y轴起点,宽度占比,高度占比,范围为0~1
    mv2.UpdateMapViewOptions(opt1);

    var opt2 = map.CreateMapViewOptions();
    opt2.AddConfig("ViewPort", "0,0.5,1,0.5");//相机视口大小,4个值分别为x轴起点,y轴起点,宽度占比,高度占比,范围为0~1
    mv1.UpdateMapViewOptions(opt2);
}

function ModifyScreen1(){
    var opt1 = map.CreateMapViewOptions();
    opt1.AddConfig("ViewPort", "0,0,0.5,1");//相机视口大小,4个值分别为x轴起点,y轴起点,宽度占比,高度占比,范围为0~1
    mv2.UpdateMapViewOptions(opt1);

    var opt2 = map.CreateMapViewOptions();
    opt2.AddConfig("ViewPort", "0.5,0,0.5,1");//相机视口大小,4个值分别为x轴起点,y轴起点,宽度占比,高度占比,范围为0~1
    mv1.UpdateMapViewOptions(opt2);
}

function SetScreen1(){
    map.SetCurrentMapViewID(mv1.GetMapViewID());//设置当前操作窗口
}

function SetScreen2(){
    map.SetCurrentMapViewID(mv2.GetMapViewID());//设置当前操作窗口
}

function RemoveScreen1(){
    if(mv1){
        map.DestroyMapView(mv1);//销毁窗口        
        var opt = map.CreateMapViewOptions();
        opt.AddConfig("ViewPort", "0,0,1,1");//相机视口大小,4个值分别为x轴起点,y轴起点,宽度占比,高度占比,范围为0~1
        mv2.UpdateMapViewOptions(opt);//更新窗口参数
        SetScreen2();
    }
}

function RemoveScreen2(){
    if(mv2){
        map.DestroyMapView(mv2);        
        var opt = map.CreateMapViewOptions();
        opt.AddConfig("ViewPort", "0,0,1,1");//相机视口大小,4个值分别为x轴起点,y轴起点,宽度占比,高度占比,范围为0~1
        mv1.UpdateMapViewOptions(opt);
        SetScreen1();
    }
}

function GetCount(){
    var mvCount = map.GetMapViewCount();//获取窗口个数
    alert(mvCount);
}

function GetIdByIndex(){
    var mvID = map.GetMapViewIDByIndex(1);//根据index获取窗口id
    alert(mvID);
}

function GetMapViewById(){
    var defMv = map.GetMapViewByID(1);//根据窗口id获取窗口对象
    alert(defMv);
}

function LoadDefDom(){
    var tlo = map.CreateLayerOptions("domlayer");//创建dom图层配置,任意名称
    tlo.AddConfig("LayerOptionsName", "ImageLayerOptions");//创建配置类型, ImageLayerOptions代表影像数据配置
    tlo.AddConfig("DataSourceTypeName", "mtd");//数据源类型,代表MTD插件
    tlo.AddConfig("Driver", "terrainquadtree");//代表地形驱动

    //以下部分可以通过图层信息获取获得相应的配置//
    tlo.AddConfig("Url", dataPath+"Earth\\DOM");//要加载的数据路径,此数据必须是通过MTD切割工具生成的数据,并且进行了网络发布
    tlo.AddConfig("Format", "png");//切割形成的数据格式
    tlo.AddConfig("Srs", "EPSG:4326");//数据的坐标参考
    tlo.AddConfig("MaxX", "180");//数据的范围X向最大值
    tlo.AddConfig("MinX", "-180");//数据的范围X向最小值
    tlo.AddConfig("MaxY", "90");//数据的范围Y向最大值
    tlo.AddConfig("MinY", "-90");//数据的范围Y向最小值
    tlo.AddConfig("TileSize", "256");//切割数据的瓦片大小,可以往小于256的方向设置,但绝对不能往大于256的方向设置,但最好用切割的大小设置,否则会影响效率
    tlo.AddConfig("MinLevel", "0");//数据显示的最小层级
    tlo.AddConfig("MaxLevel", "3");//数据显示的最大层级

    mtddomlayer = map.CreateLayer("ImageLayer", tlo);//创建DEM图层,第一项参数为ImageLayer
    map.AddLayer(mtddomlayer);//添加DOM图层
}

var operationPtr;//分屏联动更新操作对象
//创建联动
function CreateSync(){
    if(operationPtr)
    {
        RemoveSync();//移除联动
    }
    var tlo = map.CreateOperationOptions("LinkageOptions");//创建配置类型,操作类型的配置
    tlo.AddConfig("OptionsTypeName", "LinkageOptions");//设置更新操作类型名称
    tlo.AddConfig("MapViewIdList", "-1");//设置联动视口ID列表,当传-1为当前所有的视口
    tlo.AddConfig("IsLinkage", "true");//设置是否联动
    tlo.AddConfig("Rate", "1");//联动频率
    operationPtr = map.CreateOperation("LinkageOperation", tlo);//根据配置创建分屏联动操作
    map.AddOperation(operationPtr);     
}

var SyncState = true;
var iState;//是否联动
//更新联动
function UpdateSync() {
    if(SyncState) {
        SyncState = false;
        iState = "false";
    }
    else {
        SyncState = true;
        iState = "true";
    }
    var tlo = map.CreateOperationOptions("LinkageOptions");//创建配置类型,操作类型的配置
    tlo.AddConfig("OptionsTypeName", "LinkageOptions");//设置更新操作类型名称
    tlo.AddConfig("MapViewIdList", "-1");//设置联动视口ID列表,当传-1为当前所有的视口
    tlo.AddConfig("IsLinkage", iState);//设置是否联动
    tlo.AddConfig("Rate", 3);//联动频率
    operationPtr.UpdateOperationOptions(tlo);//根据配置更新分屏联动操作
}

//移除联动
function RemoveSync() { 
    if(operationPtr) {
        map.RemoveOperation(operationPtr);//移除更新对象
        operationPtr = null;
    }
}

//创建模型图层
function createModelLayer(){
    if(modelLayer == null){
        modelLayer = loadModelLayer(gModelPath, "true", true);
    }else{
        alert("请勿重复创建模型图层!");
    }
}
//显隐模型图层
function visibleModelLayer(){
    if(modelLayer){
        modelLayer.SetVisible(bVisible = !bVisible);//显隐图层
    }else{
        alert("无模型图层,无法显隐!");
    }
}
//定位图层
function locateModelLayer(){
    if(modelLayer){
        modelLayer.Locate();//定位图层
    }else{
        alert("无模型图层,无法定位!");
    }
}

//删除模型图层
function removeModelLayer(){
    if(modelLayer){
        map.RemoveLayer(modelLayer);//删除图层
        modelLayer = null;
        bVisible = true;
    }else{
        alert("无模型图层,无需移除!");
    }
}

//加载模型图层
function loadModelLayer(url, compress, isLocate){
    var tlo = map.CreateLayerOptions("modelOpt");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "ModelLayerOptions");//图层配置对象名称, ModelLayerOptions代表模型图层配置对象
    if(url.indexOf('http') === -1){//判断url是本地路径还是服务路径,以便调用不同数据源来加载
        tlo.AddConfig("DataSourceTypeName", "c3s");//数据源类型,c3s代表本地数据源
    }else{
        tlo.AddConfig("DataSourceTypeName", "c3ss");//数据源类型,c3ss代表服务数据源
    }
    tlo.AddConfig("Compress", compress);//是否压缩(根据数据实际情况设置)
    tlo.AddConfig("PriorityOffset","1.0");//结点调度优先级的偏移值
    tlo.AddConfig("VisualMaxRange", "5000");//最大显示距离。如不设或者设为0,将使用数据默认值
    tlo.AddConfig("IsHasTexture", "true");//是否有纹理,默认为true,该参数在进行分析时起效
    tlo.AddConfig("TextureLevel", "1"); //模型纹理层数,默认1层。该值在IsHasTexture为true时起效。
    tlo.AddConfig("EnableBlacklist","true");//黑名单机制开关,默认false关闭
    tlo.AddConfig("BlacklistUpdateTime","60");//黑名单请求间隔时长,以秒s为单位,默认为600s
    tlo.AddConfig("Url", url);//数据路径
    var modelLayer = map.CreateLayer("ModelLayer", tlo);//创建模型图层,第一项参数为ModelLayer
    map.AddLayer(modelLayer);//添加图层
    var id = modelLayer.GetLayerID();//该方法可以拿到图层对象的Id
    if(isLocate){
        //modelLayer.Locate();//图层定位
        //定位图层中心点。参数:水平旋转角(弧度)、垂直俯仰角(弧度)、距离、飞行时间。
        modelLayer.LocateToCenter(0, -0.25*3.14, 1000, 3);//定位图层中心点。
    }
    return modelLayer;
}
//创建三维距离测量
function createDistanceMeasure(){
    if(event == null){
        event = addEvent(obj, "FireOnLayerNotify", callBackFun);//返回值用于IE11版本事件移除
    }
    if(distanceMeasure == null){
        //创建图层配置信息
        var tlo = map.CreateLayerOptions("distanceMeasure");//创建图层配置对象,任意名称
        tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");//图层配置对象名称, AnalysisLayerOptions代表分析图层数据配置
        tlo.AddConfig("DataSourceTypeName", "as_distance");//数据源类型,as_distance代表距离测量
        tlo.AddConfig("PointColor", "0.0,0.0,1.0,1.0");//点颜色
        tlo.AddConfig("PointSize", "10");//点大小(0-10)
        tlo.AddConfig("DistanceMeasureLineColor", "0.8,0.0,0.0,1.0");//线颜色
        tlo.AddConfig("LineWidth", "2");//线宽(0-10)
        tlo.AddConfig("IsDepthTest","false");//是否开启深度测试。false不开启,结果会浮在场景上,true实际显示位置
        //tlo.AddConfig("NonIntersect","1,2");//非相交图层,1-分析,2-地形,3-模型,4-矢量(未贴地),5-矢量模板阴影体,6-矢量(贴地),7-倾斜摄影数据

        tlo.AddConfig("IsGuideLine","false");//辅助线开关
        tlo.AddConfig("GuideLineWidth","2");//辅助线的宽度
        tlo.AddConfig("GuideLineColor","1.0, 1.0, 0, 1.0");//辅助线颜色
        tlo.AddConfig("GuideLineStipple","5000");//辅助线类型-1为实线,1~65535为虚线

        //创建文字符号
        var pSymbol = map.CreateSymbol("AnalysisTextSymbol");//创建文字符号,分析文字为:AnalysisTextSymbol
        pSymbol.AddConfig("FillingColor", "0.93,0.93,0.93,1");//设置文字颜色(RGBA)
        pSymbol.AddConfig("Font", FontUrl);//文字字体路径,绝对路径
        pSymbol.AddConfig("Size", "40");//字体精度大小
        pSymbol.AddConfig("CharacterSize", "10");//文字大小
        pSymbol.AddConfig("CharacterMode", "1");//字符大小变化模式。0-随对象变化显示,1-随相机远近变化,2-随相机远近变化,同时不超过上限值
        pSymbol.AddConfig("AlignmentMode", "5");//文字对齐方式
        pSymbol.AddConfig("AxisAlignment", "6");//设置文字旋转模式。旋转轴0-7,6:自动
        pSymbol.AddConfig("RemoveDuplicateLabels", "false");//是否移除重复的标注            
        pSymbol.AddConfig("IsEmbolden", "false");//字体是否加粗
        pSymbol.AddConfig("IsTransform", "false");//字体是否为斜体
        pSymbol.AddConfig("IsUnderline", "false");//字体是否有下划线
        pSymbol.AddConfig("IsBack", "true");//是否设置背景色
        pSymbol.AddConfig("BackColor", "0.42,0.47,0.85,1");//背景颜色,IsBack为true有效
        pSymbol.AddConfig("FieldPrecision","2");//显示精度
        pSymbol.AddConfig("IsDepthTest","false");//是否开启深度测试。默认为true
        pSymbol.AddConfig("MeasureUnitType","0");//显示单位。0-米;1-公里;2-海里
        pSymbol.AddConfig("MeasureUnitLanguage","0");//显示语言。0-英文;1-中文
        pSymbol.AddConfig("CoordinateSystemType","0");//显示参考系。 0-地理经纬度;1-投影坐标;2-世界坐标系;3-地心空间直角坐标系XYZ
        //创建样式
        var pStyle = map.CreateStyle("Text");//创建样式
        pStyle.AddSymbol("AnalysisTextSymbol", pSymbol.GetConfig());//将符号对象添加到样式,第一参数为符号类型
        //将样式添加到图层配置里
        tlo.AddConfig("Style", pStyle.GetConfig());//添加样式
        distanceMeasure = map.CreateLayer("AnalysisLayer", tlo);//创建分析图层,第一项参数为AnalysisLayer
        distanceMeasure.AddObserver();//添加监听
        map.AddLayer(distanceMeasure);//添加图层
    }else{
        alert("请勿重复创建!");
    }
}

//删除三维距离测量
function removeDistanceMeasure(){
    if(distanceMeasure){
        map.RemoveLayer(distanceMeasure);//删除图层
        distanceMeasure = null;
    }else{
        alert("没有测量对象!");
    }
}

C++调用

BaseObjectCOMLib::IMapViewObjectPtr mv1;//窗口1
BaseObjectCOMLib::IMapViewObjectPtr mv2;//窗口2
long mvID;
BaseObjectCOMLib::IOperationObjectPtr operationPtr;//分屏操作对象
BaseObjectCOMLib::ILayerObjectPtr modelLayer;
//添加O|O屏幕
void CScreenDlg::OnBnClickedAddscreen()
{
    //默认屏幕参数变化
    long mvCount = map->GetMapViewCount();
    mvID = map->GetMapViewIDByIndex(mvCount - 1);
    mv1 = map->GetMapViewByID(mvID);

    ConfigOptionsCOMLib::IMapViewOptionsPtr mapviewDefOpt = map->CreateMapViewOptions();
    mapviewDefOpt->AddConfig("ViewPort", "0,0,0.5,1");//相机视口大小,4个值分别为x轴起点,y轴起点,宽度占比,高度占比,范围为0~1
    mv1->UpdateMapViewOptions(mapviewDefOpt);

    ConfigOptionsCOMLib::IMapViewOptionsPtr mapviewOpt = map->CreateMapViewOptions();
    mapviewOpt->AddConfig("CameraName", "split1");//窗口名称
    mapviewOpt->AddConfig("RenderOrder", "2");//窗口绘制顺序
    mapviewOpt->AddConfig("IsOrtho", "false");//true正交投影 false透视投影,一般透视投影
    mapviewOpt->AddConfig("Aspect", "1");//宽高比
    mapviewOpt->AddConfig("Fovy", "35");//视野角度
    mapviewOpt->AddConfig("ZNear", "100");//近截面
    mapviewOpt->AddConfig("ZFar", "68000000");//远截面
    //mapviewOpt->AddConfig("ClearFlagFilePath", dataPath+"Skybox\\");//背景天空盒路径,与ClearFlagColor互斥
    mapviewOpt->AddConfig("ClearFlagColor", "1,0,0,1");//背景颜色,为RGBA,与ClearFlagColor互斥    
    mapviewOpt->AddConfig("ViewPort", "0.5,0,0.5,1");//相机视口大小,4个值分别为x轴起点,y轴起点,宽度占比,高度占比,范围为0~1
    mapviewOpt->AddConfig("Eye", "0,0,15");//窗口初始视点,一般不改动
    mapviewOpt->AddConfig("Center", "0,0,0");//窗口初始中心点,一般不改动
    mapviewOpt->AddConfig("Up", "0,1,0");//窗口初始上方向,一般不改动

    ///创建参考系(可选),可用默认的参考系,目前针对地形影像图层加载
    //ConfigOptionsCOMLib::IRefrenceSystemOptionsPtr refOpt = map->CreateRefrenceSystemOptions();
    //refOpt->AddConfig("SrsInitString", "epsg:4326");//坐标参考系名称
    //refOpt->AddConfig("CoordSysType", "0");//坐标系类型,0-地心坐标系(球面坐标系)
    //refOpt->AddConfig("TileRangeFactor", "5.0");//地形影像调度缩放比例,一般设为2.0-20.0之间,在同一高度时,越大地形影像越清晰,但是调度数据越多,默认值为5.0
    //refOpt->AddConfig("MinLongitude", "-180");//最小经度
    //refOpt->AddConfig("MaxLongitude", "180");//最大经度
    //refOpt->AddConfig("MinLatitude", "-90");//最小纬度
    //refOpt->AddConfig("MaxLatitude", "90");//最大纬度
    //refOpt->AddConfig("MaxExtent", "1000,1000,1000");//包围盒最大值
    //refOpt->AddConfig("MinExtent", "0,0,0");//包围盒最小值
    //BaseObjectCOMLib::IRefrenceSystemPtr refObj = map->CreateRefrenceSystem(refOpt);//使用创建的参考系
    BaseObjectCOMLib::IRefrenceSystemPtr refObj = map->GetRefrenceSystem();//使用默认的参考系
    mv2 = map->CreateMapView(refObj, mapviewOpt);//根据参考系和窗口配置创建窗口对象
    OnBnClickedSetscreen2();//设置当前操作窗口为mv2
    //LoadDefDom();//加载默认地球数据
}

//修改O-O屏幕
void CScreenDlg::OnBnClickedModifyscreen()
{
    ConfigOptionsCOMLib::IMapViewOptionsPtr opt1 = map->CreateMapViewOptions();
    opt1->AddConfig("ViewPort", "0,0,1,0.5");//相机视口大小,4个值分别为x轴起点,y轴起点,宽度占比,高度占比,范围为0~1
    mv2->UpdateMapViewOptions(opt1);

    ConfigOptionsCOMLib::IMapViewOptionsPtr opt2 = map->CreateMapViewOptions();
    opt2->AddConfig("ViewPort", "0,0.5,1,0.5");//相机视口大小,4个值分别为x轴起点,y轴起点,宽度占比,高度占比,范围为0~1
    mv1->UpdateMapViewOptions(opt2);
}

//修改O|O屏幕
void CScreenDlg::OnBnClickedModifyscreen1()
{
    ConfigOptionsCOMLib::IMapViewOptionsPtr opt1 = map->CreateMapViewOptions();
    opt1->AddConfig("ViewPort", "0,0,0.5,1");//相机视口大小,4个值分别为x轴起点,y轴起点,宽度占比,高度占比,范围为0~1
    mv2->UpdateMapViewOptions(opt1);

    ConfigOptionsCOMLib::IMapViewOptionsPtr opt2 = map->CreateMapViewOptions();
    opt2->AddConfig("ViewPort", "0.5,0,0.5,1");//相机视口大小,4个值分别为x轴起点,y轴起点,宽度占比,高度占比,范围为0~1
    mv1->UpdateMapViewOptions(opt2);
}

//设置屏幕1
void CScreenDlg::OnBnClickedSetscreen1()
{
    map->SetCurrentMapViewID(mv1->GetMapViewID());//设置当前操作窗口
}

//设置屏幕2
void CScreenDlg::OnBnClickedSetscreen2()
{
    map->SetCurrentMapViewID(mv2->GetMapViewID());//设置当前操作窗口
}

//移除屏幕1
void CScreenDlg::OnBnClickedRemovescreen1()
{
    if(mv1){
        map->DestroyMapView(mv1);//销毁窗口        
        ConfigOptionsCOMLib::IMapViewOptionsPtr opt = map->CreateMapViewOptions();
        opt->AddConfig("ViewPort", "0,0,1,1");//相机视口大小,4个值分别为x轴起点,y轴起点,宽度占比,高度占比,范围为0~1
        mv2->UpdateMapViewOptions(opt);//更新窗口参数
        OnBnClickedSetscreen2();
    }
}

//移除屏幕2
void CScreenDlg::OnBnClickedRemovescreen2()
{
    if(mv2){
        map->DestroyMapView(mv2);        
        ConfigOptionsCOMLib::IMapViewOptionsPtr opt = map->CreateMapViewOptions();
        opt->AddConfig("ViewPort", "0,0,1,1");//相机视口大小,4个值分别为x轴起点,y轴起点,宽度占比,高度占比,范围为0~1
        mv1->UpdateMapViewOptions(opt);
        OnBnClickedSetscreen1();
    }
}

//获取窗口个数
void CScreenDlg::OnBnClickedGetcount()
{
    long mvCount = map->GetMapViewCount();//获取窗口个数
}

//根据index获取窗口id
void CScreenDlg::OnBnClickedGetidbyindex()
{
    long mvID = map->GetMapViewIDByIndex(1);//根据index获取窗口id
}

//根据窗口id获取窗口对象
void CScreenDlg::OnBnClickedGetmapviewbyid()
{
    BaseObjectCOMLib::IMapViewObjectPtr defMv = map->GetMapViewByID(1);//根据窗口id获取窗口对象
}

//开启联动

void CScreenDlg::OnBnClickedCreatesync()
{
    if(operationPtr)
    {
        OnBnClickedRemovesync();//移除联动
    }
    ConfigOptionsCOMLib::IOperationOptionPtr tlo = map->CreateOperationOptions("LinkageOptions");//创建配置类型,操作类型的配置
    tlo->AddConfig("OptionsTypeName", "LinkageOptions");//设置更新操作类型名称
    tlo->AddConfig("MapViewIdList", "-1");//设置联动视口ID列表,当传-1为当前所有的视口
    tlo->AddConfig("IsLinkage", "true");//设置是否联动
    tlo->AddConfig("Rate", "1");//联动频率
    operationPtr = map->CreateOperation("LinkageOperation", tlo);//根据配置创建分屏联动操作
    map->AddOperation(operationPtr);     
}

//更新联动
bool SyncState = true;
std::string iState;//是否联动
void CScreenDlg::OnBnClickedUpdatesync()
{
    if(SyncState) {
        SyncState = false;
        iState = "false";
    }
    else {
        SyncState = true;
        iState = "true";
    }
    ConfigOptionsCOMLib::IOperationOptionPtr tlo = map->CreateOperationOptions("LinkageOptions");//创建配置类型,操作类型的配置
    tlo->AddConfig("OptionsTypeName", "LinkageOptions");//设置更新操作类型名称
    tlo->AddConfig("MapViewIdList", "-1");//设置联动视口ID列表,当传-1为当前所有的视口
    tlo->AddConfig("IsLinkage", iState.c_str());//设置是否联动
    tlo->AddConfig("Rate", "3");//联动频率
    operationPtr->UpdateOperationOptions(tlo);//根据配置更新分屏联动操作
}

//删除联动
void CScreenDlg::OnBnClickedRemovesync()
{
    if(operationPtr) {
        map->RemoveOperation(operationPtr);//移除更新对象
        operationPtr = NULL;
    }
}

//创建模型图层
void CScreenDlg::OnBnClickedcreatemodellayer()
{
    char temp_status[MAX_PATH];
    GetPrivateProfileStringA("Path", "ModelPath", "", temp_status, MAX_PATH, mIniPath.c_str());
    std::string ModelPath(temp_status);
    modelLayer = loadModelLayer(ModelPath,"true",true);//加载模型图层
}

//删除模型图层
void CScreenDlg::OnBnClickedremovemodellayer()
{
    map->RemoveLayer(modelLayer);//删除图层
    modelLayer = NULL;
}

C#调用

IMapViewObject mv1;
IMapViewObject mv2;
int mvID;
private void AddScreen_Click(object sender, EventArgs e)
{
    //默认屏幕参数变化
    int mvCount = map.GetMapViewCount();
    mvID = map.GetMapViewIDByIndex(mvCount - 1);
    mv1 = map.GetMapViewByID(mvID);

    IMapViewOptions mapviewDefOpt = map.CreateMapViewOptions();
    mapviewDefOpt.AddConfig("ViewPort", "0,0,0.5,1");//相机视口大小,4个值分别为x轴起点,y轴起点,宽度占比,高度占比,范围为0~1
    mv1.UpdateMapViewOptions(mapviewDefOpt);

    IMapViewOptions mapviewOpt = map.CreateMapViewOptions();
    mapviewOpt.AddConfig("CameraName", "split1");//窗口名称
    mapviewOpt.AddConfig("RenderOrder", "2");//窗口绘制顺序
    mapviewOpt.AddConfig("IsOrtho", "false");//true正交投影 false透视投影,一般透视投影
    mapviewOpt.AddConfig("Aspect", "1");//宽高比
    mapviewOpt.AddConfig("Fovy", "35");//视野角度
    mapviewOpt.AddConfig("ZNear", "100");//近截面
    mapviewOpt.AddConfig("ZFar", "100000000");//远截面
    //mapviewOpt.AddConfig("ClearFlagFilePath", dataPath+"Skybox\\");//背景天空盒路径,与ClearFlagColor互斥
    mapviewOpt.AddConfig("ClearFlagColor", "1,0,0,1");//背景颜色,为RGBA,与ClearFlagColor互斥    
    mapviewOpt.AddConfig("ViewPort", "0.5,0,0.5,1");//相机视口大小,4个值分别为x轴起点,y轴起点,宽度占比,高度占比,范围为0~1
    mapviewOpt.AddConfig("Eye", "0,0,15");//窗口初始视点,一般不改动
    mapviewOpt.AddConfig("Center", "0,0,0");//窗口初始中心点,一般不改动
    mapviewOpt.AddConfig("Up", "0,1,0");//窗口初始上方向,一般不改动

    ///创建参考系(可选),可用默认的参考系,目前针对地形影像图层加载
    //var refOpt = map.CreateRefrenceSystemOptions();
    //refOpt.AddConfig("SrsInitString", "epsg:4326");//坐标参考系名称
    //refOpt.AddConfig("CoordSysType", "0");//坐标系类型,0-地心坐标系(球面坐标系)
    //refOpt.AddConfig("TileRangeFactor", "5.0");//地形影像调度缩放比例,一般设为2.0-20.0之间,在同一高度时,越大地形影像越清晰,但是调度数据越多,默认值为5.0
    //refOpt.AddConfig("MinLongitude", "-180");//最小经度
    //refOpt.AddConfig("MaxLongitude", "180");//最大经度
    //refOpt.AddConfig("MinLatitude", "-90");//最小纬度
    //refOpt.AddConfig("MaxLatitude", "90");//最大纬度
    //refOpt.AddConfig("MaxExtent", "1000,1000,1000");//包围盒最大值
    //refOpt.AddConfig("MinExtent", "0,0,0");//包围盒最小值
    //var refObj = map.CreateRefrenceSystem(refOpt);//使用创建的参考系
    var refObj = map.GetRefrenceSystem();//使用默认的参考系
    mv2 = map.CreateMapView(refObj, mapviewOpt);//根据参考系和窗口配置创建窗口对象
    mSetScreen2();//设置当前操作窗口为mv2
    LoadDefDom();//加载默认地球数据
}

private void LoadDefDom()
{
    ILayerOptions tlo = map.CreateLayerOptions("domlayer");//创建dom图层配置,任意名称
    tlo.AddConfig("LayerOptionsName", "ImageLayerOptions");//创建配置类型, ImageLayerOptions代表影像数据配置
    tlo.AddConfig("DataSourceTypeName", "mtd");//数据源类型,代表MTD插件
    tlo.AddConfig("Driver", "terrainquadtree");//代表地形驱动

    //以下部分可以通过图层信息获取获得相应的配置//
    tlo.AddConfig("Url", dataPath + "Earth\\DOM");//要加载的数据路径,此数据必须是通过MTD切割工具生成的数据,并且进行了网络发布
    tlo.AddConfig("Format", "png");//切割形成的数据格式
    tlo.AddConfig("Srs", "EPSG:4326");//数据的坐标参考
    tlo.AddConfig("MaxX", "180");//数据的范围X向最大值
    tlo.AddConfig("MinX", "-180");//数据的范围X向最小值
    tlo.AddConfig("MaxY", "90");//数据的范围Y向最大值
    tlo.AddConfig("MinY", "-90");//数据的范围Y向最小值
    tlo.AddConfig("TileSize", "256");//切割数据的瓦片大小,可以往小于256的方向设置,但绝对不能往大于256的方向设置,但最好用切割的大小设置,否则会影响效率
    tlo.AddConfig("MinLevel", "0");//数据显示的最小层级
    tlo.AddConfig("MaxLevel", "3");//数据显示的最大层级

    ILayerObject mtddomlayer = map.CreateLayer("ImageLayer", tlo);//创建DEM图层,第一项参数为ImageLayer
    map.AddLayer(mtddomlayer);//添加DOM图层
}

private void ModifyScreen_Click(object sender, EventArgs e)
{
    IMapViewOptions opt1 = map.CreateMapViewOptions();
    opt1.AddConfig("ViewPort", "0,0,1,0.5");//相机视口大小,4个值分别为x轴起点,y轴起点,宽度占比,高度占比,范围为0~1
    mv2.UpdateMapViewOptions(opt1);

    IMapViewOptions opt2 = map.CreateMapViewOptions();
    opt2.AddConfig("ViewPort", "0,0.5,1,0.5");//相机视口大小,4个值分别为x轴起点,y轴起点,宽度占比,高度占比,范围为0~1
    mv1.UpdateMapViewOptions(opt2);
}

private void ModifyScreen1_Click(object sender, EventArgs e)
{
    IMapViewOptions opt1 = map.CreateMapViewOptions();
    opt1.AddConfig("ViewPort", "0,0,0.5,1");//相机视口大小,4个值分别为x轴起点,y轴起点,宽度占比,高度占比,范围为0~1
    mv2.UpdateMapViewOptions(opt1);

    IMapViewOptions opt2 = map.CreateMapViewOptions();
    opt2.AddConfig("ViewPort", "0.5,0,0.5,1");//相机视口大小,4个值分别为x轴起点,y轴起点,宽度占比,高度占比,范围为0~1
    mv1.UpdateMapViewOptions(opt2);
}

private void SetScreen1_Click(object sender, EventArgs e)
{
    mSetScreen1();
}

private void SetScreen2_Click(object sender, EventArgs e)
{
    mSetScreen2();
}

private void RemoveScreen1_Click(object sender, EventArgs e)
{
    if (mv1 != null)
    {
        map.DestroyMapView(mv1);//销毁窗口        
        IMapViewOptions opt = map.CreateMapViewOptions();
        opt.AddConfig("ViewPort", "0,0,1,1");//相机视口大小,4个值分别为x轴起点,y轴起点,宽度占比,高度占比,范围为0~1
        mv2.UpdateMapViewOptions(opt);//更新窗口参数
        mSetScreen2();
    }
}

private void RemoveScreen2_Click(object sender, EventArgs e)
{
    if (mv2 != null)
    {
        map.DestroyMapView(mv2);
        IMapViewOptions opt = map.CreateMapViewOptions();
        opt.AddConfig("ViewPort", "0,0,1,1");//相机视口大小,4个值分别为x轴起点,y轴起点,宽度占比,高度占比,范围为0~1
        mv1.UpdateMapViewOptions(opt);
        mSetScreen1();
    }
}

private void GetCount_Click(object sender, EventArgs e)
{
    int mvCount = map.GetMapViewCount();//获取窗口个数
    MessageBox.Show(mvCount.ToString());
}

private void GetIdByIndex_Click(object sender, EventArgs e)
{
    int mvID = map.GetMapViewIDByIndex(1);//根据index获取窗口id
    MessageBox.Show(mvID.ToString());
}

private void GetMapViewById_Click(object sender, EventArgs e)
{
    var defMv = map.GetMapViewByID(1);//根据窗口id获取窗口对象
    MessageBox.Show(defMv.ToString());
}

private void mSetScreen1()
{
    map.SetCurrentMapViewID(mv1.GetMapViewID());//设置当前操作窗口
}

private void mSetScreen2()
{
    map.SetCurrentMapViewID(mv2.GetMapViewID());//设置当前操作窗口
}

IOperationObject operationPtr;//分屏联动更新操作对象
private void CreateSync_Click(object sender, EventArgs e)
{
    if (operationPtr !=null)
    {
        RemoveSync1();//移除联动
    }
    var tlo = map.CreateOperationOptions("LinkageOptions");//创建配置类型,操作类型的配置
    tlo.AddConfig("OptionsTypeName", "LinkageOptions");//设置更新操作类型名称
    tlo.AddConfig("MapViewIdList", "-1");//设置联动视口ID列表,当传-1为当前所有的视口
    tlo.AddConfig("IsLinkage", "true");//设置是否联动
    tlo.AddConfig("Rate", "1");//联动频率
    operationPtr = map.CreateOperation("LinkageOperation", tlo);//根据配置创建分屏联动操作
    map.AddOperation(operationPtr);  
}

bool SyncState = true;
string iState;//是否联动
//更新联动
private void UpdateSync_Click(object sender, EventArgs e)
{
    if (SyncState)
    {
        SyncState = false;
        iState = "false";
    }
    else
    {
        SyncState = true;
        iState = "true";
    }
    var tlo = map.CreateOperationOptions("LinkageOptions");//创建配置类型,操作类型的配置
    tlo.AddConfig("OptionsTypeName", "LinkageOptions");//设置更新操作类型名称
    tlo.AddConfig("MapViewIdList", "-1");//设置联动视口ID列表,当传-1为当前所有的视口
    tlo.AddConfig("IsLinkage", iState);//设置是否联动
    tlo.AddConfig("Rate", "3");//联动频率
    operationPtr.UpdateOperationOptions(tlo);//根据配置更新分屏联动操作
}
//关闭联动
private void RemoveSync_Click(object sender, EventArgs e)
{
    RemoveSync1();
}
//删除联动
private void RemoveSync1()
{
    if (operationPtr != null)
    {
        map.RemoveOperation(operationPtr);//移除更新对象
        operationPtr = null;
    }
}
//创建模型图层
private void createModelLayer_Click(object sender, EventArgs e)
{
    modelLayer = loadModelLayer(readini("Path", "ModelPath", "", filepath), "true", true);//加载模型图层
}
//删除模型图层
private void removeModelLayer_Click(object sender, EventArgs e)
{
    map.RemoveLayer(modelLayer);//删除图层
}
//创建三维距离测量
ILayerObject distanceMeasure;//三维距离测量对象
private void createDistanceMeasure_Click(object sender, EventArgs e)
{
    if (distanceMeasure == null)
    {
        //创建图层配置信息
        ILayerOptions tlo = map.CreateLayerOptions("distanceMeasure");//创建图层配置对象,任意名称
        tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");//图层配置对象名称, AnalysisLayerOptions代表分析图层数据配置
        tlo.AddConfig("DataSourceTypeName", "as_distance");//数据源类型,as_distance代表距离测量
        tlo.AddConfig("PointColor", "0.0,0.0,1.0,1.0");//点颜色
        tlo.AddConfig("PointSize", "10");//点大小(0-10)
        tlo.AddConfig("DistanceMeasureLineColor", "0.8,0.0,0.0,1.0");//线颜色
        tlo.AddConfig("LineWidth", "2");//线宽(0-10)
        tlo.AddConfig("IsDepthTest", "false");//是否开启深度测试。false不开启,结果会浮在场景上,true实际显示位置    
        //tlo.AddConfig("NonIntersect","1,2");//非相交图层,1-分析,2-地形,3-模型,4-矢量(未贴地),5-矢量模板阴影体,6-矢量(贴地),7-倾斜摄影数据

        tlo.AddConfig("IsGuideLine", "false");//辅助线开关
        tlo.AddConfig("GuideLineWidth", "2");//辅助线的宽度
        tlo.AddConfig("GuideLineColor", "1.0, 1.0, 0, 1.0");//辅助线颜色
        tlo.AddConfig("GuideLineStipple", "5000");//辅助线类型-1为实线,1~65535为虚线

        //创建文字符号
        ISymbolObject pSymbol = map.CreateSymbol("AnalysisTextSymbol");//创建文字符号,分析文字为:AnalysisTextSymbol
        pSymbol.AddConfig("FillingColor", "0.93,0.93,0.93,1");//设置文字颜色(RGBA)
        pSymbol.AddConfig("Font", "C:\\WINDOWS\\Fonts\\simhei.ttf");//设置字体路径
        pSymbol.AddConfig("Size", "40");//字体精度大小
        pSymbol.AddConfig("CharacterSize", "10");//文字大小
        pSymbol.AddConfig("CharacterMode", "1");//字符大小变化模式。0-随对象变化显示,1-随相机远近变化,2-随相机远近变化,同时不超过上限值
        pSymbol.AddConfig("AlignmentMode", "5");//文字对齐方式
        pSymbol.AddConfig("AxisAlignment", "6");//设置文字旋转模式。旋转轴0-7,6:自动
        pSymbol.AddConfig("RemoveDuplicateLabels", "false");//是否移除重复的标注            
        pSymbol.AddConfig("IsEmbolden", "false");//字体是否加粗
        pSymbol.AddConfig("IsTransform", "false");//字体是否为斜体
        pSymbol.AddConfig("IsUnderline", "false");//字体是否有下划线
        pSymbol.AddConfig("IsBack", "true");//是否设置背景色
        pSymbol.AddConfig("BackColor", "0.42,0.47,0.85,1");//背景颜色,IsBack为true有效
        pSymbol.AddConfig("FieldPrecision", "2");//显示精度
        pSymbol.AddConfig("IsDepthTest", "false");//是否开启深度测试。false不开启,结果会浮在场景上,true实际显示位置

        pSymbol.AddConfig("MeasureUnitType", "0");//显示单位。0-米;1-公里;2-海里
        pSymbol.AddConfig("MeasureUnitLanguage", "0");//显示语言。0-英文;1-中文
        pSymbol.AddConfig("CoordinateSystemType", "0");//显示参考系。 0-地理经纬度;1-投影坐标;2-世界坐标系;3-地心空间直角坐标系XYZ
        //创建样式
        IStyle pStyle = map.CreateStyle("Text");//创建样式
        pStyle.AddSymbol("AnalysisTextSymbol", pSymbol.GetConfig());//将符号对象添加到样式,第一参数为符号类型
        //将样式添加到图层配置里
        tlo.AddConfig("Style", pStyle.GetConfig());//添加样式
        distanceMeasure = map.CreateLayer("AnalysisLayer", tlo);//创建分析图层,第一项参数为AnalysisLayer
        distanceMeasure.AddObserver();//添加监听
        map.AddLayer(distanceMeasure);//添加图层
    }
    else
    {
        MessageBox.Show("请勿重复创建!");
    }
}
//删除三维距离测量
private void removeDistanceMeasure_Click(object sender, EventArgs e)
{
    if (distanceMeasure != null)
    {
        map.RemoveLayer(distanceMeasure);//删除图层
        distanceMeasure = null;
    }
    else
    {
        MessageBox.Show("没有测量对象!");
    }
}

results matching ""

    No results matching ""