参考原文: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")
在Resource.h中为即将新建的地图窗口添加一个资源ID:
#define IDC_MAP 140
在视图类添加一个CDMap0的私有变量:
CDMap0 m_Map;
//动态创建地图窗口
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;
}
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;
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 文件:
原文:http://blog.csdn.net/liyuan_669/article/details/40867137