dysh0217
路人甲
路人甲
  • 注册日期2007-10-18
  • 发帖数7
  • QQ
  • 铜币123枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:3421回复:4

MapObjects的二次开发之添加图层

楼主#
更多 发布于:2007-11-15 11:32
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>
喜欢0 评分0
lidongsmile
路人甲
路人甲
  • 注册日期2004-12-23
  • 发帖数2
  • QQ
  • 铜币104枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2007-12-16 11:52
<img src="images/post/smile/dvbbs/em02.gif" /><img src="images/post/smile/dvbbs/em01.gif" />
举报 回复(0) 喜欢(0)     评分
虎落平阳
路人甲
路人甲
  • 注册日期2005-12-17
  • 发帖数3
  • QQ
  • 铜币110枚
  • 威望0点
  • 贡献值0点
  • 银元0个
2楼#
发布于: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" />
举报 回复(0) 喜欢(0)     评分
aqi0530
路人甲
路人甲
  • 注册日期2008-06-28
  • 发帖数10
  • QQ
  • 铜币88枚
  • 威望0点
  • 贡献值0点
  • 银元0个
3楼#
发布于: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" />
举报 回复(0) 喜欢(0)     评分
liumiao
路人甲
路人甲
  • 注册日期2008-05-06
  • 发帖数9
  • QQ
  • 铜币122枚
  • 威望0点
  • 贡献值0点
  • 银元0个
4楼#
发布于:2009-11-16 20:43
<img src="images/post/smile/dvbbs/em01.gif" />
举报 回复(0) 喜欢(0)     评分
游客

返回顶部