//**********************************************************************************
//有机会下载安装了mapwingis,试图利用MFC对其二次开发利用,可惜网上能够查到的资料多为C#,VC资料太少。
//经过几天的研究,参考了网上网友的资料,利用VC实现了mapwingis部分功能的开发,为了和我有相同需求的码农们着想,
//少走弯路,特开发部分示例代码,以抛砖引玉。
// 禾呈 && 博士 2019-5-30
//**********************************************************************************
- MapWinGIS5.0.1.0-Win32安装
- 创建单文档,采用CFormView
- 添加控件和变量
map1.h中添加:using namespace mapWindow;
stdafx.h中添加:#import "c:\dev\MapWinGIS\MapWinGIS.ocx"rename_namespace("mapWindow") rename("GetObject","GISGetObject") rename("max","mapMax") rename("min","mapMin")
- 启动运行发现窗体不能最大化,添加
m_pMainWnd->ShowWindow(SW_SHOWDEFAULT);//解决窗体最大化问题
m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);
m_pMainWnd->UpdateWindow();
- 实现控件随着窗体大小变化
在onsize()中添加
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();
}
- 添加图层
void CmapwingisTest2View::OnToolsAddLayer()
{
TCHAR szFilters[]= _T("TIFF Files (*.tif)|*.tif|SHP Files (*.shp)|*.shp||");
CFileDialog fileDlg (TRUE,_T("tif"),_T("*.tif"),
OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, szFilters, this);
if( fileDlg.DoModal ()!=IDOK ) return;
CString m_strFilePath = fileDlg.GetPathName();
if (_T("")!=m_strFilePath)
{
// 先删除所有图层
//m_map.RemoveAllLayers();
// 获取后缀名判断文件是tif图像还是shp文件
CString strExt = m_strFilePath.Right(3);
if (_T("tif")==strExt)
{
// 创建图像接口打开图像加入地图
mapWindow::IImagePtr pImage;
pImage.CreateInstance(__uuidof(mapWindow::Image));
pImage->Open(_bstr_t(m_strFilePath),mapWindow::USE_FILE_EXTENSION,TRUE,NULL);
m_map.AddLayer(pImage,true);
}
if (_T("shp")==strExt)
{
mapWindow::IShapefilePtr pshapefilebound;
pshapefilebound.CreateInstance(__uuidof(mapWindow::Shapefile));
pshapefilebound->Open(_bstr_t(m_strFilePath),false );
m_map.AddLayer( pshapefilebound,TRUE) ;
return;
}
}
return;
}
- 实现放大,缩小,漫游,复位等功能
void CmapwingisTest2View::OnWindowsZoomin()
{
m_map.SetCursorMode(cmZoomIn); //放大
}
void CmapwingisTest2View::OnWindowsZoomout()//缩小
{
m_map.SetCursorMode(cmZoomOut);
}
void CmapwingisTest2View::OnWindowsPan()//漫游
{
m_map.SetCursorMode(cmPan);
}
void CmapwingisTest2View::OnWindowsReset()//缺省放大到首个图层
{
int numLayer=0;
numLayer=m_map.GetNumLayers();
if(numLayer<1)return;
m_map.ZoomToLayer(0);
}
void CmapwingisTest2View::OnWindowsGlobal()//全球范围
{
m_map.ZoomToWorld();
}
- 实现图像添加label
void CmapwingisTest2View::OnToolsAddTiffLayer()
{
TCHAR szFilters[]= _T("TIFF Files (*.tif)|*.tif||");
CFileDialog fileDlg (TRUE,_T("tif"),_T("*.tif"),
OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, szFilters, this);
if( fileDlg.DoModal ()!=IDOK ) return;
CString m_strFilePath = fileDlg.GetPathName();
if (_T("")!=m_strFilePath)
{
// 先删除所有图层
//m_map.RemoveAllLayers();
// 获取后缀名判断文件是tif图像还是shp文件
CString strExt = m_strFilePath.Right(3);
if (_T("tif")==strExt)
{
// 创建图像接口打开图像加入地图
mapWindow::IImagePtr pImage;
pImage.CreateInstance(__uuidof(mapWindow::Image));
pImage->Open(_bstr_t(m_strFilePath),mapWindow::USE_FILE_EXTENSION,TRUE,NULL);
m_map.AddLayer(pImage,true);
mapWindow::ILabelsPtr labels;
pImage->get_Labels( &labels );
labels->PutFontSize(12);
labels->PutFontBold(true);
labels->PutFontOutlineVisible(true);
labels->PutFontOutlineWidth(4);
mapWindow::ILabelCategoryPtr cat;
labels->AddCategory("Red");
//cat->PutFontColor(RGB(255,0,0));
mapWindow::IExtentsPtr ext = pImage->GetExtents();
double xmin,xmax,ymin,ymax;
ext->get_xMax(&xmax);
ext->get_xMin(&xmin);
ext->get_yMax(&ymax);
ext->get_yMin(&ymin);
double xRange = xmax-xmin;
double yRange = ymax-ymin;
CString str;
for (int i = 0; i < 100; i++)
{
double x=xRange*(rand()%9)*0.1;
double y=yRange* ( rand()%9 )/10.0;
int categoryIndex = i % 3;
str.Format("%d",i);
labels->AddLabel( _bstr_t(str ),xmin+x,ymin+y,i*3.6,categoryIndex);
}
}
}
return;
}
- 实现shape图层添加label
void CmapwingisTest2View::OnToolsAdd32780()
{
TCHAR szFilters[]= _T("SHP Files (*.shp)|*.shp||");
CFileDialog fileDlg (TRUE,_T("shp"),_T("*.shp"),
OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, szFilters, this);
if( fileDlg.DoModal ()!=IDOK ) return;
CString m_strFilePath = fileDlg.GetPathName();
if (_T("")!=m_strFilePath)
{
// 先删除所有图层
//m_map.RemoveAllLayers();
// 获取后缀名判断文件是tif图像还是shp文件
CString strExt = m_strFilePath.Right(3);
if (_T("shp")==strExt)
{
mapWindow::IShapefilePtr pshapefilebound;
pshapefilebound.CreateInstance(__uuidof(mapWindow::Shapefile));
pshapefilebound->Open(_bstr_t(m_strFilePath),false );
m_map.AddLayer( pshapefilebound,TRUE) ;
mapWindow::ILabelsPtr labels=pshapefilebound->GetLabels( );//?
labels->PutFontSize(12);
labels->PutFontBold(true);
labels->PutFontOutlineVisible(true);
labels->PutFontOutlineWidth(4);
mapWindow::ILabelCategoryPtr cat;
labels->AddCategory("Red");
long fieldIndex = 1;//默认首个列
CString str;
IFieldPtr Fields;
//pshapefilebound->GetField(0);
_variant_t var;
for (long i = 0; i < pshapefilebound->GetNumShapes() ; i++)
{
IShapePtr shp = pshapefilebound->GetShape(i);
IPointPtr pt= shp->GetCenter( );
var = pshapefilebound->GetCellValue(fieldIndex, i);
str = var.bstrVal; //需要判断本列是否为文本,待解决
labels->AddLabel( _bstr_t(str ),pt->Getx(),pt->Gety(),0,laCenter);
}
labels->put_Synchronized(true);
}
}
return;
}