#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<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);
}