#pragma once #ifndef __GISMANAGER_H__ #define __GISMANAGER_H__ #include "map.h" #include #include #include "shapedrawingoptions.h" #include "labelcategory.h" #include "shapefilecategory.h" #include "shapefilecategories.h" #include "table.h" #include "shape.h" //自定义像素点 #pragma pack(1) struct PtPixel { PtPixel() { _ptX = 0; _ptY = 0; } PtPixel(int x, int y) { _ptX = x; _ptY = y; } int _ptX; int _ptY; }; //自定义双精度坐标点 struct PointXY { PointXY() { x=0; y=0; } PointXY(double px, double py) { x = px; y = py; } double x; double y; }; //自定义地理坐标点 struct GeoCoord { GeoCoord() { lon = lat = alt = 0.0; } GeoCoord(double x, double y, double z) { lon = x; lat = y; alt = z; } double lon; double lat; double alt; }; #pragma pack() //电子围栏类型 enum EtcFenceType { ForbidFly, //禁飞区 SafeArea, //安全区 NoDef //无定义 }; class EtcFenceManager; class EditAttributes; typedef std::vector PointVec; class GISManager { public: GISManager(); ~GISManager(); //获得实例 static GISManager* getInstance(); //销毁函数 static void DestroyObject(); void init(); /*! brief:设置地图控件 param:CMap1* */ void setMap(CMap1* pMap); //打开地图文件函数 void Openlocalfile(CString file); CString GetFileType(CString file); CString GetFileName(CString file); void Redraw(); //清除所有图层 void RemoveAllLayers(); /*! brief:清除某一图层 param: shapeID图层号 return:void */ void EraseShape(long& shapeID); /*! brief:创建空的点图层 param:shpLayerID图层号,ptStyle点类型,drawColor绘制颜色 param:ptSize点大小 return:void */ void CreateEmptyPointShapefile(long &shpLayerID,mapWindow::tkDefaultPointSymbol ptStyle = mapWindow::tkDefaultPointSymbol::dpsSquare, const unsigned long drawColor = RGB(255,0,0), int ptSize = 20); /*! brief:创建空的面Shapefile图层 param:layerHandle图层号,drawColor面轮廓颜色,fillColor面填充颜色 param:fillTransparency透明度(0-255) return:void */ void CreateEmptyAreaShapfile(long& layerHandle, const unsigned long drawColor, const unsigned long& fillColor = RGB(0,100,100), const float& fillTransparency = 60); /*! brief:创建空的shpfile线图层 param:绘制颜色lineColor param:lineWidth线宽,默认为1 param:引用,返回值,矢量图层ID号shpLayerID return:void */ void CreateEmptyLineShapfile(long &shpLayerID, const unsigned long lineColor, float lineWidth = 1, mapWindow::tkDashStyle lineStyle = mapWindow::tkDashStyle::dsCustom); //功能:向shpfile图层中增加1个航点数据 //输入:矢量图层ID号shpLayerID,shp类型shpType // 航点数据,经度—lon; 纬度—lat void AddOnePoint2Shapfile(const long shpLayerID, const int shpType, const double lon, const double lat); //功能:基于点矢量图层标绘目标点 //输入:点图层名称drawLayerID // 点坐标,经度lon, 纬度lat // 点名称strPtName // 标绘颜色strColor // 标绘字体颜色数值fontColor void DrawPointShapeLayer(long &drawLayerID, const double lon, const double lat, CString strPtName, const CString strColor, unsigned long fontColor); /*! brief:设置点的旋转角度 param:shapeLayerID点图层 param:rotation旋转角度 */ void setPointRotation(const long& shapeLayerID, double rotation); /*! brief:设置标注的属性,在创建图层时,若需在该图层标注时使用 param: shapeID图层ID号, fontSize标注字体大小,colorName颜色名字,fontColor标注字体颜色 param: XOffset/YOffset标注位置偏移量 return: void */ void SetLabelCategory(const long& shapeID, int fontSize = 12, CString colorName = _T("红色"), unsigned long fontColor = RGB(255,0,0), double XOffset = 0, double YOffset = 0); /*! brief:设置标注的属性,在创建图层时,若需在该图层标注时使用 param: shapeID图层ID号, fontSize标注字体大小,colorName颜色名字,fontColor标注字体颜色 param: XOffset/YOffset标注位置偏移量 return: void */ void 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); /*! brief:设置默认标注属性 param:layerHandle, return:void */ void SetInnerLabelCategory(const long& layerHandle,int fontSize = 12, unsigned long fontColor = RGB(255,0,0), double XOffset = 0, double YOffset = 0); /*! brief:绘制标注,先通过设置SetLabelCategory param: isAdd true表示追加false表示清除单绘,shapefileID图层ID号,labelName标注名称,lon、lat标注位置 param:rotation旋转角度,labalCatIndex使用label属性 return: void */ void drawLabel(bool isAdd, const long& shapefileID, const CString& labelName, const double& lon, const double& lat, const double& rotation = 0, const long& labalCatIndex = 0); /*! brief:根据经纬度、角度计算某物体多边形点地理坐标 param:lon lat yaw经纬度和角度 param:pArrayData地理坐标二维数组,pvec物体形状像素点数组 */ void CalculatePolygonCoordinate(const double lon, const double lat, const double yaw, double (*pArrayData)[2], const std::vector& pvec); /*! brief:清除某一图层的shape param:shapeLayerID图层号 ruturn: void */ void clearShapefileShape(const long& shapeLayerID); /*! brief:获取图层中图元的索引号 param:layerHandle图层号,elementID元素ID,sel选择默认0 return:long */ long getLayerShapeIndex(const long& layerHandle, const int& elementID, const int& sel = 0); /*! brief:根据图层中索引号获取元素ID param:layerHandle图层号,shapeIndex图元索引,sel选择默认0 return:long */ int getLayerShapeEleID(const long& layerHandle, const long& shapeIndex, const int& sel = 0); /*! brief:删除图层图元 param:layerhandle图层号,shapeIndex图元号 return:bool */ bool deleteShape(const long& layerHandle, const long& shapeIndex); /*! brief:更改线图元的显示 param:layerHandle图层号,shapeIndex图元索引号 param:lineColor线颜色,lineWidth线宽度,线样式 */ void changeLayerShapeLineStyle(const long& layerHandle, const long& shapeIndex, const CString& styleName, unsigned long lineColor,float lineWidth = 1, mapWindow::tkLineStipple lineStyle = mapWindow::tkLineStipple::lsDashed); /*! brief:更改面图元的样式 param:layerHandle图层号,shapeIndex图元索引号 param:styleName样式名称,drawColor边线颜色,fillColor填充颜色 param: fillTransparency填充透明度,fillType填充类型 return:void */ void changeAreaLayerShapeStyle(const long& layerHandle, const long& shapeIndex, const CString& styleName, const unsigned long drawColor, const unsigned long& fillColor, const float& fillTransparency); /*! brief:更改图元某属性字段值 param:layerhandle图层号,shapeIndex图元索引号, fieldName属性字段名称,value新属性字段值 return:void */ void editAttributeValue(const long& layerHandler, const long& shapeIndex, const CString& fieldName, const CString& value); /*! brief:根据点击位置选中图元,并返回图元索引号 param:layerHandle图层号,x y点击位置, x2 y2拉框时右下角位置 param:选择模式 return:long返回图元索引 */ long selectShape(const long& layerHandle, long x, long y, long x2 = -1, long y2 = -1, bool isPt = false, mapWindow::SelectMode selectMode = mapWindow::SelectMode::INCLUSION); /*! brief:根据框选范围选中图元,并返回图元索引号 param:layerHandle图层号,x1 y1框选左上角位置,x2 y2框选右上角位置 param:selectedIndexVec返回的图元索引集合 return:void */ void selectShapes(const long& layerHandle, long x1, long y1, long x2, long y2, std::vector& selectedIndexVec); /*! brief:点选选中面图元(若有重叠,选择最小面积的) param:x,y点击位置 return:long */ long selectAreaShape(const long& layerHandle, long x, long y); /*! brief:释放图层上所有被选中的图元 parma:图层索引号 return:void */ void releaseSelected(const long& layerHandle); /*! brief:根据一个点计算一个地域范围(地理长度为正方形) param:x y点位置,lenOfSide边长, extents返回值 return:void */ void calculateExtents(const double& x, const double& y, double lenOfSide, mapWindow::IExtentsPtr extents); public: CMap1* m_map; //是否打开地图 bool m_bHaveAddMap; //地图空间句柄 CWnd* m_pMapCwnd; /*!电子围栏管理器*/ EtcFenceManager* m_etcFenceManager; /*!属性显示编辑类*/ EditAttributes* m_editAttributes; private: static GISManager* m_gisMananger; //静态变量 static int m_iCounter; }; #endif