#include "StdAfx.h" #include "GISManager.h" GISManager* GISManager::m_gisMananger = NULL; int GISManager::m_iCounter = 0; GISManager::GISManager() { init(); } GISManager::~GISManager() { //DestroyObject(); m_gisMananger = NULL; } GISManager* GISManager::getInstance() { if(m_gisMananger == NULL) { m_gisMananger = new GISManager(); } m_iCounter++; return m_gisMananger; } void GISManager::DestroyObject() { m_iCounter--; if((m_iCounter ==0)&&(m_gisMananger!=NULL)) //计数器为零,且静态变量不为空时 { delete m_gisMananger; //m_gisMananger = NULL; } } void GISManager::init() { m_map = NULL; m_bHaveAddMap = false; m_pMapCwnd = NULL; m_etcFenceManager = NULL; m_editAttributes = NULL; } void GISManager::setMap(CMap1* pMap) { if(pMap !=NULL) m_map = pMap; } void GISManager::Openlocalfile(CString file) { if(!m_map->GetSafeHwnd()) return; int error=0; CString filetype=GetFileType(file); CString filename=GetFileName(file); filetype.MakeLower(); if(filetype.Compare(_T("shp"))==0) { mapWindow::IShapefilePtr shape; shape.CreateInstance("MapWinGIS.Shapefile"); if( !shape->Open((_bstr_t)file,NULL)) { error=1; } _bstr_t pro=shape->GetProjection(); //设置地图的背景色为白色 m_map->SetBackColor(RGB(255,255,255)); int shpLayerPose = m_map->AddLayer(shape,true); //移动到底端 m_map->MoveLayerBottom(shpLayerPose); //m_LayerManager.AddLayerInfo(filename,1); //是否已经加载了地图 m_bHaveAddMap = true; } else if(filetype.Compare(_T("img"))==0) { mapWindow::IImagePtr image; image.CreateInstance("MapWinGIS.Image"); if( !image->Open((_bstr_t)file,mapWindow::IMG_FILE,true,NULL)) { error=1; } //设置地图的背景色为灰白色 m_map->SetBackColor(RGB(255,255,255)); m_map->AddLayer(image,true); //m_LayerManager.AddLayerInfo(filename,2); //是否已经加载了地图 m_bHaveAddMap = true; } else if(filetype.Compare(_T("tif"))==0) { mapWindow::IImagePtr image; image.CreateInstance("MapWinGIS.Image"); if( !image->Open((_bstr_t)file,mapWindow::TIFF_FILE,true,NULL)) { error=1; } //设置地图的背景色为灰白色 m_map->SetBackColor(RGB(255,255,255)); int tiffLayerID = m_map->AddLayer(image,true); //m_LayerManager.AddLayerInfo(filename,2); //是否已经加载了地图 m_bHaveAddMap = true; } else if(filetype.Compare(_T("asc"))==0) { mapWindow::IImagePtr image; image.CreateInstance("MapWinGIS.Image"); if( !image->Open((_bstr_t)file,mapWindow::ASC_FILE,true,NULL)) { error=1; } //设置地图的背景色为灰白色 m_map->SetBackColor(RGB(255,255,255)); m_map->AddLayer(image,true); //m_LayerManager.AddLayerInfo(filename,2); //是否已经加载了地图 m_bHaveAddMap = true; } if(error==1) { CString msg = "无法打开" + file; AfxMessageBox(msg); } } CString GISManager::GetFileType(CString file) { CString type; long len=file.GetLength(); int pos=file.ReverseFind('.'); type=file.Right(len-pos-1); return type; } CString GISManager::GetFileName(CString file) { CString name; long len=file.GetLength(); int pos=file.ReverseFind('\\'); name=file.Right(len-pos-1); return name; } void GISManager::Redraw() { if(m_map->GetSafeHwnd()) { m_map->Redraw(); } } void GISManager::RemoveAllLayers() { if(m_map->GetSafeHwnd()) { m_map->RemoveAllLayers(); m_map->Redraw(); //设置地图的背景色为黑色 m_map->SetBackColor(RGB(0,0,0)); //是否已经加载了地图 m_bHaveAddMap = false; } } /*! brief:清除某一图层 param: shapeID图层号 return:void */ void GISManager::EraseShape(long& shapeID) { if(shapeID != -1) { if(m_map->GetSafeHwnd()) { m_map->RemoveLayer(shapeID); shapeID = -1; } } } void GISManager::CreateEmptyPointShapefile(long &shpLayerID,mapWindow::tkDefaultPointSymbol ptStyle /*= mapWindow::tkPointType::ptSquare*/, const unsigned long drawColor /*= RGB(255,0,0)*/, int ptSize /*= 20*/) { if(!m_map->GetSafeHwnd()) return; //目标标绘SHP图层 mapWindow::IShapefilePtr targetPtShape; targetPtShape.CreateInstance("MapWinGIS.Shapefile"); //创建空的点图层 targetPtShape->CreateNewWithShapeID(_T(""), mapWindow::SHP_POINT); //目标标绘图层加入地图中 shpLayerID = m_map->AddLayer(targetPtShape, true); mapWindow::IShapeDrawingOptionsPtr pShapeDrawingOption; pShapeDrawingOption.CreateInstance("MapWinGIS.ShapeDrawingOptions"); pShapeDrawingOption->FillColor = drawColor; pShapeDrawingOption->PointSize = ptSize; pShapeDrawingOption->SetDefaultPointSymbol(ptStyle); //pShapeDrawingOption->PointType = ptStyle; //pShapeDrawingOption->PointSidesCount = 4; (m_map->GetShapefile(shpLayerID)).SetDefaultDrawingOptions(pShapeDrawingOption); } void GISManager::CreateEmptyAreaShapfile(long& layerHandle, const unsigned long drawColor, const unsigned long& fillColor /* = RGB */, const float& fillTransparency /*= 60.0*/) { if(!m_map->GetSafeHwnd()) return; //目标标绘SHP图层 mapWindow::IShapefilePtr targetPtShape; targetPtShape.CreateInstance("MapWinGIS.Shapefile"); targetPtShape->CreateNewWithShapeID(_T(""), mapWindow::SHP_POLYGON); //目标标绘图层加入地图中 layerHandle = m_map->AddLayer(targetPtShape, TRUE); mapWindow::IShapeDrawingOptionsPtr pShapeDrawingOption; pShapeDrawingOption.CreateInstance("MapWinGIS.ShapeDrawingOptions"); pShapeDrawingOption->FillColor = fillColor; pShapeDrawingOption->FillTransparency = fillTransparency; pShapeDrawingOption->FillHatchStyle = mapWindow::tkGDIPlusHatchStyle::hsCross; pShapeDrawingOption->LineColor = drawColor; //pShapeDrawingOption->LineStipple = mapWindow::tkLineStipple::lsDotted; //pShapeDrawingOption->LineWidth = 2; (m_map->GetShapefile(layerHandle)).SetDefaultDrawingOptions(pShapeDrawingOption); } void GISManager::CreateEmptyLineShapfile(long &shpLayerID, const unsigned long lineColor, float lineWidth /* = 1 */, mapWindow::tkDashStyle lineStyle /*= mapWindow::tkLineStipple::lsNone*/) { if(!m_map->GetSafeHwnd()) return; //目标标绘SHP图层 mapWindow::IShapefilePtr targetPtShape; targetPtShape.CreateInstance("MapWinGIS.Shapefile"); targetPtShape->CreateNewWithShapeID(_T(""), mapWindow::ShpfileType::SHP_POLYLINE); //目标标绘图层加入地图中 shpLayerID = m_map->AddLayer(targetPtShape, true); mapWindow::IShapeDrawingOptionsPtr pShapeDrawingOption; pShapeDrawingOption.CreateInstance("MapWinGIS.ShapeDrawingOptions"); pShapeDrawingOption->LineColor = lineColor; pShapeDrawingOption->LineWidth = lineWidth; pShapeDrawingOption->LineStipple = lineStyle; (m_map->GetShapefile(shpLayerID)).SetDefaultDrawingOptions(pShapeDrawingOption); } //功能:向shpfile图层中增加1个航点数据 //输入:矢量图层ID号shpLayerID,shp类型shpType // 航点数据,经度—lon; 纬度—lat void GISManager::AddOnePoint2Shapfile(const long shpLayerID, const int shpType, const double lon, const double lat) { if(!m_map->GetSafeHwnd()) return; mapWindow::IPointPtr pintPtr; pintPtr.CreateInstance("MapWinGIS.Point"); //经度 pintPtr->x = lon; //纬度 pintPtr->y = lat; //shpfile文件中的shp图层个数 long shpNum = (m_map->GetShapefile(shpLayerID)).GetNumShapes(); //判断是否已经存在该shp图层,不存在,创建新的shp图层 if (shpNum == 0) { mapWindow::IShapePtr shapePtr; shapePtr.CreateInstance("MapWinGIS.Shape"); if (shpType == 0) //点图层 { shapePtr->Create(mapWindow::SHP_POINT); } else if (shpType == 1) //线图层 { shapePtr->Create(mapWindow::SHP_POLYLINE); } else if (shpType == 2) //面图层 { shapePtr->Create(mapWindow::SHP_POLYGON); } //向当前shp中插入一个航点数据 shapePtr->InsertPoint(pintPtr, &shpNum); //将shpfile文件中插入shp文件 (m_map->GetShapefile(shpLayerID)).EditInsertShape(shapePtr, &shpNum); } else { //获得当前的shp CShape shape = (m_map->GetShapefile(shpLayerID)).GetShape(shpNum-1); //当前的航点个数 long curLinePts = shape.GetNumPoints(); //向当前shp中插入一个航点数据 shape.InsertPoint(pintPtr, &curLinePts); } } //功能:基于点矢量图层标绘目标点 //输入:点图层名称drawLayerID // 点坐标,经度lon, 纬度lat // 点名称strPtName // 标绘颜色strColor // 标绘字体颜色数值fontColor void GISManager::DrawPointShapeLayer(long &drawLayerID, const double lon, const double lat, CString strPtName, const CString strColor, unsigned long fontColor) { if(!m_map->GetSafeHwnd()) return; //判断点矢量图层是否已经存在,存在则删除 if (drawLayerID != -1) { //清除标绘的点矢量图层 //ClearPointShape(drawLayerID); EraseShape(drawLayerID); } ///////////////////////////////////新建点矢量图层标绘点目标/////////////////////////////////// //创建点图层 CreateEmptyPointShapefile(drawLayerID, mapWindow::tkDefaultPointSymbol::dpsDiamond, RGB(0,255,0),16); SetLabelCategory(drawLayerID,12,strColor,fontColor,0.0,-8); //向点图层加入航点数据 AddOnePoint2Shapfile(drawLayerID, 0, lon, lat); /////////////////////往SHP图层中加入目标点标注信息/////////////////////////////// USES_CONVERSION; std::string name(strPtName); //增加Labels drawLabel(false, drawLayerID, strPtName, lon, lat); //重新绘制 Redraw(); } void GISManager::setPointRotation(const long& shapeLayerID, double rotation) { if(!m_map->GetSafeHwnd()) return; CShapeDrawingOptions pShapeDrawingOption; pShapeDrawingOption = m_map->GetShapefile(shapeLayerID).GetDefaultDrawingOptions(); pShapeDrawingOption.SetPointRotation(rotation); } void GISManager::SetLabelCategory(const long& shapeID, int fontSize /*= 12*/, CString colorName /*= _T("红色")*/, unsigned long fontColor /*= RGB(255,0,0)*/, double XOffset/* = 0*/, double YOffset /*= 0*/) { if(shapeID == -1) return; CLabels labesPtr; labesPtr = (m_map->GetShapefile(shapeID)).GetLabels(); CLabelCategory labelCategory = labesPtr.AddCategory((LPCTSTR)colorName); labelCategory.SetFontColor(fontColor); labelCategory.SetAlignment(1); labelCategory.SetOffsetX(XOffset); labelCategory.SetOffsetY(YOffset); labelCategory.SetFontBold(TRUE); labelCategory.SetFontName(LPCTSTR("宋体")); labelCategory.SetFontSize(fontSize); } void GISManager::SetLabelCategory2(const long& shapeID, int fontSize /*= 12*/, unsigned long fontColor /*= RGB(255,0,0)*/, unsigned long frameBackColor /*= RGB(0,0,0)*/, double XOffset/* = 0*/, double YOffset /*= 0*/) { if(shapeID == -1) return; CLabels labesPtr; labesPtr = (m_map->GetShapefile(shapeID)).GetLabels(); CLabelCategory labelCategory = labesPtr.AddCategory(_T("")); labelCategory.SetFontColor(fontColor); labelCategory.SetAlignment(1); labelCategory.SetOffsetX(XOffset); labelCategory.SetOffsetY(YOffset); labelCategory.SetFontBold(TRUE); labelCategory.SetFontName(LPCTSTR("宋体")); labelCategory.SetFontSize(fontSize); labelCategory.SetFrameType(1); labelCategory.SetFrameBackColor(frameBackColor); labelCategory.SetFrameVisible(TRUE); } void GISManager::SetInnerLabelCategory(const long& layerHandle,int fontSize /* = 12 */, unsigned long fontColor /*= RGB(255,0,0)*/, double XOffset/* = 0*/, double YOffset /*= 0*/) { if(layerHandle == -1) return; CShapefile sf; sf = m_map->GetShapefile(layerHandle); CLabelCategory LBCPtr; LBCPtr.CreateDispatch(_T("MapWinGIS.LabelCategory")); LBCPtr.SetName(_T("labelcategoty")); LBCPtr.SetFontColor(fontColor); LBCPtr.SetAlignment(1); LBCPtr.SetOffsetX(XOffset); LBCPtr.SetOffsetY(YOffset); LBCPtr.SetFontBold(TRUE); LBCPtr.SetFrameVisible(FALSE); LBCPtr.SetFontName(_T("song")); LBCPtr.SetFontSize((long)fontSize); sf.GetLabels().SetOptions(LBCPtr); } void GISManager::drawLabel(bool isAdd, const long& shapefileID, const CString& labelName, const double& lon, const double& lat, const double& rotation /*= 0*/, const long& labalCatIndex/* = 0*/) { if(!m_map->GetSafeHwnd()) return; if(shapefileID == -1) return; CLabels labesPtr; labesPtr = (m_map->GetShapefile(shapefileID)).GetLabels(); if(!isAdd) labesPtr.Clear(); //增加Labels labesPtr.AddLabel(LPCTSTR(labelName), lon, lat, rotation, labalCatIndex); } //功能:根据经纬度、角度计算某物体多边形点地理坐标 void GISManager::CalculatePolygonCoordinate(const double lon, const double lat, const double yaw, double (*pArrayData)[2], const std::vector& pvec) { if(!m_map->GetSafeHwnd()) return; double pixelX = 0; double pixelY = 0; m_map->ProjToPixel(lon, lat, &pixelX, &pixelY); const double DEG2RAD = 0.017453292519943295769236907684886127134428718885417; //采用磁航向角 double sinang = sin(yaw * DEG2RAD); double cosang = cos(yaw * DEG2RAD); //旋转后的像素坐标 double rotatePixelX = 0; double rotatePixelY = 0; //计算经过坐标旋转和平移后的多边形地理坐标 for(int k=0; kPixelToProj(rotatePixelX, rotatePixelY, &pArrayData[k][0], &pArrayData[k][1]); } } void GISManager::clearShapefileShape(const long& shapeLayerID) { if(!m_map->GetSafeHwnd()) return; if(shapeLayerID != -1) m_map->GetShapefile(shapeLayerID).EditClear(); } long GISManager::getLayerShapeIndex(const long& layerHandle, const int& elementID, const int& sel /* = 0 */) { long shapeIndex = -1; if(layerHandle== -1 || elementID<1) return -1; CShapefile sf = m_map->GetShapefile(layerHandle); long fieldIndex = -1; if(sel == 0) fieldIndex = sf.GetTable().GetFieldIndexByName(_T("ID")); else fieldIndex = sf.GetTable().GetFieldIndexByName(_T("编号")); if(fieldIndex != -1) { long numShapes = sf.GetNumShapes(); for(long i = 0; i < numShapes; i++) { CString pfindValueId; pfindValueId.Format(_T("%d"), elementID); CString pRelValueId = (CString)sf.GetCellValue(fieldIndex, i); if(pRelValueId == pfindValueId) { shapeIndex = i; break; } } } return shapeIndex; return shapeIndex; } int GISManager::getLayerShapeEleID(const long& layerHandle, const long& shapeIndex, const int& sel /* = 0 */) { int id = 0; if(layerHandle== -1 || shapeIndex == -1) return -1; CShapefile sf = m_map->GetShapefile(layerHandle); long fieldIndex = -1; if(sel == 0) fieldIndex = sf.GetTable().GetFieldIndexByName(_T("ID")); else fieldIndex = sf.GetTable().GetFieldIndexByName(_T("编号")); if(fieldIndex != -1) { CString pValue = (CString)sf.GetCellValue(fieldIndex, shapeIndex); id = atoi(pValue); return id; } return -1; } bool GISManager::deleteShape(const long& layerHandle, const long& shapeIndex) { if(layerHandle==-1 || shapeIndex== -1) return false; CShapefile sf; sf = m_map->GetShapefile(layerHandle); sf.EditDeleteShape(shapeIndex); return true; } void GISManager::changeLayerShapeLineStyle(const long& layerHandle, const long& shapeIndex, const CString& styleName, unsigned long lineColor,float lineWidth /*= 1*/, mapWindow::tkLineStipple lineStyle /*= mapWindow::tkLineStipple::lsDashed*/) { if(layerHandle==-1 || shapeIndex==-1) return; CShapefile sf = m_map->GetShapefile(layerHandle); CShapefileCategory sc; long categoryIndex = -1; CString sfcName = styleName; long sfcNum = sf.GetCategories().GetCount(); //遍历Categories,是否存在和图标名称相同的ShapefileCategory for(long i=0; iGetShapefile(layerHandle); CShapefileCategory sc; long categoryIndex = -1; //遍历Categories,是否存在和图标名称相同的ShapefileCategory long sfCategoriesNum = sf.GetCategories().GetCount(); for(long i=0; iGetShapefile(layerHandler); long fieldIndex = sf.GetTable().GetFieldIndexByName((_bstr_t)fieldName); _variant_t pValue(value); sf.EditCellValue(fieldIndex, shapeIndex, (VARIANT)pValue); } long GISManager::selectShape(const long& layerHandle, long x, long y, long x2 /* = -1 */, long y2 /* = -1 */,bool isPt /*= false*/, mapWindow::SelectMode selectMode /*= mapWindow::SelectMode::INCLUSION*/) { if(layerHandle == -1) return -1; CShapefile sf; sf = m_map->GetShapefile(layerHandle); if(sf != NULL) { //先清空选中shape sf.SelectNone(); Redraw(); double projX1 = 0.0; double projY1 = 0.0; double projX2 = 0.0; double projY2 = 0.0; if(x2==-1 && y2== -1) { if(isPt) { m_map->PixelToProj(x,y,&projX1,&projY1); m_map->PixelToProj(x,y,&projX2,&projY2); } else { m_map->PixelToProj(x-15,y-15,&projX1,&projY1); m_map->PixelToProj(x+15,y+15,&projX2,&projY2); } } else { m_map->PixelToProj(x,y,&projX1,&projY1); m_map->PixelToProj(x2,y2,&projX2,&projY2); } VARIANT result; mapWindow::IExtentsPtr ext; ext.CreateInstance("MapWinGIS.Extents"); ext->SetBounds(projX1, projY1, 0.0, projX2, projY2, 0.0); bool isSelect = sf.SelectShapes(ext,0.0, selectMode, &result); if(isSelect) { int count = (int)result.parray->rgsabound->cElements; long *index = (long*)(result.parray->pvData); //无论选中几个,只让第一个作为选中 sf.SetShapeSelected(index[0],VARIANT_TRUE); Redraw(); return index[0]; } return -1; } return -1; } void GISManager::selectShapes(const long& layerHandle, long x1, long y1, long x2, long y2, std::vector& selectedIndexVec) { if(layerHandle == -1) return ; CShapefile sf; sf = m_map->GetShapefile(layerHandle); if(sf == NULL) return; //先清空选中shape sf.SelectNone(); double projX1 = 0.0; double projY1 = 0.0; m_map->PixelToProj(x1, y1, &projX1, &projY1); double projX2 = 0.0; double projY2 = 0.0; m_map->PixelToProj(x2, y2, &projX2, &projY2); VARIANT result; mapWindow::IExtentsPtr ext; ext.CreateInstance("MapWinGIS.Extents"); ext->SetBounds(projX1, projY1, 0.0, projX2, projY2, 0.0); bool isSelect = sf.SelectShapes(ext,0.0, mapWindow::SelectMode::INCLUSION, &result); if(isSelect) { int count = (int)result.parray->rgsabound->cElements; long *index = (long*)(result.parray->pvData); if(count>=1) { for(int j=0; j < count; j++) { //s = s + TRACE("%d\n", index[j]); sf.SetShapeSelected(index[j],VARIANT_TRUE); //将选中的图元索引插入到数组中 selectedIndexVec.push_back(index[j]); } } } Redraw(); } long GISManager::selectAreaShape(const long& layerHandle, long x, long y) { if(layerHandle == -1) return -1; CShapefile sf; sf = m_map->GetShapefile(layerHandle); if(sf != NULL) { //先清空选中shape sf.SelectNone(); Redraw(); double projX1 = 0.0; double projY1 = 0.0; m_map->PixelToProj(x,y,&projX1,&projY1); VARIANT result; mapWindow::IExtentsPtr ext; ext.CreateInstance("MapWinGIS.Extents"); ext->SetBounds(projX1, projY1, 0.0, projX1, projY1, 0.0); bool isSelect = sf.SelectShapes(ext,0.0, mapWindow::SelectMode::INCLUSION, &result); if(isSelect) { int count = (int)result.parray->rgsabound->cElements; long *index = (long*)(result.parray->pvData); CShape shapePtr = sf.GetShape(index[0]); double minArea = shapePtr.GetArea(); //先让最小值为选中的第一个 long returnIndex = index[0]; //返回索引也初始为第一个 for(int i=1; i < count; i++) { shapePtr = sf.GetShape(index[i]); if(minArea > shapePtr.GetArea()) { returnIndex = index[i]; minArea = shapePtr.GetArea(); } } sf.SetShapeSelected(returnIndex,VARIANT_TRUE); Redraw(); return returnIndex; } return -1; } return -1; } void GISManager::releaseSelected(const long& layerHandle) { if(layerHandle == -1) return; CShapefile sf; sf = m_map->GetShapefile(layerHandle); if(sf!=NULL) { sf.SelectNone(); Redraw(); } } void GISManager::calculateExtents(const double& x, const double& y, double lenOfSide, mapWindow::IExtentsPtr extents) { double lon1 = 0.0; double lat1 = 0.0; double lon2 = 0.0; double lat2 = 0.0; double distance = lenOfSide/sqrtf(2); CalculatePtCoordinate(lon1, lat1, x, y, 225, distance, 3); CalculatePtCoordinate(lon2, lat2, x, y, 45, distance, 3); extents->SetBounds(lon1, lat1, 0.0, lon2, lat2, 0.0); }