标签:mapwingis
mapwingis是个免费的开源插件,官网上的教程大多都是c#的。最近做的一个project是用的MFC,怎么调用他的接口了,网上的资料比较少,大多数都只有说到怎么显示矢量或者影像数据就结束了,但是这样的话,一打开图片光标的默认状态是放大,鼠标左键单击一下是当大,右键是缩小,拖动是选中放大,怎么实现像他给的demo中点击放大,或者缩小,平移按钮切换鼠标状态来完成相应的操作,mapwingis这些操作都是封装好了的,只是c++的调用接口没有详细说明(也可能是我没在官网找到。。。),网上有说是版本问题,说低版本有提供接口修改,我安装了几个低版本的也没有什么变化,还是改变不了。。还行先记录一下怎么在MFC中使用mapwingis插件,最后在说一下怎么改变光标状态。
1、在官网下载mapwingis的安装程序http://mapwingis.codeplex.com/releases/view/541892,下载后直接默认安装,最后不要改安装路径,我没有测试改了后的情况。默认安装完成后会在c盘出现这个目录C:\dev\MapWinGIS,记住这个目录,后面会用到的。
2、用vs2012(其他的版本应该也可以)新建一个单文档或者多文档程序,接着在这个位置点击新建一个类
然后在这个位置选择添加activex控件的类
3、 stdafx.h文件中添加
#import "C:\dev\MapWinGIS\MapWinGIS.ocx" rename_namespace("mapWindow") rename("GetObject", "GISGetObject")Resource.h中添加
#define IDC_MAP 140只有保证ID不重复即可
4、在视图类添加一个变量
CDMap m_Map;这个CDMap类是之前导入activex类的时候生成的。我是直接用公有的变量,不安全?暂时还没遇到。。
5、添加视图类的WM_CREATE消息的响应函数,动态创建地图窗口,具体代码如下:
int CXXView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: 在此添加您专用的创建代码 CRect rect; GetClientRect(&rect); m_Map.Create(NULL,WS_CHILD | WS_VISIBLE | WS_BORDER,rect,this,IDC_MAP); return 0; }
void CXXView::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 rect; GetClientRect(&rect); m_Map.MoveWindow(rect,FALSE); m_Map.ZoomToPrev(); } }7、接下来就是要显示了,可以在DOC类中利用默认的Serialize函数获得文件路径,比如这样:
#pragma warning(disable:4996) // 调用strlwr 函数的时候会出错 不加这句的的话
void CSeXXDoc::Serialize(CArchive& ar) { if (ar.IsStoring()) { // TODO: 在此添加存储代码 } else { // TODO: 在此添加加载代码 CFile *p_file = ar.GetFile(); CString filePathTem = m_filePath; CString fileExtTem = m_fileExt; m_filePath = p_file->GetFilePath(); char * nameTem = m_filePath.GetBuffer(); char * ext = strlwr(strrchr(nameTem,'.') + 1); m_fileExt = ext; CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd(); CXXView * pView = (CXXView *)pFrame->GetActiveView(); if(m_fileExt == "tif") { pView->DrawImage(m_filePath); } else if(m_fileExt == "shp") { pView->DrawShp(m_filePath); } else { AfxMessageBox(_T("暂时只支持*.tif *.shp")); return; } } }
m_filePath可以声明为DOC的一个共有成员变量即可
然后在view类去实现对应的显示操作即可
8、显示tif
void CXXView::DrawImage(CString filePath) { // 创建图像接口打开图像加入地图 m_Map.RemoveAllLayers(); mapWindow::IImagePtr pImage; pImage.CreateInstance(__uuidof(mapWindow::Image)); pImage->Open(_bstr_t(filePath),mapWindow::USE_FILE_EXTENSION,TRUE,NULL); m_Map.AddLayer(pImage,true); Invalidate(); }9、显示shp
void CXXView::DrawShp(CString filePath) { // 创建shp接口打开shp文件加入地图 m_Map.RemoveAllLayers(); mapWindow::IShapefilePtr pShapefilebound; pShapefilebound.CreateInstance(__uuidof(mapWindow::Shapefile)); pShapefilebound->Open(_bstr_t(filePath),false); m_Map.AddLayer(pShapefilebound,true); Invalidate(); }
网上搜了很久,没找到答案,最后在一篇老外的帖子上找到了解决方法,也是看了很久才明白他说的意思。
网上看的关于漫游,放大,缩小的c#代码是这样的
基本的地图操作 放大:axMap1.CursorMode = MapWinGIS.tkCursorMode.cmZoomIn; 缩小:axMap1.CursorMode = MapWinGIS.tkCursorMode.cmZoomOut; 漫游:axMap1.CursorMode = MapWinGIS.tkCursorMode.cmPan; 全幅:axMap1.ZoomToMaxExtents();
有说是这样写的,好像是百度空间的一个帖子,不记得链接了,直接摘抄一些那个老外的帖子上的代码
map.SetCursorMode(MapWinGIS::tkCursorMode::cmPan);但是我加的代码中找了很久都没有SetCursorMode这个方法,这要怎么设置,这个帖子老外在讨论的方法,好像是直接给控件添加一个变量什么什么的,也不知道在哪个地方添加,又搜索了一番,原来还有一种使用mapwingis的方法,就是在一个对话框中添加这个mapwingis控件,但是我的toolbox上面也没有这个控件。。最后发现原来这个是要手动添加进去的。具体的添加办法也是在老外的那个论坛上看见的,链接暂时找不到了,有两种添加方法
一个是直接在对话框上左键单击然后选择添加activex控件,第二个是 工具菜单下的选择工具箱菜单后选择com组件中找到map control 1.0即可,然后可以看到这个控件的属性中确实有这个设置模式的,而且改了以后也是有效的
然后为这个对话框的添加一个类,在为这个mapwingis控件添加一个变量,关联到之前的CDmap.h和CDmap.cpp中,发现一大推错误。。不过没关系,这里我发现了怎么添加SetCursorMode这个接口的方法了。
void SetCursorMode(long propVal) { SetProperty(0x3, VT_I4, propVal); }
后面这样在需要的地方这样调用就可以了
m_Map.SetCursorMode(mapWindow::tkCursorMode::cmZoomOut);这个tkCursorMode有这么多枚举的,按需调用即可
enum { cmZoomIn = 0, cmZoomOut = 1, cmPan = 2, cmSelection = 3, cmNone = 4, cmMeasure = 5, cmAddShape = 6, cmEditShape = 8, cmSplitByPolyline = 9, cmIdentify = 10, cmMoveShapes = 11, cmRotateShapes = 12, cmSelectByPolygon = 13, cmEraseByPolygon = 14, cmSplitByPolygon = 15, cmClipByPolygon = 16 }tkCursorMode;
mapwingis c++ mfc 改变光标状态达到放大缩小平移的效果
标签:mapwingis
原文地址:http://blog.csdn.net/pqleo/article/details/45484559