-->小诗
通过SuperMap iObjects C++之数据源管理或者是产品入门中的示例,我们已经知道了如何打开一个工作空间或者是一个数据源,那么如何将数据添加到地图中呢?以及如何对数据设置想要的风格?本文就SuperMap中图层的相关知识点基于SuperMap iObjects C++给大家做一个详细的介绍。
1、如何将数据添加到地图:
void MapExample::findEachTypeDataFromFile()
{
UGDataSource *dataSource = NULL;
dataSource = m_pWorkspace->GetDataSource(0);
UGDataset *dataset_Point = NULL;
UGDataset *dataset_Line = NULL;
UGDataset *dataset_Region = NULL;
// 取出DataSource中的最后一个Point、Line、Region类型的dataSet
UGint datasetCount = dataSource->GetDatasetCount();
for (UGint i=0; i<datasetCount; i++)
{
UGDataset *dataset = dataSource->GetDataset(i);
if(dataset->GetType() == UGDataset::Point)
{
dataset_Point = dataset;
}
if(dataset->GetType() == UGDataset::Line)
{
dataset_Line = dataset;
}
if(dataset->GetType() == UGDataset::Region)
{
dataset_Region = dataset;
}
}
// 用自己实现的方法将dataset展示到地图中
UGLayer* layer_Point= appendDatasetToMap(dataset_Point);
UGLayer* layer_Line= appendDatasetToMap(dataset_Line);
UGLayer* layer_Region= appendDatasetToMap(dataset_Region);
}
UGLayer* MapExample::appendDatasetToMap(UGDataset* pDataset)
{
// 判断数据有效性
if(pDataset == NULL)
{
return NULL;
}
//获取到用于显示的MapEditorWnd中的map
UGMap* pMap = m_pMap;
// 将Dataset添加到地图中
UGLayer* pLayer = pMap->m_Layers.AddDataset(pDataset, pDataset->GetType());
return pLayer;
}
上面的操作就实现了获取到工作空间中的第一个数据源中分别获取到了最后一个点、线、面各一个类型的数据集。然后将点、线、面、分别加到一个新的地图中。默认加载的时候,组件会自动给图层随机的设置一个默认的风格。如果想要设置为自己想要的风格的话,需要单独进行设置。接着往下面看。
2、给图层设置需要的风格;
设置风格作用于地图的图层上,一个图层中的对象统一采用图层的风格进行显示。风格设置通过 UGStyle 完成;通过图层的风格接口将所设置好的风格传入,这样地图中该图层将以给定的风格进行符号化显示。为了给你更深入的指导,下面的将一一为你介绍如何设置地图中矢量图层——点、线、面的风格,基于这几种简单的应用,再结合我们提供的其他资料,就能很轻松地完成更为复杂的地图符号化的应用了。
为了更好的方便大家理解,这里要引入一个新的概念:符号资源库,在SuperMap中,所有的点、线、面的风格模板都是存在在符号风格库的,而符号风格库又存储在工作空间中(*.smwu),也就是说,当你打开一个工作空间或者是new一个UGWorkspace的时候,里面就已经存在有符号资源库了,符号资源库可以根据自己想要的效果进行自行定制,这里就不做过多的介绍了。可以借助与SuperMap iDesktop 来帮助大家理解。看下图,我们最后在代码中需要使用到的就是符号id,比如下面点符号库中的五角星的符号id是318。如果我想要点符号设置为该五角星,就需要记住这个id,至于代码中如何实现,跟着往下看。
设置点图层风格
要点:
(1)创建一个符号风格对象(UGStyle),然后设置所需要的点风格,包括所使用的符号、颜色、符号大小、旋转角度等。
(2)将符号风格通过图层风格设置接口传入,该点图层将以所指定的风格显示点对象。
void MapExample::setPointLayerStyle( UGLayer* layer )
{
// 创建一个风格并设置其属性
UGStyle styl_point;
styl_point.SetMarkerStyle(318); // 设置符号(就是上面提到过的符号库中对应符号的id)
styl_point.SetMarkerHeight(20); // 设置符号高度
styl_point.SetMarkerWidth(50); // 设置符号宽度
styl_point.SetLineColor(UGRGB(255,0,255));// 设置符号颜色
styl_point.SetMarkerAngle(PI/2); // 设置符号偏转角度
// 给图层设置风格
layer->SetStyle(styl_point);
}
设置线图层风格
要点:
(1)创建一个符号风格对象(UGStyle),然后设置所需要的线型风格,包括所使用的符号、颜色、线条粗细等。
(2)将符号风格通过图层风格设置接口传入,该线图层将以所指定的风格显示线对象。
void MapExample::setLineLayerStyle( UGLayer* layer )
{
// 创建一个风格并设置其属性
UGStyle styl_line;
styl_line.SetLineStyle(27); // 设置号样式(上面提到过的符号库中对应符号的id)
styl_line.SetLineColor(UGRGB(255,0,122));// 设置符号颜色
// 给图层设置风格
layer->SetStyle(styl_line);
}
设置面图层风格
要点:
(1)创建一个符号风格对象(UGStyle),然后设置所需要的面对象风格,包括所使用的面填充样式、填充颜色、面边界的线条风格等。
(2)将符号风格通过图层风格设置接口传入,该面图层将以所指定的风格显示面对象。
void MapExample::setRegionLayerStyle( UGLayer* layer )
{
// 创建一个风格并设置其属性
UGStyle styl_Region;
styl_Region.SetFillStyle(54); // 设置填充符号样式(上面提到过的符号库中对应符号的id)
styl_Region.SetFillForeColor(UGRGB(122,50,63));// 设置填充符号颜色
styl_Region.SetFillBackColor(UGRGB(1,1,1)); // 设置背景填充颜色
styl_Region.SetLineStyle(19); // 设置线条符号样式
// 给图层设置风格
layer->SetStyle(styl_Region);
}
3、修改图层顺序
上面实现了将数据添加到地图,并且给图层设置了需要的风格,接下来再给大家讲解一下,如何调整地图中图层的顺序,地图中图层顺序是按照从上到下进行渲染,如果点数据的图层放在下面了,那点就被遮盖住了,看不见了,这个时候就需要根据对应的需求来调整一下各个图层的顺序。
下面示例一下将最上面的图层往下移动一层;其他往上,或者是置顶也是一样的,接口都在UGLayers类对象中,就不一一举例了。
void MapExample::MoveDownLayer( )
{
UGLayers& layers = m_pMapEditorWnd->m_mapWnd.m_Map.m_Layers;
//将索引为0的图层往下移动一层;
layers.MoveDown(0);
m_pMapEditorWnd->m_mapWnd.m_Map.SetRefreshFlag(true);
m_pMapEditorWnd->SendInvalidateFunc();
//保存地图;
m_pMapEditorWnd->m_mapWnd.m_Map->Save();
}