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.

550 lines
11 KiB
C++

2 years ago
#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;
}
}