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");
}