首页 > 代码库 > mfc 通过 MapWinGIS 控件读取 shp 文件

mfc 通过 MapWinGIS 控件读取 shp 文件

记录一下这两天努力的收获,刚来这个公司一周不到,这几天一直在看GIS相关的东西。
首先调通了第一个android 通过 jni 调用 C/C++代码
然后花了两天做了一个mfc 用 MapWinGIS.ocx 控件读取shp格式文件
哎。。。回头看看,这么简单的东西竟然用了两天时间,简直太浪费时间了
没办法,新手上路不容易呀!

参考原文:http://blog.csdn.net/clever101/article/details/5286575


下面记录一下读取 shp文件的操作过程:

MapWinGIS是一个不错的开源组件GIS项目,其核心是一个名字为MapWinGIS的ActiveX控件,开发人员可以利用这个ActiveX组件在自己的系统中添加GIS的相关功能,例如地图显示;在图层上标绘点,线,图形;计算长度,存取GIS数据等相关工作。

原码下载:http://download.csdn.net/detail/liyuan_669/8129683

编程过程:   MapWinGIs.ocx下载

注册MapWinGIS ActiveX组件。运行cmd:输入regsvr32  C:\MapWinGIS.ocx(注意:C:\MapWinGIS.ocx 为MapWinGIS.ocx 存放的绝对路径,改为自己路径即可)

首先使用vs2010 新建一个单文档工程:MapGis,为控件添加一个ACtiveX控件中的MFC类,如下图:



接着在注册表中选择Map Control<1.0>,为接口_DMap添加一个CDMap0类,具体如下图:




现在开始编码:

首先打开 stdafx.h, 在其中加入:


#import "C:\MapWinGIS\MapWinGIS.ocx" rename_namespace("mapWindow") rename("GetObject", "GISGetObject")

"C:\MapWinGIS\MapWinGIS.ocx" 为MapWinGIS.ocx 解压后的存放路径,改为自己的即可


在Resource.h中为即将新建的地图窗口添加一个资源ID:

#define IDC_MAP  		140


在视图类添加一个CDMap0的私有变量:

CDMap0  m_Map;

添加视图类的WM_CREATE消息的响应函数,动态创建地图窗口,具体代码如下:

//动态创建地图窗口
	int CMapGisView::OnCreate(LPCREATESTRUCT lpCreateStruct)
	{
		if (CView::OnCreate(lpCreateStruct) == -1)
			return -1;

		// TODO:  在此添加您专用的创建代码
		CRect rcmap;
		GetClientRect(rcmap);
		m_Map.Create(NULL,WS_CHILD|WS_VISIBLE|WS_BORDER,rcmap,this,IDC_MAP);

		return 0;
	}

添加视图类的WM_SIZE消息的响应函数,加入如下代码以使地图控件占满整个视图:

void CMapGisView::OnSize(UINT nType, int cx, int cy)
	{
		CView::OnSize(nType, cx, cy);

		// TODO: 在此处添加消息处理程序代码
		if(m_Map.m_hWnd == NULL)
			return;   
		if(IsWindow(m_Map.m_hWnd)) //判断给定的窗口句柄是否标识一个已存在的窗口
		{
			CRect rc;
			this->GetClientRect(&rc);
			m_Map.MoveWindow(&rc,FALSE);      
			m_Map.ZoomToPrev(); 
		}
	}

在视图类添加一个CString类型的私有变量m_strFilePath用于保存tif图像或者shp文件的路径,接着在视图类为菜单"打开"添加一个命令消息函数:OnFileOpen:


CString  m_strFilePath;


OnFileOpen函数的代码如下:

	void CMapGisView::OnFileOpen()
	{
		// TODO: 在此添加命令处理程序代码

		TCHAR szFilters[]= _T("SHP Files (*.shp)|*.shp||");
		
		CFileDialog fileDlg (TRUE,_T("shp"),_T("*.shp"),
			OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, szFilters, this);

		if( fileDlg.DoModal() == IDOK )
		{
			m_strFilePath = fileDlg.GetPathName();

			if (_T("")!=m_strFilePath)
			{
				// 先删除所有图层
				m_Map.RemoveAllLayers();
				// 创建shp接口打开shp文件加入地图
				mapWindow::IShapefilePtr pShapefilebound;
				pShapefilebound.CreateInstance(__uuidof(mapWindow::Shapefile));
				pShapefilebound->Open(_bstr_t(m_strFilePath),false);

				m_Map.AddLayer(pShapefilebound,true);
			}
			// 发送视图重绘消息
			Invalidate();
		}
	}


程序运行效果图如下:

全国地图 shp 1:400万 下载

打开 shp 文件:





mfc 通过 MapWinGIS 控件读取 shp 文件