这几天要在程序中添加一个显示地图的功能。Boss说是在给客户演示的时候比较....额。看上去比较正式.
看了一天GDAL各种看不懂。很多博客的教程都是说怎么用GDAL读Shp数据,图层属性,改其中的字段之类的,找不到有介绍怎么把地图显示到界面上的文章。于是自己摸索着用了一个开源的 MapWinGIS.ocx 控件来显示地图 简要的记录一下过程.
1 注册控件mapwingis.ocx
regsvr32 ..\.路径\mapwingis.ocx
2 在VS2010里添加控件
添加方法 : 工具栏上点击右键->选择项->COM组件->勾选Map Control
添加MapControl控件调整属性
2 stdafx.h添加如下代码 (MapWinGIS.ocx控件在当前目录的MapGis SDK目录下)
#import "..\MapWinGIS_SDK\MapWinGIS.ocx" rename_namespace("mapWindow") rename("GetObject", "GISGetObject")
2 InitInstance 函数中初始化OLE库
- // 初始化 OLE 库
- if (!AfxOleInit())
- {
- //AfxMessageBox(IDP_OLE_INIT_FAILED);
- return FALSE;
- }
3 添加一个ActiveX控件中的MFC类 CGisMap
4 包含 CGisMap类所在的头文件 实例化一个对象
CGisMap m_Map;
5 添加一个打开地图按钮测试效果
- //打开图像
- void CDlgMap::OnBnClickedOk()
- {
- char szFilter[] = "GeoTiff (*.shp)|*.shp|All Files (*.*)|*.*||";
- CString filePath("");
- CFileDialog fileOpenDlg(TRUE, "shp", NULL,OFN_HIDEREADONLY,szFilter);
- if (fileOpenDlg.DoModal() == IDOK)
- {
- if (filePath = fileOpenDlg.GetPathName())
- {
- if (filePath.IsEmpty())
- {
- return;
- }
- }
- }
- // 创建shp接口打开shp文件加入地图
- mapWindow::IShapefilePtr pShapefilebound;
- pShapefilebound.CreateInstance(__uuidof(mapWindow::Shapefile));
- DWORD dd = GetLastError();
- pShapefilebound->Open(_bstr_t(filePath),false);
- m_Map.AddLayer(pShapefilebound,true);
- }
![](https://i-blog.csdnimg.cn/blog_migrate/8579a2ebe89c04c69bf4dfba504eabc3.png)
注意:
在exe中初始化ole 只需要
- if (!AfxOleInit())
- {
- //AfxMessageBox(IDP_OLE_INIT_FAILED);
- return FALSE;
- }
而在dll中初始化ole则麻烦一些 如果初始化不成功。在调用 pShapefilebound.CreateInstance(__uuidof(mapWindow::Shapefile));
时候会失败!.
- <pre name="code" class="cpp">BOOL CMapVialGdalApp::InitInstance()
- {
- HRESULT hr = OleInitialize(NULL);
- if(hr ==S_FALSE)
- {
- OleUninitialize();
- }
- //Call if using OLE Controls
- AfxEnableControlContainer();
- // Register all OLE server (factories) as running. This enables the
- // OLE libraries to create objects from other applications.
- COleObjectFactory::RegisterAll();
- return CWinApp::InitInstance();
- return TRUE;
- }</pre><br>
- <br>
- <pre></pre>
- <p></p>
- <pre></pre>
- <p></p>
- <pre></pre>
- <p></p>
- <p>对话框的类在OnInitDialog中还要调用一次</p>
- <p>AfxEnableControlContainer(); 如果不添加就会在C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\src\mfc\occcont.cpp 的 InitControlContainer函数中如下位置报错。..我很菜,不明白为什么.....</p>
- <p></p>
- <p>TRY</p>
- <p> {</p>
- <p><span style="white-space:pre"></span><span style="white-space:pre"></span><span style="white-space:pre"></span>m_pCtrlCont = afxOccManager->CreateContainer(<span style="color:rgb(0,0,255)">this</span>);</p>
- <p> }</p>
- <p> END_TRY<br>
- <br>
- <br>
- <br>
- <br>
- <span style="font-family:Arial; font-size:14px; line-height:26px; text-align:left; white-space:pre">/************************************************/</span><br style="font-family:Arial; font-size:14px; line-height:26px; text-align:left; white-space:pre">
- <span style="font-family:Arial; font-size:14px; line-height:26px; text-align:left; white-space:pre"></span><span style="font-family:Arial; font-size:14px; line-height:26px; text-align:left; white-space:pre">`╰Witchつ ---2012年5月30日</span><br style="font-family:Arial; font-size:14px; line-height:26px; text-align:left; white-space:pre">
- <span style="font-family:Arial; font-size:14px; line-height:26px; text-align:left; white-space:pre"></span><span style="font-family:Arial; font-size:14px; line-height:26px; text-align:left; white-space:pre"> http://blog.csdn.net/Witch_Soya</span><br style="font-family:Arial; font-size:14px; line-height:26px; text-align:left; white-space:pre">
- <span style="font-family:Arial; font-size:14px; line-height:26px; text-align:left; white-space:pre"></span><span style="font-family:Arial; font-size:14px; line-height:26px; text-align:left; white-space:pre">/************************************************/</span><br>
- </p>