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 文件:

时间: 2024-11-05 15:56:31

mfc 通过 MapWinGIS 控件读取 shp 文件的相关文章

mfc通过MapWinGIS控件读取shp文件(不通过#import实现)

1.首先注册MapWinGIS ActiveX组件, 引入MapWinGIS.ocx产生的MapWinGIS_i.h和MapWinGIS_i.c文件,利用CoCreateInstance函数来调用 演示代码: /*在工程中加入MapWinGIS_i.c文件,该文件定义了类和接口的guid值,如果不引入的话,会发生连接错误.*/ #include "MapWinGIS_i.h" CoInitialize(NULL); IShapefile* ptr = NULL; HRESULT hr

可视化webpart基础开发——TreeView控件读取文档库中的所有文件夹和文件(递归方法读取)

可视化webpart基础开发——TreeView控件读取文档库中的所有文件夹和文件(递归方法读取) 分类: SharePoint2011-12-23 14:44 1584人阅读 评论(0) 收藏 举报 文档sharepointurl测试stringforms 可视化webpart基础开发——TreeView控件读取文档库中的所有文件夹和文件(递归方法读取) 1.在部署的sharepoint网站中新建一个名为“测试文档库”的文档库,并添加各级的子文件夹和子文件,用于测试 2.在VS2010中新建空

[VC/MFC]虚拟列表控件

[VC/MFC]虚拟列表控件 一.什么是虚拟列表控件 虚拟列表控件是指带有LVS_OWNERDATA风格的列表控件.. 二.为什么使用虚拟列表控件 我们知道,通常使用列表控件CListCtrl,需要调用InsertItem把要显示的数据插入列表中,之后我们就不必关心数据在哪里了,这是因为控件自己开辟了内存空间来保存这些数据.现在假设我们要显示一个数据库,里面的信息量很大,有几十万条记录.通常有两种方法解决这个问题:1是仅仅在ListCtrl中插入少量的数据,比如100个,然后通过[上一页][下一

MFC动态创建控件及添加消息响应

MFC动态创建控件及添加消息响应 分类: 控件技术2013-01-24 14:12 7020人阅读 评论(0) 收藏 举报 转载地址:http://blog.csdn.net/luy3728000/article/details/8193918 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态控件: 为了对照,我们先来看一下静态控件的创建. 放置静态控件时必须先建立一个容器,一般是对话框,这时我们在对话框编辑窗口中,从工具窗口中拖出所需控件放

MFC中按钮控件的用法笔记(转)

VC学习笔记1:按钮的使能与禁止 用ClassWizard的Member Variables为按钮定义变量,如:m_Button1:则m_Button1.EnableWindow(true); 使按钮处于允许状态m_Button1.EnableWindow(false); 使按钮被禁止,并变灰显示 VC学习笔记2:控件的隐藏与显示 用CWnd类的函数BOOL ShowWindow(int nCmdShow)可以隐藏或显示一个控件. 例1:CWnd *pWnd;pWnd = GetDlgItem(

【转】MFC对话框和控件

原文网址:http://www.cnblogs.com/tiwlin/archive/2013/05/08/3067966.html 对话框和控件 对话框是Windows应用程序中一种常用的资源,其主要功能是输出信息和接收用户的输入数据.控件是嵌入在对话框中或其它父窗口中的一个特殊的小窗口,它用于完成不同的输入.输出功能.对话框与控件关系密切,在每个对话框上一般都有一些控件,对话框依靠这些控件与用户进行信息的交互. 在MFC中,对话框的功能被封装在CDialog类中,而CDialog类是CWnd

MFC List Control控件添加单元格编辑和单元格下拉列表项以适用于数据库相关操作

作为现代的软件,往往是连着数据库的,而连着和用户方便地操作之间,还有着界面这道坎.MFC是Windows上比较好开发用户界面的框架,然而其自带的控件中没有对于数据库表格支持较好的控件,而使用网上提到的 DataGrid 等控件在本人的win8.1+VS2013平台上老出现找不到控件或者头文件的问题,搞的烦死人.最后想到 List Control 控件只要稍作修改,加上单元格编辑和单元格下拉列表,其实就能和数据库进行良好的对接,一百度,果然有人已经做了这件事,实在是太让人感动了!       

MFC可视化 列表控件的使用

1.应该加入头文件 #include <Atlbase.h> 2.示例 类向导给列表控件绑定变量m_list DWORD   dwExStyle=LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_HEADERDRAGDROP|LVS_EX_ONECLICKACTIVATE|LVS_EX_FLATSB; m_list.ModifyStyle(0,LVS_REPORT|LVS_SINGLESEL|LVS_SHOWSELALWAYS);m_list.SetEx

VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程

开篇语:最近在弄ocx控件发布到asp.net网站上使用,就是用户在使用过程中,自动下载安装ocx控件.(此文章也是总结了网上好多人写的文章,我只是汇总一下,加上部分自己的东西,在这里感谢所有在网上发表相关内容的朋友们.) ActiveX控件用于Web的过程是将控件嵌入主页中,用户通过浏览器访问该主页时,将主页中的控件下载,并在用户机器上注册,以后就可在用户的浏览器上运行.控件下载一次后就驻留在用户本地机器上,下次再访问相同的主页时,可不再下载该控件,而是直接运行用户本地的控件.这里控件容器就是