2.7.8 图层序列及反序列化


图层序列及反序列化

图层序列化与反序列化是针对图层对象的保存与还原功能。它是图层对象所特有的功能,通过该功能可以将图层对象的所有配置都保存为文件,然后通过文件可以进行图层还原。

序列化是将图层对象的所有配置信息保存为本地文件。它是调用图层对象的SerializeLayer 方法实现的。

反序列化是将保存的序列化文件还原成原始的图层加载到场景中。反序列化支持本地和网络两种反序列化方式。本地反序列化调用场景对象的DeserializeLayer 方法,网络反序列化调用场景对象的DeserializeLayerByUrl方法。

代码调用示例

Javascript调用

var analysisLayer = null;
var measureLayer = null;
var viewPointLayer = null;
//创建图层
function createLayers(){
    loadGlobalDomLayer(gDomPath, false);
    loadGlobalModelLayer(gModelPath, "true", false);
    loadGlobalOsgbLayer(gOsgbPath, "EPSG:4549", "true", "521059,3343006,0", false);
    createDistanceMeasure();
    flyToDestPos(120.218311675, 30.2097719539, 14.6240396304, 0, -0.75, 629, 1);
}

function serializeLayers(){
    gDomLayer.SerializeLayer(gXmlPath + "/dom.xml");//序列化只可序列化至本地路径
    gModelLayer.SerializeLayer(gXmlPath + "/model.xml");//序列化只可序列化至本地路径
    gOsgbLayer.SerializeLayer(gXmlPath + "/osgb.xml");//序列化只可序列化至本地路径
    measureLayer.SerializeLayer(gXmlPath + "/measure.xml");//序列化只可序列化至本地路径
    createViewPointLayer();
    viewPointLayer.SerializeLayer(gXmlPath + "/viewpoint.xml");//序列化只可序列化至本地路径
}
function removeLayers(){
    if(gDomLayer){
        map.RemoveLayer(gDomLayer);
        gDomLayer = null;
    }
    if(gModelLayer){
        map.RemoveLayer(gModelLayer);
        gModelLayer = null;
    }
    if(gOsgbLayer){
        map.RemoveLayer(gOsgbLayer);
        gOsgbLayer = null;
    }
    if(measureLayer){
        map.RemoveLayer(measureLayer);
        measureLayer = null;
    }
    if(viewPointLayer){
        map.RemoveLayer(viewPointLayer);
        viewPointLayer = null;
    }
}
function deserializeLayers(){
    gDomLayer = map.DeserializeLayer(gXmlPath + "/dom.xml");
    gModelLayer = map.DeserializeLayer(gXmlPath + "/model.xml");
    gOsgbLayer = map.DeserializeLayer(gXmlPath + "/osgb.xml");
    measureLayer = map.DeserializeLayer(gXmlPath + "/measure.xml");
    viewPointLayer = map.DeserializeLayer(gXmlPath + "/viewpoint.xml");
    if(viewPointLayer){
        viewPointLayer.Locate();
    }
}

function deserializeLayersByUrl(){
    measureLayer = map.DeserializeLayerByUrl("http://192.168.1.50:8088/files1/test/LayerDeserializerByUrl/measure.xml");
    viewPointLayer = map.DeserializeLayerByUrl("http://192.168.1.50:8088/files1/test/LayerDeserializerByUrl/viewpoint.xml");
    if(viewPointLayer){
        viewPointLayer.Locate();
    }
}


function createDistanceMeasure(){
    if(measureLayer == 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实际显示位置

        //创建文字符号
        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","true");//是否开启深度测试。默认为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());//添加样式
        measureLayer = map.CreateLayer("AnalysisLayer", tlo);//创建分析图层,第一项参数为AnalysisLayer
        map.AddLayer(measureLayer);//添加图层
    }else{
        alert("请勿重复创建!");
    }
}
//创建视点图层
function createViewPointLayer(){
    if(viewPointLayer == null){
        var tlo = map.CreateLayerOptions("ViewPointLayer");
        tlo.AddConfig("LayerOptionsName", "ViewPointLayerOptions");//创建配置类型, ModelLayerOptions代表模型数据配置,必须是此键值
        tlo.AddConfig("Auto", "1");//auto为1为获取当前视点,为0则为根据参数定位                                  
        tlo.AddConfig("IsGeoPoint","false");//视点有起始点和目标点之分,true为目标点,即视线终点;false为起始点,即视线起点
        viewPointLayer = map.CreateLayer("ViewPointLayer", tlo);
        map.AddLayer(viewPointLayer);
    }else{
        alert("图层已存在,无需重复创建!");
    }
}

C++调用

BaseObjectCOMLib::ILayerObjectPtr modelLayer;//模型图层
BaseObjectCOMLib::ILayerObjectPtr demLayer;//影像图层
BaseObjectCOMLib::ILayerObjectPtr domLayer;//地下图层
BaseObjectCOMLib::ILayerObjectPtr viewShedLayer;//视域分析图层
BaseObjectCOMLib::ILayerObjectPtr lineOfSightLayer;//通视分析图层
BaseObjectCOMLib::ILayerObjectPtr viewPointLayer;//视点图层

//创建图层列表
void Cf6c7SerializeLayersDlg::OnBnClickedcreatelayers()
{
    char temp_status[MAX_PATH];
    GetPrivateProfileStringA("Path", "DomPath", "", temp_status, MAX_PATH, mIniPath.c_str());
    std::string DomPath(temp_status);
    GetPrivateProfileStringA("Path", "DemPath", "", temp_status, MAX_PATH, mIniPath.c_str());
    std::string DemPath(temp_status);
    GetPrivateProfileStringA("Path", "ModelPath", "", temp_status, MAX_PATH, mIniPath.c_str());
    std::string ModelPath(temp_status);

    domLayer = loadDomLayer(DomPath, false);//加载影像(切割)图层
    demLayer = loadDemLayer(DemPath, false);//加载地形(切割)图层
    modelLayer = loadModelLayer(ModelPath,"true",true);//加载模型图层
    viewShedLayer = loadViewShed(TRUE);//加载单视域分析
    lineOfSightLayer = loadLineOfSight(TRUE);//加载通视分析
}

//序列化图层列表
void Cf6c7SerializeLayersDlg::OnBnClickedserializelayers()
{
    domLayer->SerializeLayer("D:\\dom.xml");//序列化只可序列化至本地路径
    demLayer->SerializeLayer("D:\\dem.xml");//序列化只可序列化至本地路径
    modelLayer->SerializeLayer("D:\\model.xml");//序列化只可序列化至本地路径
    viewShedLayer->SerializeLayer("D:\\viewShed.xml");//序列化只可序列化至本地路径
    lineOfSightLayer->SerializeLayer("D:\\lineOfSight.xml");//序列化只可序列化至本地路径
}

//删除图层列表
void Cf6c7SerializeLayersDlg::OnBnClickedremovelayers()
{
    if(modelLayer){
        map->RemoveLayer(modelLayer);
        modelLayer = NULL;
    }
    if(domLayer){
        map->RemoveLayer(domLayer);
        domLayer = NULL;
    }
    if(demLayer){
        map->RemoveLayer(demLayer);
        demLayer = NULL;
    }
    if(viewShedLayer){
        map->RemoveLayer(viewShedLayer);
        viewShedLayer = NULL;
    }
    if(lineOfSightLayer){
        map->RemoveLayer(lineOfSightLayer);
        lineOfSightLayer = NULL;
    }
}

//反序列化图层列表
void Cf6c7SerializeLayersDlg::OnBnClickeddeserializelayers()
{    
    //本地反序列化
    domLayer = map->DeserializeLayer("D:\\dom.xml");
    demLayer = map->DeserializeLayer("D:\\dem.xml");
    modelLayer = map->DeserializeLayer("D:\\model.xml");
    viewShedLayer = map->DeserializeLayer("D:\\viewShed.xml");
    lineOfSightLayer = map->DeserializeLayer("D:\\lineOfSight.xml");
}

void Cf6c7SerializeLayersDlg::OnBnClickeddeserializelayersbyurl()
{
    domLayer = map.DeserializeLayerByUrl("http://192.168.1.50:8088/files1/dom.xml");
    modelLayer = map.DeserializeLayerByUrl("http://192.168.1.50:8088/files1/model.xml");
}
//加载影像(切割)图层
BaseObjectCOMLib::ILayerObjectPtr Cf6c7SerializeLayersDlg::loadDomLayer(std::string url,BOOL isLocate)
{
    std::string dataType="mtd";
    if(!url.find("http"))//判断是否网络加载
    {
        dataType = "mtds";//数据源类型,服务地形影像
    }
    else
    {
        dataType = "mtd";//数据源类型,本地地形影像
    }
    ConfigOptionsCOMLib::IDataSourceOptionsPtr dataSourceOptions = map->CreateDataSourceOptions(dataType.c_str());//创建数据源配置对象,名称必须与数据源名称匹配
    dataSourceOptions->AddConfig("Url",url.c_str());//数据源路径
    BaseObjectCOMLib::IDataSourceObjectPtr dataSource=map->CreateDataSource(dataSourceOptions);//创建数据源对象
    long count =dataSource->GetLayerCount();//获取数据源包含图层数量
    if(count == 0)
    {
        return NULL;
    }
    //获取数据源图层配置项
    std::string Url = dataSource->GetLayerInfo(0, "Url");//数据路径
    std::string Format = dataSource->GetLayerInfo(0, "Format");//切割形成的数据格式
    std::string Srs = dataSource->GetLayerInfo(0, "Srs");//数据的坐标参考
    std::string MaxX = dataSource->GetLayerInfo(0, "MaxX");//数据的范围X向最大值
    std::string MinX = dataSource->GetLayerInfo(0, "MinX");//数据的范围X向最小值
    std::string MaxY = dataSource->GetLayerInfo(0, "MaxY");//数据的范围Y向最大值
    std::string MinY = dataSource->GetLayerInfo(0, "MinY");//数据的范围Y向最小值
    std::string TileSize="256";
    TileSize = dataSource->GetLayerInfo(0, "TileSize");//切割数据的瓦片大小,最大为256,建议使用切割的大小设置,否则会影响效率
    std::string MinLevel = dataSource->GetLayerInfo(0, "MinLevel");//数据显示的最小层级
    std::string MaxLevel="10";
    MaxLevel = dataSource->GetLayerInfo(0, "MaxLevel");//数据显示的最大层级
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions("domlayer"); // 创建图层配置对象,给配置起个名称,任意名称
    tlo->AddConfig("LayerOptionsName", "ImageLayerOptions"); //图层配置对象名称, ImageLayerOptions代表影像图层配置对象
    tlo->AddConfig("DataSourceTypeName", dataType.c_str());//数据源类型
    tlo->AddConfig("Driver", "terrainquadtree");//驱动名称,terrainquadtree代表地形驱动
    tlo->AddConfig("Url", Url.c_str());//数据路径
    tlo->AddConfig("Format", Format.c_str());//数据格式
    tlo->AddConfig("Srs", Srs.c_str());//数据的坐标参考
    tlo->AddConfig("MaxX", MaxX.c_str());//数据的范围X向最大值
    tlo->AddConfig("MinX", MinX.c_str());//数据的范围X向最小值
    tlo->AddConfig("MaxY", MaxY.c_str());//数据的范围Y向最大值
    tlo->AddConfig("MinY", MinY.c_str());//数据的范围Y向最小值
    tlo->AddConfig("TileSize", TileSize.c_str());//切割数据的瓦片大小
    tlo->AddConfig("MinLevel", MinLevel.c_str());//数据显示的最小层级
    tlo->AddConfig("MaxLevel", MaxLevel.c_str());//数据显示的最大层级
    BaseObjectCOMLib::ILayerObjectPtr domLayer= map->CreateLayer("ImageLayer", tlo);//创建影像图层,第一项参数必须为ImageLayer
    map->AddLayer(domLayer);//添加影像图层
    if(isLocate){
        domLayer->Locate();//图层定位
    }
    return domLayer;
}

//加载地形图层
BaseObjectCOMLib::ILayerObjectPtr Cf6c7SerializeLayersDlg::loadDemLayer(std::string url,BOOL isLocate){
    std::string dataType="mtd";
    if(!url.find("http"))//判断是否网络加载
    {
        dataType = "mtds";//数据源类型,服务地形影像
    }
    else
    {
        dataType = "mtd";//数据源类型,本地地形影像
    }
    ConfigOptionsCOMLib::IDataSourceOptionsPtr dataSourceOptions = map->CreateDataSourceOptions(dataType.c_str());//创建数据源配置对象,名称必须与数据源名称匹配
    dataSourceOptions->AddConfig("Url",url.c_str());//数据源路径
    BaseObjectCOMLib::IDataSourceObjectPtr dataSource=map->CreateDataSource(dataSourceOptions);//创建数据源对象
    long count =dataSource->GetLayerCount();//获取数据源包含图层数量
    if(count == 0){
        return NULL;
    }
    //获取数据源图层配置项
    std::string Url = dataSource->GetLayerInfo(0, "Url");//数据路径
    std::string Format = dataSource->GetLayerInfo(0, "Format");//切割形成的数据格式
    std::string Srs = dataSource->GetLayerInfo(0, "Srs");//数据的坐标参考
    std::string MaxX = dataSource->GetLayerInfo(0, "MaxX");//数据的范围X向最大值
    std::string MinX = dataSource->GetLayerInfo(0, "MinX");//数据的范围X向最小值
    std::string MaxY = dataSource->GetLayerInfo(0, "MaxY");//数据的范围Y向最大值
    std::string MinY = dataSource->GetLayerInfo(0, "MinY");//数据的范围Y向最小值
    std::string TileSize="16";
    TileSize = dataSource->GetLayerInfo(0, "TileSize");//切割数据的瓦片大小,最大为256,建议使用切割的大小设置,否则会影响效率
    std::string MinLevel = dataSource->GetLayerInfo(0, "MinLevel");//数据显示的最小层级
    std::string MaxLevel="10";
    MaxLevel = dataSource->GetLayerInfo(0, "MaxLevel");//数据显示的最大层级
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions("demlayer"); // 创建图层配置对象,给配置起个名称,任意名称
    tlo->AddConfig("LayerOptionsName", "ElevationLayerOptions"); //图层配置对象名称, ElevationLayerOptions代表地形图层配置
    tlo->AddConfig("DataSourceTypeName", dataType.c_str());//数据源类型
    tlo->AddConfig("Driver", "terrainquadtree");//驱动名称,terrainquadtree代表地形驱动
    tlo->AddConfig("Url", Url.c_str());//数据路径
    tlo->AddConfig("Format", Format.c_str());//数据格式
    tlo->AddConfig("Srs", Srs.c_str());//数据的坐标参考
    tlo->AddConfig("MaxX", MaxX.c_str());//数据的范围X向最大值
    tlo->AddConfig("MinX", MinX.c_str());//数据的范围X向最小值
    tlo->AddConfig("MaxY", MaxY.c_str());//数据的范围Y向最大值
    tlo->AddConfig("MinY", MinY.c_str());//数据的范围Y向最小值
    tlo->AddConfig("TileSize", TileSize.c_str());//切割数据的瓦片大小
    tlo->AddConfig("MinLevel", MinLevel.c_str());//数据显示的最小层级
    tlo->AddConfig("MaxLevel", MaxLevel.c_str());//数据显示的最大层级
    BaseObjectCOMLib::ILayerObjectPtr demlayer= map->CreateLayer("ElevationLayer", tlo);//创建DEM图层,第一项参数必须为ImageLayer
    map->AddLayer(demlayer);//添加地形图层
    if(isLocate){
        demlayer->Locate();//图层定位
    }
    return demlayer;
}

//加载模型图层
BaseObjectCOMLib::ILayerObjectPtr Cf6c7SerializeLayersDlg::loadModelLayer(std::string url, std::string compress,BOOL isLocate)
{
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions("modelOpt"); //创建图层配置对象,任意名称
    tlo->AddConfig("LayerOptionsName", "ModelLayerOptions");//图层配置对象名称, ModelLayerOptions代表模型图层配置对象
    if(!url.find("http"))//判断是否网络加载
    {
        tlo->AddConfig("DataSourceTypeName", "c3ss");//数据源类型,c3ss代表服务数据源
    }
    else
    {
        tlo->AddConfig("DataSourceTypeName", "c3s"); //数据源类型,c3s代表本地数据源
    }
    tlo->AddConfig("Url", url.c_str()); //数据路径
    tlo->AddConfig("PriorityOffset","1.0");//结点调度优先级的偏移值
    tlo->AddConfig("Compress", compress.c_str()); //是否压缩(根据数据实际情况设置)
    BaseObjectCOMLib::ILayerObjectPtr modelLayer = (BaseObjectCOMLib::ILayerObjectPtr)map->CreateLayer("ModelLayer", tlo); ////创建模型图层,第一项参数必须为ModelLayer
    map->AddLayer(modelLayer); ///添加模型图层
    if(isLocate)//判断是否定位
    {
        modelLayer->Locate(); ////模型图层定位
    }
    return modelLayer;//返回模型图层
}

//加载单视域分析
BaseObjectCOMLib::ILayerObjectPtr Cf6c7SerializeLayersDlg::loadViewShed(bool IsLoad)
{
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions("viewShed"); //创建图层配置对象,任意名称
    tlo->AddConfig("LayerOptionsName", "AnalysisLayerOptions");//图层配置对象名称, AnalysisLayerOptions代表分析图层数据配置
    tlo->AddConfig("DataSourceTypeName", "as_viewshed");//数据源类型,as_viewshed代表视域分析
    tlo->AddConfig("DrawLineColor", "1,1,0,1");//线颜色(RGBA)
    tlo->AddConfig("VAngle", "60");//垂直方向张角
    tlo->AddConfig("HAngle", "60");//水平方向张角        
    tlo->AddConfig("TextVisible", "true");//是否显示文字
    tlo->AddConfig("TextLiftUp", "1");//文字抬高高度
    tlo->AddConfig("IsDepthTest","true");//是否开启深度测试。false不开启,结果会浮在场景上,true实际显示位置
    if(IsLoad){
        tlo->AddConfig("IsActive", "false");//是否激活分析。初始化加载点时,需要关闭激活
        tlo->AddConfig("IsLoad", "true");//是否初始化加载点
        tlo->AddConfig("EyePos", "120.218221747,30.2105396593,82.76055");//起始点
        tlo->AddConfig("ArmPos", "120.218013904,30.2110769596,20.09121");//目标点
    }
    //创建文字符号
    ConfigOptionsCOMLib::ISymbolObjectPtr pSymbol = (ConfigOptionsCOMLib::ISymbolObjectPtr)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","true");//是否开启深度测试。默认为true
    //创建样式
    ConfigOptionsCOMLib::IStylePtr pStyle = (ConfigOptionsCOMLib::IStylePtr)map->CreateStyle("Text");//创建样式
    pStyle->AddSymbol("AnalysisTextSymbol", pSymbol->GetConfig());//将符号对象添加到样式,第一参数为符号类型
    //将样式添加到图层配置里
    tlo->AddConfig("Style", pStyle->GetConfig());//添加样式
    BaseObjectCOMLib::ILayerObjectPtr viewShed = map->CreateLayer("AnalysisLayer", tlo);//创建分析图层,第一项参数为AnalysisLayer
    map->AddLayer(viewShed);//添加图层
    return viewShed;
}

//加载通视分析
BaseObjectCOMLib::ILayerObjectPtr Cf6c7SerializeLayersDlg::loadLineOfSight(bool IsLoad)
{
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions(""); //创建图层配置对象,任意名称
    tlo->AddConfig("LayerOptionsName", "AnalysisLayerOptions");//图层配置对象名称, AnalysisLayerOptions代表分析图层数据配置
    tlo->AddConfig("DataSourceTypeName", "as_linesight");//数据源类型,as_linesight代表通视分析
    tlo->AddConfig("StartColor", "0,0,1,1");//起始点颜色(RGBA)
    tlo->AddConfig("EndColor", "0,0,1,1");//目标点颜色(RGBA)
    tlo->AddConfig("HitColor", "1,1,0,1");//视线碰撞点颜色(RGBA)
    tlo->AddConfig("StartPointSize", "10");//起始点的大小
    tlo->AddConfig("EndPointSize", "10");//目标点的大小
    tlo->AddConfig("HitPointSize", "13");//碰撞点的大小
    tlo->AddConfig("LineWidth", "3.0");//线宽(0-10)
    tlo->AddConfig("LineOfSightColor", "0,1,0,1");//通视线颜色
    tlo->AddConfig("InvisiblePartColor", "1,0,0,1");//视线不可视部分颜色(RGBA)
    tlo->AddConfig("VisiblePartColor", "1,1,0,1");//视线可视部分颜色(RGBA)
    tlo->AddConfig("TextVisible", "true");//是否显示文字
    tlo->AddConfig("TextLiftUp", "1");//文字抬高高度
    tlo->AddConfig("IsDepthTest","true");//是否开启深度测试。false不开启,结果会浮在场景上,true实际显示位置
    if(IsLoad){
        tlo->AddConfig("IsLoad","true");//是否初始化加载点  
        tlo->AddConfig("IsActive", "false");//是否激活分析            
        tlo->AddConfig("StartPoint","120.218559381,30.2100080537,27.9831230184");//起始点坐标
        tlo->AddConfig("EndPoints","120.218338849,30.2097523565,14.622604738;120.218479768,30.210410742,79.5481784679;120.218734158,30.2100659177,28.103232082;");//终止点坐标
    }
    ConfigOptionsCOMLib::ISymbolObjectPtr pSymbol = (ConfigOptionsCOMLib::ISymbolObjectPtr)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");//显示精度
    //创建样式
    ConfigOptionsCOMLib::IStylePtr pStyle = (ConfigOptionsCOMLib::IStylePtr)map->CreateStyle("Text");//创建样式
    pStyle->AddSymbol("AnalysisTextSymbol", pSymbol->GetConfig());//将符号对象添加到样式,第一参数为符号类型
    //将样式添加到图层配置里
    tlo->AddConfig("Style", pStyle->GetConfig());//添加样式
    BaseObjectCOMLib::ILayerObjectPtr lineOfSight = map->CreateLayer("AnalysisLayer", tlo);//创建分析图层,第一项参数为AnalysisLayer
    map->AddLayer(lineOfSight);//添加图层
    return lineOfSight;
}

C#调用

ILayerObject modelLayer;//模型图层
ILayerObject demLayer;//影像图层
ILayerObject domLayer;//地下图层
ILayerObject viewPointLayer;//视点图层
ILayerObject measureLayer;//测量图层
//加载影像(切割)图层
private void loadDomLayer()
{
    IDataSourceOptions dataSourceOptions = (IDataSourceOptions)map.CreateDataSourceOptions("mtd");//创建数据源配置对象,名称必须与数据源名称匹配
    //IDataSourceOptions dataSourceOptions = (IDataSourceOptions)map.CreateDataSourceOptions("mtd");//创建数据源配置对象,名称必须与数据源名称匹配
    dataSourceOptions.AddConfig("Url", readini("Path", "DomPath", "", filepath));//数据源路径
    IDataSourceObject dataSource = map.CreateDataSource(dataSourceOptions);//创建数据源对象
    long count = dataSource.GetLayerCount();//获取数据源包含图层数量
    if (count == 0)
    {
        return;
    }
    //获取数据源图层配置项
    string Url = dataSource.GetLayerInfo(0, "Url");//数据路径
    string Format = dataSource.GetLayerInfo(0, "Format");//切割形成的数据格式
    string Srs = dataSource.GetLayerInfo(0, "Srs");//数据的坐标参考
    string MaxX = dataSource.GetLayerInfo(0, "MaxX");//数据的范围X向最大值
    string MinX = dataSource.GetLayerInfo(0, "MinX");//数据的范围X向最小值
    string MaxY = dataSource.GetLayerInfo(0, "MaxY");//数据的范围Y向最大值
    string MinY = dataSource.GetLayerInfo(0, "MinY");//数据的范围Y向最小值
    string TileSize = dataSource.GetLayerInfo(0, "TileSize");//切割数据的瓦片大小,最大为256,建议使用切割的大小设置,否则会影响效率
    string MinLevel = dataSource.GetLayerInfo(0, "MinLevel");//数据显示的最小层级
    string MaxLevel = dataSource.GetLayerInfo(0, "MaxLevel");//数据显示的最大层级

    ILayerOptions tlo = map.CreateLayerOptions("domlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "ImageLayerOptions"); //图层配置对象名称, ImageLayerOptions代表影像图层配置对象
    tlo.AddConfig("DataSourceTypeName", "mtd");//数据源类型
    //tlo.AddConfig("DataSourceTypeName", "mtd");//数据源类型
    tlo.AddConfig("Driver", "terrainquadtree");//驱动名称,terrainquadtree代表地形驱动
    tlo.AddConfig("Url", Url);//数据路径
    tlo.AddConfig("Format", Format);//数据格式
    tlo.AddConfig("Srs", Srs);//数据的坐标参考
    tlo.AddConfig("MaxX", MaxX);//数据的范围X向最大值
    tlo.AddConfig("MinX", MinX);//数据的范围X向最小值
    tlo.AddConfig("MaxY", MaxY);//数据的范围Y向最大值
    tlo.AddConfig("MinY", MinY);//数据的范围Y向最小值
    tlo.AddConfig("TileSize", TileSize);//切割数据的瓦片大小
    tlo.AddConfig("MinLevel", MinLevel);//数据显示的最小层级
    tlo.AddConfig("MaxLevel", MaxLevel);//数据显示的最大层级
    domLayer = map.CreateLayer("ImageLayer", tlo);//创建影像图层,第一项参数必须为ImageLayer
    map.AddLayer(domLayer);//添加影像图层
    domLayer.Locate();//图层定位
}
//加载地形(切割)图层
private void loadDemLayer()
{
    IDataSourceOptions dataSourceOptions = (IDataSourceOptions)map.CreateDataSourceOptions("mtd");//创建数据源配置对象,名称必须与数据源名称匹配
    //IDataSourceOptions dataSourceOptions = (IDataSourceOptions)map.CreateDataSourceOptions("mtd");//创建数据源配置对象,名称必须与数据源名称匹配
    dataSourceOptions.AddConfig("Url", readini("Path", "DemPath", "", filepath));//数据源路径
    IDataSourceObject dataSource = map.CreateDataSource(dataSourceOptions);//创建数据源对象
    long count = dataSource.GetLayerCount();//获取数据源包含图层数量
    if (count == 0)
    {
        return;
    }
    //获取数据源图层配置项
    string Url = dataSource.GetLayerInfo(0, "Url");//数据路径
    string Format = dataSource.GetLayerInfo(0, "Format");//切割形成的数据格式
    string Srs = dataSource.GetLayerInfo(0, "Srs");//数据的坐标参考
    string MaxX = dataSource.GetLayerInfo(0, "MaxX");//数据的范围X向最大值
    string MinX = dataSource.GetLayerInfo(0, "MinX");//数据的范围X向最小值
    string MaxY = dataSource.GetLayerInfo(0, "MaxY");//数据的范围Y向最大值
    string MinY = dataSource.GetLayerInfo(0, "MinY");//数据的范围Y向最小值
    string TileSize = dataSource.GetLayerInfo(0, "TileSize");//切割数据的瓦片大小,最大为16,建议使用切割的大小设置,否则会影响效率
    string MinLevel = dataSource.GetLayerInfo(0, "MinLevel");//数据显示的最小层级
    string MaxLevel = dataSource.GetLayerInfo(0, "MaxLevel");//数据显示的最大层级

    ILayerOptions tlo = map.CreateLayerOptions("demlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "ElevationLayerOptions"); //图层配置对象名称, ElevationLayerOptions代表地形图层配置
    tlo.AddConfig("DataSourceTypeName", "mtd");//数据源类型
    //tlo.AddConfig("DataSourceTypeName", "mtd");//数据源类型
    tlo.AddConfig("Driver", "terrainquadtree");//驱动名称,terrainquadtree代表地形驱动
    tlo.AddConfig("Url", Url);//数据路径
    tlo.AddConfig("Format", Format);//数据格式
    tlo.AddConfig("Srs", Srs);//数据的坐标参考
    tlo.AddConfig("MaxX", MaxX);//数据的范围X向最大值
    tlo.AddConfig("MinX", MinX);//数据的范围X向最小值
    tlo.AddConfig("MaxY", MaxY);//数据的范围Y向最大值
    tlo.AddConfig("MinY", MinY);//数据的范围Y向最小值
    tlo.AddConfig("TileSize", TileSize);//切割数据的瓦片大小
    tlo.AddConfig("MinLevel", MinLevel);//数据显示的最小层级
    tlo.AddConfig("MaxLevel", MaxLevel);//数据显示的最大层级
    demLayer = map.CreateLayer("ElevationLayer", tlo);//创建地形图层,第一项参数必须为ElevationLayer
    map.AddLayer(demLayer);//添加影像图层
}
//加载模型图层
private void loadModelLayer()
{
    ILayerOptions tlo = (ILayerOptions)map.CreateLayerOptions("demlayer");     // 创建dem图层配置,给配置起个名称,任意名称
    tlo.AddConfig("LayerOptionsName", "ModelLayerOptions");//图层配置对象名称, ModelLayerOptions代表模型图层配置对象
    //tlo.AddConfig("DataSourceTypeName", "c3ss");//数据源类型,c3s代表本地数据源
    tlo.AddConfig("DataSourceTypeName", "c3s");//数据源类型,c3ss代表服务数据源
    tlo.AddConfig("Compress", "true");//是否压缩(根据数据实际情况设置)
    tlo.AddConfig("PriorityOffset", "1.0");//结点调度优先级的偏移值
    tlo.AddConfig("Url", readini("Path", "ModelPath", "", filepath));//数据路径
    modelLayer = map.CreateLayer("ModelLayer", tlo);//创建模型图层,第一项参数为ModelLayer
    map.AddLayer(modelLayer);//添加图层
    modelLayer.Locate();//图层定位
}
//创建图层
private void createLayers_Click(object sender, EventArgs e)
{
    loadDomLayer();//加载影像(切割)图层
    loadDemLayer();//加载地形(切割)图层
    loadModelLayer();//加载模型图层
    if (measureLayer == null)
    {
        //创建图层配置信息
        var tlo = map.CreateLayerOptions("distanceMeasure");//创建分析图层配置,给配置起个名称,任意名称
        tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");//创建配置类型, AnalysisLayerOptions代表分析图层数据配置,必须是此键值对
        tlo.AddConfig("DataSourceTypeName", "as_distance");//数据源类型,代表距离测量,必须是此键值对
        tlo.AddConfig("PointColor", "0.0,0.0,1.0,1.0");//设置点击点的颜色透明度(RGBA) 1为不透明 0为透明
        tlo.AddConfig("PointSize", "5");//设置点击点的大小
        tlo.AddConfig("DistanceMeasureLineColor", "1.0,0.0,0.0,1.0"); //设置线的颜色(RGBA)
        tlo.AddConfig("LineWidth", "2");//线宽(0-10)
        tlo.AddConfig("MeasureUnit", "0");//显示单位。0-米;1-公里;2-海里
        tlo.AddConfig("MeasureUnitLanguage", "0");//显示语言。0-英文;1-中文
        tlo.AddConfig("CoordinateSystemType", "2");//显示参考系。 0-地理经纬度;1-投影坐标;2-世界坐标系;3-地心空间直角坐标系XYZ
        tlo.AddConfig("IsDepthTest", "true");//是否开启深度测试。false不开启,结果会浮在场景上,true实际显示位置    
        //创建文字符号
        var pSymbol = map.CreateSymbol("AnalysisTextSymbol");//创建文字符号,必须为AnalysisTextSymbol字符串
        pSymbol.AddConfig("FillingColor", "1.0, 0.0, 0.0, 1.0");//设置文字颜色(RGBA)
        pSymbol.AddConfig("Font", "C:\\WINDOWS\\Fonts\\STXIHEI.TTF");//设置字体类型,字体文件一定要存在
        pSymbol.AddConfig("Size", "40");//字体精度大小
        pSymbol.AddConfig("CharacterSize", "10");//文字大小
        pSymbol.AddConfig("CharacterMode", "1");//取值 1 -- 始终朝向相机
        pSymbol.AddConfig("AlignmentMode", "5");//文字对齐方式
        pSymbol.AddConfig("AxisAlignment", "6");//旋转轴 0 - 7 , 6: 自动
        pSymbol.AddConfig("RemoveDuplicateLabels", "false");//去重复            
        pSymbol.AddConfig("IsEmbolden", "false");//字体是否加粗
        pSymbol.AddConfig("IsTransform", "true");//字体是否为斜体
        pSymbol.AddConfig("IsUnderline", "false");//字体是否有下划线
        pSymbol.AddConfig("IsBack", "true");//是否设置背景色
        pSymbol.AddConfig("BackColor", "0,1.0,1.0,1");//背景颜色,是否设置背景色为true有效
        pSymbol.AddConfig("HorizonSpaceSize", "5");//字符水平间隔距离
        pSymbol.AddConfig("FieldPrecision", "2");//显示精度
        pSymbol.AddConfig("IsDepthTest", "false");//是否开启深度测试。false不开启,结果会浮在场景上,true实际显示位置
        tlo.AddConfig("IsLoad", "true");//是否加载点坐标
        tlo.AddConfig("Points", "120.218257568,30.2096201175,14.79999;120.218978696,30.2103600541,92.3124799058;");//点坐标
        tlo.AddConfig("IsActive", "false");//是否激活测量
        //创建样式
        var pStyle = map.CreateStyle("Text");//创建Style,名字可以任意
        pStyle.AddSymbol("AnalysisTextSymbol", pSymbol.GetConfig());//添加文字符号到Style里,第一参必须为AnalysisTextSymbol字符串,第二参为上面创建的文字符号的配置信息,通过pSymbol.GetConfig()获取
        //将样式添加到图层配置里
        tlo.AddConfig("Style", pStyle.GetConfig());//第一参必须为Style字符串,第二参为上面创建的Style的配置信息,通过pStyle.GetConfig()获取
        measureLayer = map.CreateLayer("AnalysisLayer", tlo);//创建分析图层,第一项参数必须为AnalysisLayer
        map.AddLayer(measureLayer);//添加分析图层
    }
    else
    {
        MessageBox.Show("请勿重复创建!");
    }
}

//创建视点图层
private void createViewPointLayer()
{
    if (viewPointLayer == null)
    {
        var tlo = map.CreateLayerOptions("ViewPointLayer");
        tlo.AddConfig("LayerOptionsName", "ViewPointLayerOptions");//创建配置类型, ModelLayerOptions代表模型数据配置,必须是此键值
        tlo.AddConfig("Auto", "1");//auto为1为获取当前视点,为0则为根据参数定位                                  
        tlo.AddConfig("IsGeoPoint", "false");//视点有起始点和目标点之分,true为目标点,即视线终点;false为起始点,即视线起点
        viewPointLayer = map.CreateLayer("ViewPointLayer", tlo);
        map.AddLayer(viewPointLayer);
    }
    else
    {
        MessageBox.Show("图层已存在,无需重复创建!");
    }
}
//图层序列化
private void serializeLayers_Click(object sender, EventArgs e)
{
    domLayer.SerializeLayer("D:\\dom.xml");//序列化只可序列化至本地路径
    modelLayer.SerializeLayer("D:\\model.xml");//序列化只可序列化至本地路径
    demLayer.SerializeLayer("D:\\osgb.xml");//序列化只可序列化至本地路径
    measureLayer.SerializeLayer( "D:\\measure.xml");//序列化只可序列化至本地路径
    createViewPointLayer();
    viewPointLayer.SerializeLayer("D:\\viewpoint.xml");//序列化只可序列化至本地路径
}

//移除图层
private void removeLayers_Click(object sender, EventArgs e)
{
    if (domLayer!=null)
    {
        map.RemoveLayer(domLayer);
        domLayer = null;
    }
    if (modelLayer!=null)
    {
        map.RemoveLayer(modelLayer);
        modelLayer = null;
    }
    if (demLayer != null)
    {
        map.RemoveLayer(demLayer);
        demLayer = null;
    }
    if (measureLayer != null)
    {
        map.RemoveLayer(measureLayer);
        measureLayer = null;
    }
    if (viewPointLayer != null)
    {
        map.RemoveLayer(viewPointLayer);
        viewPointLayer = null;
    }

}
//图层本地反序列化
private void deserializeLayers_Click(object sender, EventArgs e)
{
    domLayer= map.DeserializeLayer("D:\\dom.xml");
    modelLayer = map.DeserializeLayer("D:\\model.xml");
    demLayer = map.DeserializeLayer("D:\\osgb.xml");
    measureLayer = map.DeserializeLayer("D:\\measure.xml");
    viewPointLayer = map.DeserializeLayer("D:\\viewpoint.xml");
    if (viewPointLayer!=null)
    {
        viewPointLayer.Locate();
    }
}
//图层网络反序列化
private void deserializeLayers_Click(object sender, EventArgs e)
{
    domLayer= map.DeserializeLayerByUrl("http://192.168.1.50:8088/files1/dom.xml");
    modelLayer = map.DeserializeLayerByUrl("http://192.168.1.50:8088/files1/model.xml");
}

results matching ""

    No results matching ""