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.

929 lines
22 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.

#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图层号
returnvoid
*/
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号shpLayerIDshp类型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<PtPixel>& 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; k<pvec.size(); k++)
{
rotatePixelX = pixelX + (pvec[k]._ptX * cosang - pvec[k]._ptY * sinang); //X方向像素坐标
rotatePixelY = pixelY + (pvec[k]._ptX * sinang + pvec[k]._ptY * cosang); //Y方向像素坐标
//像素坐标转经纬度坐标
m_map->PixelToProj(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; i<sfcNum; i++)
{
sc = sf.GetCategories().GetItem(i);
if(sc.GetName() == sfcName)
{
categoryIndex = i;
}
}
if(categoryIndex == -1)
{
sc = sf.GetCategories().Add(sfcName);
sc.GetDrawingOptions().SetLineColor(lineColor);
sc.GetDrawingOptions().SetLineWidth(lineWidth);
sc.GetDrawingOptions().SetLineStipple(lineStyle);
categoryIndex = sf.GetCategories().GetCount() - 1;
}
else
{
sc = sf.GetCategories().GetItem(categoryIndex);
}
sf.SetShapeCategory(shapeIndex, categoryIndex);
}
void GISManager::changeAreaLayerShapeStyle(const long& layerHandle, const long& shapeIndex, const CString& styleName, const unsigned long drawColor,
const unsigned long& fillColor, const float& fillTransparency)
{
if(layerHandle==-1 || shapeIndex==-1)
return;
CShapefile sf = m_map->GetShapefile(layerHandle);
CShapefileCategory sc;
long categoryIndex = -1;
//遍历Categories是否存在和图标名称相同的ShapefileCategory
long sfCategoriesNum = sf.GetCategories().GetCount();
for(long i=0; i<sfCategoriesNum; i++)
{
sc = sf.GetCategories().GetItem(i);
if(sc.GetName() == styleName)
{
categoryIndex = i;
}
}
if(categoryIndex == -1)
{
sc = sf.GetCategories().Add(styleName);
sc.GetDrawingOptions().SetFillColor(fillColor);
sc.GetDrawingOptions().SetFillTransparency(fillTransparency);
sc.GetDrawingOptions().SetFillType(0);
sc.GetDrawingOptions().SetFillHatchStyle(0);
sc.GetDrawingOptions().SetLineColor(drawColor);
categoryIndex = sf.GetCategories().GetCount() - 1;
}
else
{
sc = sf.GetCategories().GetItem(categoryIndex);
}
sf.SetShapeCategory(shapeIndex, categoryIndex);
}
void GISManager::editAttributeValue(const long& layerHandler, const long& shapeIndex, const CString& fieldName, const CString& value)
{
CShapefile sf;
sf = m_map->GetShapefile(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<long>& 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);
}