记录一下这两天努力的收获,刚来这个公司一周不到,这几天一直在看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 文件: