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