功能说明:利用CFileDialog可同时添加MAX_PATHARRAY个图层/图片,(MAX_PATHARRAY大小自己定义,例如#define MAX_PATHARRAY (30) )。图片支持格式为:shp,bmp,jpg,等。
前提:我觉得读者首先需要对Shape文件有所了解,才便于运用
①Shape文件是地图数据的矢量形式。它由一个主文件,一个索引文件和一个dBase表3个文件组成
②一个Shape文件包含一种图形类型(点,线,面)。一幅完整的地图需要多个Shape文件
举个例子:一幅完整的北京地图,用面表示各个区polygon.shp,用线表示各个交通干线line.shp,用点表示其中的政府大楼point.shp,这样三个Shape文件一层一层叠加起来,(注意:面放在最底层,线放在中间层,点放在最上层)我们就可以看到整个北京那个区有政府大楼,而在这些政府大楼之间又有哪些交通路线可以走。
所需要的MapObjects对象:
CMoDataConnection:用于建立MAP控件和某个存放了shapefiles,coverage,CAD数据的文件目录或某个存放了SDE数据库的服务器之间的连接关系,它是Map控件对地图数据进行访问的门户。
CMoGeoDatasets:(空间数据集合对象)是存放在某个文件夹下的所有空间数据集对象的集合,因此称为空间数据集合对象
★CMoLayers:(要素层集合对象)相当于图层集合,用于对所有图层(矢量数据和影像数据)进行管理。实现添加,删除,以及改变图层压盖关系等操作。
CMoMapLayer:用于挂接一个矢量图层数据
CMoImageLayer:用于连接一个具有空间定位信息的影像数据。
其中还涉及到图层符号化。本文只粗略提出,InitialLayerSymbol如若读者不是很明白也不需要担心,可以先采用图层符号默认显示来处理。
矢量数据添加步骤:(具体事例参看AddShpLayer函数)
1.创建连接
1)创建数据连接对象
CMoDataConnection connection;
if (!connection.CreateDispatch(TEXT("MapObjects2.DataConnection")))
return "";
2)设置要连接的数据所在路径(路径Path)
connection.SetDatabase(Path);
3)连接路径Path
if (!connection.Connect())
return "";
2. 连接相应的矢量数据集 (即一个要素层)
1)获得Map控件对应的要素层集合对象
CMoLayers layers = m_mapObject.GetLayers();
2)创建矢量数据层对象A
CMoMapLayer mapLayer;
if (! mapLayer.CreateDispatch(TEXT("MapObjects2.MapLayer")))
return "";
3)创建一个空间数据集对象B
CString layerName = FileName/// FileName表示数据名称
CMoGeoDataset geoDataset = connection.FindGeoDataset(layerName);
if (!geoDataset)
return "";
4)将A 与B进行连接,即给矢量数据层挂上相应的空间数据集
mapLayer.SetGeoDataset(geoDataset);
5)对新添加的矢量数据进行符号化
CMoSymbol layerSymbol(mapLayer.GetSymbol());
layerSymbol.SetColor(RGB(255, 0, 0));
layerSymbol.SetSize(5);
layerSymbol.SetStyle(填写你要设置的类型);
6)向要素层添加矢量数据
layers.Add(mapLayer);
影像数据的添加,我就不在逐一解释。相信通过矢量数据添加的理解,读者对于影响数据的添加也能独自分析的很明白。请看实例AddImageLayer
以下就是具体代码了:)
void XXX::OnFileNew()
{
CString csFilter = "Windows Bitmap(*.bmp; *.dib)|*.bmp; *.dib|JFIF (*.jpg)|*.jpg|ESRI Shapefiles (*.shp)|*.shp|GIF(*.gif)|*.gif|ERDAS(*.gis; *.lan)|*.gis; *.lan|Imagine(*.img)|*.img|All supported vector formats(*.*)|*.*||";
//文件类型说明和扩展名间用 | 分隔,同种类型文件的扩展名间可以用 ; 分割,每种文件类型间用 | 分隔,末尾用 || 指明。
CFileDialog mFileDlg(TRUE, NULL,NULL,
OFN_ALLOWMULTISELECT,
(LPCTSTR)csFilter,
AfxGetMainWnd());
CString pathName="";
//---------
mFileDlg.m_ofn.lpstrFile=new TCHAR[NAMEBUF]; // 重新定义 lpstrFile 缓冲大小
memset(mFileDlg.m_ofn.lpstrFile,0,NAMEBUF); // 初始化定义的缓冲
mFileDlg.m_ofn.nMaxFile = NAMEBUF; // 重定义 nMaxFile
//------------
if(mFileDlg.DoModal ()==IDOK)
{
POSITION mPos=mFileDlg.GetStartPosition();
for (int i=0; mPos!=NULL && i< MAX_PATHARRAY; i++)
{
pathName=mFileDlg.GetNextPathName(mPos);
m_mapPathArray[i] = pathName;
//将所有的地图数据保存起来,这一点请读者自己完成。
TRACE("%s/n",pathName);
}
//将图片导入显示
OnClearAllTheme(); //删除原有的图层,读者可以讲该函数屏蔽看一下效果。
//屏蔽后看一下不同的顺序添加图层会有什么效果。多实践,多观察。
CString fileType = GetFileType(pathName);
fileType.MakeLower();
if (strcmp(fileType, "shp") ==0)
{
AddShpLayer(pathName); //添加shp文件
}
else if(strcmp(fileType, "jpg") ==0 || strcmp(fileType, "bmp") ==0)//jpg,bmp,
{
AddImageLayer(pathName); //添加bmp,jpg文件
}
}
else
TRACE("IDCANCLE/n");
delete [] mFileDlg.m_ofn.lpstrFile; // 切记使用完后释放资源
}
void XXX::AddImageLayer(const CString &imagefile_name)
{
CMoDataConnection connection;
if (! connection.CreateDispatch(TEXT("MapObjects2.DataConnection")))
return;
connection.SetDatabase(GetFileDirctory(imagefile_name));
if (! connection.Connect())
return;
CMoLayers layers(m_mapObject.GetLayers());
CMoImageLayer image;
if (! image.CreateDispatch(TEXT("MapObjects2.ImageLayer")))
return;
image.SetFile(imagefile_name);
layers.Add(image);
layers.MoveToBottom(0);
}
void XXX::OnClearAllTheme()
{
CMoLayers layers = m_mapObject.GetLayers();
layers.Clear();
}
CString XXX::AddShpLayer(const CString &VectorFileName)
{
//创建数据连接对象
CMoDataConnection connection;
if (!connection.CreateDispatch(TEXT("MapObjects2.DataConnection")))
return "";
connection.SetDatabase(GetFileDirctory(VectorFileName));
if (!connection.Connect())
return "";
CMoLayers layers = m_mapObject.GetLayers();
CMoMapLayer mapLayer;
if (! mapLayer.CreateDispatch(TEXT("MapObjects2.MapLayer")))
return "";
CString layerName = GetFileTile(VectorFileName);
CMoGeoDataset geoDataset = connection.FindGeoDataset(layerName);
if (!geoDataset)
return "";
mapLayer.SetGeoDataset(geoDataset);
//设置是否显示当前图层
mapLayer.SetVisible(TRUE);
//**符号化**//
//**进行符号化定义**//
InitialLayerSymbol(mapLayer);
layers.Add(mapLayer);
return(mapLayer.GetName());
}
void XXX::InitialLayerSymbol(CMoMapLayer &mapLayer)
{
CMoSymbol layerSymbol(mapLayer.GetSymbol());
int symbolSize = 2;
long shapType = mapLayer.GetShapeType();
//若为点状
if (shapType == 21 || shapType == 24)
{
layerSymbol.SetSymbolType(0);//将符号对象设置成点状符号
layerSymbol.SetColor(RGB(255, 0, 0));
layerSymbol.SetSize(symbolSize);
short moTriangleMarker = 2;
layerSymbol.SetStyle(moTriangleMarker);//将符号类型设置成三角形
}
//若为线状
else if (shapType == 22)
{
layerSymbol.SetSymbolType(1);
layerSymbol.SetColor(RGB(0,0,255));
layerSymbol.SetSize(symbolSize);
short moDashLine = 1;
layerSymbol.SetStyle(moDashLine);//将符号设置成虚线
}
else
{
layerSymbol.SetSymbolType(2);
layerSymbol.SetColor(RGB(0, 255, 110));
layerSymbol.SetSize(symbolSize);
short moGrayFill = 8;
layerSymbol.SetStyle(moGrayFill);
}
}