|
|
|
|
#include "stdafx.h"
|
|
|
|
|
#include "GeoInfoCalculate.h"
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>dll
|
|
|
|
|
#include "MapPrj.h"
|
|
|
|
|
#pragma comment( lib, "MapPrj.lib" )
|
|
|
|
|
|
|
|
|
|
// ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
|
|
|
|
|
#include "SysGeoCorrect.h"
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>)ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD>ͷ<EFBFBD>λ
|
|
|
|
|
//<2F><><EFBFBD>룺 1. img ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD>ݽṹ<DDBD><E1B9B9>ָ<EFBFBD><D6B8>
|
|
|
|
|
// 2. pt1 <20><><EFBFBD>㣨<EFBFBD><E3A3A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>꣩
|
|
|
|
|
// 3. pt2 <20>յ㣨<D5B5><E3A3A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>꣩
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1. distance <20><><EFBFBD><EFBFBD>
|
|
|
|
|
// 2. azAngle <20><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㵽<EFBFBD>յ<EFBFBD>
|
|
|
|
|
// 3. <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>true<75><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>false
|
|
|
|
|
bool ImgStruCalTwoPtsDistanceAzimuth(double &distance, double &azAngle,
|
|
|
|
|
const ImgStru* img, cv::Point pt1, cv::Point pt2)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤
|
|
|
|
|
if (img == NULL ||
|
|
|
|
|
img->ImgWidth <= 0 ||
|
|
|
|
|
img->ImgHeight <= 0 ||
|
|
|
|
|
img->buff == NULL)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (img->bitcount != 8 || img->bitcount != 24)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// <20><>γ<EFBFBD>ȱ߽<C8B1><DFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>֤
|
|
|
|
|
if(img->BoundingBox.WestLon < -180.0 ||
|
|
|
|
|
img->BoundingBox.EastLon > 180.0 ||
|
|
|
|
|
img->BoundingBox.EastLon - img->BoundingBox.WestLon < 0.0 ||
|
|
|
|
|
img->BoundingBox.NorthLat > 90.0 ||
|
|
|
|
|
img->BoundingBox.SouthLat < -90.0 ||
|
|
|
|
|
img->BoundingBox.NorthLat - img->BoundingBox.SouthLat < 0.0)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// pt1<74><31>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>֤
|
|
|
|
|
if (pt1.x < 0 || pt1.x > img->ImgWidth - 1 ||
|
|
|
|
|
pt1.y < 0 || pt1.y > img->ImgHeight - 1)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// pt2 <20><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>֤
|
|
|
|
|
if (pt2.x < 0 || pt2.x > img->ImgWidth - 1 ||
|
|
|
|
|
pt2.y < 0 || pt2.y > img->ImgHeight - 1)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
double LatResolution = (img->BoundingBox.NorthLat - img->BoundingBox.SouthLat) / img->ImgHeight;
|
|
|
|
|
double LonResolution = (img->BoundingBox.EastLon - img->BoundingBox.WestLon) / img->ImgWidth;
|
|
|
|
|
|
|
|
|
|
double Lat1 = 0.0;
|
|
|
|
|
double Lon1 = 0.0;
|
|
|
|
|
|
|
|
|
|
double Lat2 = 0.0;
|
|
|
|
|
double Lon2 = 0.0;
|
|
|
|
|
|
|
|
|
|
Lat1 = img->BoundingBox.NorthLat - LatResolution * pt1.y;
|
|
|
|
|
Lon1 = img->BoundingBox.WestLon + LonResolution * pt1.x;
|
|
|
|
|
|
|
|
|
|
Lat2 = img->BoundingBox.NorthLat - LatResolution * pt2.y;
|
|
|
|
|
Lon2 = img->BoundingBox.WestLon + LonResolution * pt2.x;
|
|
|
|
|
|
|
|
|
|
CalculateTwoPtsDistanceAzimuth(distance, azAngle, Lon1 , Lat1, Lon2, Lat2,1);
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
catch(cv::Exception &e)
|
|
|
|
|
{
|
|
|
|
|
e.msg;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
catch(...)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>(<28><><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>)<29><>һ<EFBFBD><D2BB><EFBFBD>ľ<EFBFBD>γ<EFBFBD><CEB3>
|
|
|
|
|
//<2F><><EFBFBD>룺 1. img ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD>ݽṹ<DDBD><E1B9B9>ָ<EFBFBD><D6B8>
|
|
|
|
|
// 2. point <20><><EFBFBD><EFBFBD><EFBFBD>㣨<EFBFBD><E3A3A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>꣩
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1. PtLatLon <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD>γ<EFBFBD><CEB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
// 2. <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>true<75><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>false
|
|
|
|
|
bool ImgStruCalOnePtLonLat(GeoCoordinatePoint& PtLatLon, const ImgStru* img, cv::Point point)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤
|
|
|
|
|
if (img == NULL ||
|
|
|
|
|
img->ImgWidth <= 0 ||
|
|
|
|
|
img->ImgHeight <= 0 ||
|
|
|
|
|
img->buff == NULL)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (img->bitcount != 8 || img->bitcount != 24)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// <20><>γ<EFBFBD>ȱ߽<C8B1><DFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>֤
|
|
|
|
|
if(img->BoundingBox.WestLon < -180.0 ||
|
|
|
|
|
img->BoundingBox.EastLon > 180.0 ||
|
|
|
|
|
img->BoundingBox.EastLon - img->BoundingBox.WestLon < 0.0 ||
|
|
|
|
|
img->BoundingBox.NorthLat > 90.0 ||
|
|
|
|
|
img->BoundingBox.SouthLat < -90.0 ||
|
|
|
|
|
img->BoundingBox.NorthLat - img->BoundingBox.SouthLat < 0.0)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// point<6E><74>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>֤
|
|
|
|
|
if (point.x < 0 || point.x > img->ImgWidth - 1 ||
|
|
|
|
|
point.y < 0 || point.y > img->ImgHeight - 1)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
double LatResolution = (img->BoundingBox.NorthLat - img->BoundingBox.SouthLat) / img->ImgHeight;
|
|
|
|
|
double LonResolution = (img->BoundingBox.EastLon - img->BoundingBox.WestLon) / img->ImgWidth;
|
|
|
|
|
|
|
|
|
|
PtLatLon.Latitude = img->BoundingBox.NorthLat - LatResolution * point.y;
|
|
|
|
|
PtLatLon.Longitude = img->BoundingBox.WestLon + LonResolution * point.x;
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
catch(cv::Exception &e)
|
|
|
|
|
{
|
|
|
|
|
e.msg;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
catch(...)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// <20>鱨ͨ<E9B1A8>ýṹ<C3BD><E1B9B9> <20><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD>ͷ<EFBFBD>λ
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD>ͷ<EFBFBD>λ
|
|
|
|
|
//<2F><><EFBFBD>룺 1. qbData ͨ<><CDA8><EFBFBD>鱨<EFBFBD><E9B1A8><EFBFBD>ݽṹ<DDBD><E1B9B9>
|
|
|
|
|
// 2. pt1 <20><><EFBFBD>㣨<EFBFBD><E3A3A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>꣩
|
|
|
|
|
// 3. pt2 <20>յ㣨<D5B5><E3A3A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>꣩
|
|
|
|
|
// 4. flags<67><73>flags = 0<><30><EFBFBD><EFBFBD>ʶpt1<74><31>pt2Ϊ<32><CEAA><EFBFBD><EFBFBD>У<EFBFBD><D0A3>ǰͼ<C7B0><CDBC><EFBFBD>еĵ<D0B5>
|
|
|
|
|
// flags = 1<><31><EFBFBD><EFBFBD>ʶpt1<74><31>pt2Ϊ<32><CEAA><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>еĵ<D0B5>
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1. distance <20><><EFBFBD><EFBFBD>
|
|
|
|
|
// 2. azAngle <20><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㵽<EFBFBD>յ<EFBFBD>
|
|
|
|
|
// 3. <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>true<75><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>false
|
|
|
|
|
bool QBStruCalTwoPtsDistanceAzimuth(double &distance, double &azAngle,
|
|
|
|
|
const QBStru *qbData, cv::Point pt1, cv::Point pt2, int flags)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
// <20><>ָ<EFBFBD><D6B8><EFBFBD>ж<EFBFBD>
|
|
|
|
|
if (qbData == NULL)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч
|
|
|
|
|
if (qbData->image.bValid == false)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>У<EFBFBD><D0A3>ǰ
|
|
|
|
|
if (flags == 0)
|
|
|
|
|
{
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
|
|
|
|
|
if (qbData->framePart.bValid == false)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return CalTwoPointsDistanceAzimuth(distance, azAngle, &qbData->framePart, pt1, pt2);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (flags == 1) // <20><><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>
|
|
|
|
|
{
|
|
|
|
|
return ImgStruCalTwoPtsDistanceAzimuth(distance, azAngle, &qbData->image.geoImg, pt1, pt2);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch(cv::Exception &e)
|
|
|
|
|
{
|
|
|
|
|
e.msg;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
catch(...)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD><DDBC>㼸<EFBFBD><E3BCB8>У<EFBFBD><D0A3>ǰͼ<C7B0><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD>ͷ<EFBFBD>λ
|
|
|
|
|
bool CalTwoPointsDistanceAzimuth(double &distance, double &azAngle, const struQB_FJ *frameData, cv::Point pt1, cv::Point pt2)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
bool retPoint1 = false;
|
|
|
|
|
bool retPoint2 = false;
|
|
|
|
|
|
|
|
|
|
double fromLon = 0.0;
|
|
|
|
|
double fromLat = 0.0;
|
|
|
|
|
double fromH = 0.0;
|
|
|
|
|
|
|
|
|
|
double toLon = 0.0;
|
|
|
|
|
double toLat = 0.0;
|
|
|
|
|
double toH = 0.0;
|
|
|
|
|
|
|
|
|
|
retPoint1 = CalAnyPtCoordinate(fromLon, fromLat, fromH, frameData, int(pt1.x), int(pt1.y));
|
|
|
|
|
retPoint2 = CalAnyPtCoordinate(toLon, toLat, toH, frameData, int(pt2.x), int(pt2.y));
|
|
|
|
|
|
|
|
|
|
if (retPoint1 == true && retPoint2 == true)
|
|
|
|
|
{
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD>ͷ<EFBFBD>λ <20><><EFBFBD><EFBFBD>ƽ
|
|
|
|
|
CalculateTwoPtsDistanceAzimuth(distance, azAngle, fromLon, fromLat, toLon, toLat, 1);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
catch(cv::Exception &e)
|
|
|
|
|
{
|
|
|
|
|
e.msg;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
catch(...)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵĶ<C9B5><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
//<2F><><EFBFBD>룺 1. qbData ͨ<><CDA8><EFBFBD>鱨<EFBFBD><E9B1A8><EFBFBD>ݽṹ<DDBD><E1B9B9>
|
|
|
|
|
// 2. points ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|
|
|
|
// 3. count<6E><74> <20><><EFBFBD><EFBFBD>Ŀ
|
|
|
|
|
// 4. flags<67><73>flags = 0<><30><EFBFBD><EFBFBD>ʶpointsΪ<73><CEAA><EFBFBD><EFBFBD>У<EFBFBD><D0A3>ǰͼ<C7B0><CDBC><EFBFBD>еĵ<D0B5>
|
|
|
|
|
// flags = 1<><31><EFBFBD><EFBFBD>ʶpointsΪ<73><CEAA><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>еĵ<D0B5>
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1. area <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
// 2. <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>true<75><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>false
|
|
|
|
|
bool QBStruCalPolygonArea(double& area, const QBStru *qbData, cv::Point* points, int count, int flags)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
if (qbData == NULL)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ֵ
|
|
|
|
|
bool ret = false;
|
|
|
|
|
|
|
|
|
|
// ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч
|
|
|
|
|
if (qbData->image.bValid == false)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|
|
|
|
if (points == NULL || count <= 2)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>У<EFBFBD><D0A3>ǰ
|
|
|
|
|
if (flags == 0)
|
|
|
|
|
{
|
|
|
|
|
return CalPolygonArea(area, &qbData->framePart, points, count);
|
|
|
|
|
}
|
|
|
|
|
else if (flags == 1) // <20><><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>
|
|
|
|
|
{
|
|
|
|
|
GeoCoordinatePoint* GeoPoints = NULL;
|
|
|
|
|
GeoPoints = new GeoCoordinatePoint[count];
|
|
|
|
|
|
|
|
|
|
if (GeoPoints != NULL)
|
|
|
|
|
{
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>ľ<EFBFBD>γ<EFBFBD><CEB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
for(int i = 0; i < count; i++)
|
|
|
|
|
{
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
if (ImgStruCalOnePtLonLat(GeoPoints[i], &qbData->image.geoImg, points[i]) == false)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵĵ㹹<C4B5>ɵĶ<C9B5><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
bool ret = false;
|
|
|
|
|
ret = CalPolygonArea(area, GeoPoints, count);
|
|
|
|
|
|
|
|
|
|
// <20>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
|
|
|
|
|
delete [] GeoPoints;
|
|
|
|
|
GeoPoints = NULL;
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
catch(cv::Exception &e)
|
|
|
|
|
{
|
|
|
|
|
e.msg;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
catch(...)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵĶ<C9B5><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
//<2F><><EFBFBD>룺 1. frameData <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
// 2. points ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|
|
|
|
// 3. count<6E><74> <20><><EFBFBD><EFBFBD>Ŀ
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1. area <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
// 2. <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>true<75><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>false
|
|
|
|
|
bool CalPolygonArea(double& area, const struQB_FJ *frameData, cv::Point* points, int count)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
// <20><><EFBFBD>㼸<EFBFBD><E3BCB8>У<EFBFBD><D0A3>ǰ<EFBFBD><C7B0>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ӧ<EFBFBD>ľ<EFBFBD>γ<EFBFBD><CEB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
GeoCoordinatePoint* GeoPoints = NULL;
|
|
|
|
|
GeoPoints = new GeoCoordinatePoint[count];
|
|
|
|
|
|
|
|
|
|
if (GeoPoints != NULL)
|
|
|
|
|
{
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>ľ<EFBFBD>γ<EFBFBD><CEB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
for(int i = 0; i < count; i++)
|
|
|
|
|
{
|
|
|
|
|
double Hi = 0.0;
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>У<EFBFBD><D0A3>ǰ <20><><EFBFBD><EFBFBD>
|
|
|
|
|
if (CalAnyPtCoordinate(GeoPoints[i].Longitude,GeoPoints[i].Latitude, Hi, frameData, int(points[i].x), int(points[i].y)) == false)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵĵ㹹<C4B5>ɵĶ<C9B5><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
bool ret = false;
|
|
|
|
|
ret = CalPolygonArea(area, GeoPoints, count);
|
|
|
|
|
|
|
|
|
|
// <20>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
|
|
|
|
|
delete [] GeoPoints;
|
|
|
|
|
GeoPoints = NULL;
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch(cv::Exception &e)
|
|
|
|
|
{
|
|
|
|
|
e.msg;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
catch(...)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>龭γ<E9BEAD>ȵ㹹<C8B5>ɵĶ<C9B5><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
// <20><><EFBFBD>룺 1. points ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|
|
|
|
// 2. count <20><><EFBFBD><EFBFBD>Ŀ
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1. area <20><><EFBFBD><EFBFBD>
|
|
|
|
|
// 2. <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>true<75><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>false
|
|
|
|
|
bool CalPolygonArea(double& area, GeoCoordinatePoint* points, int count)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|
|
|
|
if (points == NULL || count <= 2)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>жϵ<D0B6>һ<EFBFBD><D2BB><EFBFBD>㣬ֵ<E3A3AC><D6B5><EFBFBD><EFBFBD>Χ<EFBFBD>Ƿ<EFBFBD>Խ<EFBFBD><D4BD>
|
|
|
|
|
if (points[0].Latitude < -90.0 || points[0].Latitude > 90.0 ||
|
|
|
|
|
points[0].Longitude < -180.0 || points[0].Longitude > 180.0)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cv::Point2f* CorPoint = NULL;
|
|
|
|
|
CorPoint = new cv::Point2f[count];
|
|
|
|
|
|
|
|
|
|
if (CorPoint != NULL)
|
|
|
|
|
{
|
|
|
|
|
// <20>Ե<EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD><CEAA><EFBFBD><D7BC>0,0<><30>
|
|
|
|
|
CorPoint[0].x = 0;
|
|
|
|
|
CorPoint[0].y = 0;
|
|
|
|
|
|
|
|
|
|
for(int i = 1; i < count; i++)
|
|
|
|
|
{
|
|
|
|
|
if (points[i].Latitude < -90.0 || points[i].Latitude > 90.0 ||
|
|
|
|
|
points[i].Longitude < -180.0 || points[i].Longitude > 180.0)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
double distance = 0.0; // <20><><EFBFBD><EFBFBD>
|
|
|
|
|
double azAngle = 0.0; // <20><>λ
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD>ͷ<EFBFBD>λ
|
|
|
|
|
CalculateTwoPtsDistanceAzimuth(distance, azAngle, points[0].Longitude, points[0].Latitude, points[i].Longitude, points[i].Latitude, 1);
|
|
|
|
|
|
|
|
|
|
azAngle = 90 - azAngle;
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
CorPoint[i].x = static_cast<float>(distance * cos(azAngle * 3.1415926536 / 180));
|
|
|
|
|
CorPoint[i].y = static_cast<float>(distance * sin(azAngle * 3.1415926536 / 180));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
bool ret = false;
|
|
|
|
|
ret = CalPolygonArea(area, CorPoint, count);
|
|
|
|
|
|
|
|
|
|
// <20>ͷŷ<CDB7><C5B7><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
|
|
|
|
delete [] CorPoint;
|
|
|
|
|
CorPoint = NULL;
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
catch(cv::Exception &e)
|
|
|
|
|
{
|
|
|
|
|
e.msg;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
catch(...)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㹹<EFBFBD>ɵĶ<C9B5><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
// <20><><EFBFBD>룺 1. points ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|
|
|
|
// 2. count <20><><EFBFBD><EFBFBD>Ŀ
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1. area <20><><EFBFBD><EFBFBD> <20><EFBFBD>λ
|
|
|
|
|
// 2. <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>true<75><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>false
|
|
|
|
|
bool CalPolygonArea(double& area, cv::Point2f* points, int count)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
if (points == NULL || count <= 2)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cv::Point2f* newPoints = NULL;
|
|
|
|
|
newPoints = new cv::Point2f[count + 1];
|
|
|
|
|
|
|
|
|
|
if (newPoints != NULL)
|
|
|
|
|
{
|
|
|
|
|
int i = 0;
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < count; i++)
|
|
|
|
|
{
|
|
|
|
|
newPoints[i].x = points[i].x;
|
|
|
|
|
newPoints[i].y = points[i].y;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
newPoints[count].x = points[0].x;
|
|
|
|
|
newPoints[count].y = points[0].y;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
area = 0.0;
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < count; i++)
|
|
|
|
|
{
|
|
|
|
|
area += newPoints[i].x * newPoints[i+1].y - newPoints[i+1].x * newPoints[i].y;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
area = abs(area / 2.0);
|
|
|
|
|
|
|
|
|
|
delete [] newPoints;
|
|
|
|
|
newPoints = NULL;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
catch(cv::Exception &e)
|
|
|
|
|
{
|
|
|
|
|
e.msg;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
catch(...)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|