MapObjects的二次开发之添加图层

 
功能说明:利用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);
       }
}
 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值