You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

338 lines
8.3 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#pragma once
#ifndef __GISMANAGER_H__
#define __GISMANAGER_H__
#include "map.h"
#include <iostream>
#include <vector>
#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<PointXY> 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图层号
returnvoid
*/
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号shpLayerIDshp类型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<PtPixel>& pvec);
/*!
brief:清除某一图层的shape
param:shapeLayerID图层号
ruturn: void
*/
void clearShapefileShape(const long& shapeLayerID);
/*!
brief:获取图层中图元的索引号
param:layerHandle图层号elementID元素IDsel选择默认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<long>& selectedIndexVec);
/*!
brief:点选选中面图元(若有重叠,选择最小面积的)
param:xy点击位置
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