feat: 测绘航线生成算法优化,航测区域禁止绘制凹多边形。

pull/32/head
cbwu 11 months ago
parent c2be9a49ed
commit 86e2541bb1

File diff suppressed because it is too large Load Diff

@ -397,7 +397,7 @@ BEGIN
COMBOBOX IDC_COMBO_DIRECTION,67,49,73,63,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
END
IDD_DLG_DESIGNSURVEYLINE DIALOGEX 0, 0, 211, 119
IDD_DLG_DESIGNSURVEYLINE DIALOGEX 0, 0, 211, 138
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "航测航线设计"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
@ -406,18 +406,20 @@ BEGIN
EDITTEXT IDC_EDIT_HEIGHT,70,11,41,15,ES_AUTOHSCROLL,WS_EX_RIGHT
LTEXT "航线间隔(m):",IDC_STATIC,10,32,57,10
EDITTEXT IDC_EDIT_LINEINTERVAL,70,29,41,15,ES_AUTOHSCROLL,WS_EX_RIGHT
PUSHBUTTON "导入航测区",IDC_BTN_INPUTREGION,10,68,55,18
PUSHBUTTON "绘制航测区",IDC_BTN_DRAWREGION,69,68,55,18
PUSHBUTTON "保存航测区",IDC_BTN_SAVEREGION,128,68,55,18
PUSHBUTTON "装订航线",IDC_BTN_BINDLINE,10,90,55,18
PUSHBUTTON "生成航线",IDC_BTN_CALCULATELINE,69,90,55,18
PUSHBUTTON "导入航测区",IDC_BTN_INPUTREGION,10,90,55,18
PUSHBUTTON "绘制航测区",IDC_BTN_DRAWREGION,69,90,55,18
PUSHBUTTON "保存航测区",IDC_BTN_SAVEREGION,128,90,55,18
PUSHBUTTON "装订航线",IDC_BTN_BINDLINE,10,112,55,18
PUSHBUTTON "生成航线",IDC_BTN_CALCULATELINE,69,112,55,18
LTEXT "航程:",IDC_STATIC,114,14,44,10
LTEXT "0 m",IDC_TXT_ROUTELENGTH,140,14,50,10
LTEXT "航时:",IDC_STATIC,115,32,44,10
LTEXT "飞行速度(m/s):",IDC_STATIC,6,50,66,10
EDITTEXT IDC_EDIT_FLYSPEED,70,47,41,15,ES_AUTOHSCROLL,WS_EX_RIGHT
PUSHBUTTON "航时计算",IDC_BTN_CALCULATETIME,123,46,52,16
LTEXT "飞行速度(m/s):",IDC_STATIC,6,68,66,10
EDITTEXT IDC_EDIT_FLYSPEED,70,65,41,15,ES_AUTOHSCROLL,WS_EX_RIGHT
PUSHBUTTON "航时计算",IDC_BTN_CALCULATETIME,123,64,52,16
LTEXT "0时0分0秒",IDC_TXT_FLYTIME,141,32,59,10
LTEXT "航线外扩(m):",IDC_STATIC,10,49,57,10
EDITTEXT IDC_EDIT_EXTERNALLENGTH,70,46,41,15,ES_AUTOHSCROLL,WS_EX_RIGHT
END
IDD_DLG_SETMULTIROUTE DIALOGEX 0, 0, 210, 159
@ -574,7 +576,7 @@ BEGIN
LEFTMARGIN, 3
RIGHTMARGIN, 207
TOPMARGIN, 3
BOTTOMMARGIN, 114
BOTTOMMARGIN, 134
END
IDD_DLG_SETMULTIROUTE, DIALOG

@ -1932,8 +1932,24 @@ void CGISDlg::MouseDownMap1(short Button, short Shift, long x, long y)
//像素坐标转换地理坐标
m_map.PixelToProj(x,y, &dX, &dY);
surveyRegionLons.push_back(dX);
surveyRegionLats.push_back(dY);
if (surveyRegionLons.size()>2)
{
TopologicalAnalysis analysis;
Point2D p;
p.x = dX;
p.y = dY;
if(!analysis.isPointInPolygon(p,surveyRegionLons,surveyRegionLats)) //禁止绘制凹多边形
{
surveyRegionLons.push_back(dX);
surveyRegionLats.push_back(dY);
}
}
else
{
surveyRegionLons.push_back(dX);
surveyRegionLats.push_back(dY);
}
}
if (m_bHaveShowDistanceDlg && (Button == 1))

@ -263,11 +263,13 @@ bool TopologicalAnalysis::GetBoundingBoxVertices(const vector<double>& polygonX,
}
//计算直线与多边形的交点
void TopologicalAnalysis::linePolygonIntersections(const Point2D& linePt1,const Point2D& linePt2,const vector<double>& polygonX,const vector<double>& polygonY, vector<Point2D>& result)
int TopologicalAnalysis::linePolygonIntersections(const Point2D& linePt1,const Point2D& linePt2,const vector<double>& polygonX,const vector<double>& polygonY, vector<Point2D>& result)
{
Line2D line1;
line1.p1 = linePt1;
line1.p2 = linePt2;
line1.is_seg = false;
Point2D intersectionPt;
vector<Point2D> resPoints;
for (int i=0;i<polygonX.size()-1;++i)
@ -280,15 +282,34 @@ void TopologicalAnalysis::linePolygonIntersections(const Point2D& linePt1,const
Line2D line2;
line2.p1 = pt1;
line2.p2 = pt2;
line2.is_seg = false;
/*
int type = isLineIntersecting(line1,line2,intersectionPt);
if (type == 1 || type == 2) //相交或重合
{
resPoints.push_back(intersectionPt);
}*/
/*
if (isSegIntersect(line1,line2,intersectionPt))
{
line2.is_seg = true;
if (isponl(intersectionPt,line2))
{
resPoints.push_back(intersectionPt);
}
//resPoints.push_back(intersectionPt);
}*/
if (findIntersection(linePt1.x,linePt1.y,linePt2.x,linePt2.y,pt1.x,pt1.y,pt2.x,pt2.y,intersectionPt))
{
resPoints.push_back(intersectionPt);
}
}
if (resPoints.size()>0)
if (resPoints.size()>1)
{
//获取最左或者最右的两个点,忽略凹多边形中间交点
double minX = resPoints[0].x;
@ -304,6 +325,8 @@ void TopologicalAnalysis::linePolygonIntersections(const Point2D& linePt1,const
result.push_back(resPoints[maxIndex]);
}
return resPoints.size();
}
// 判断两条线段是否相交
@ -332,8 +355,121 @@ int TopologicalAnalysis::isLineIntersecting(const Line2D& l1, const Line2D& l2,
intersection.x = l1.p1.x + ua*(l1.p2.x - l1.p1.x);
intersection.y = l1.p1.y + ua*(l1.p2.y - l1.p1.y);
/*
double a1 = l1.p2.y - l1.p1.y;
double b1 = l1.p1.x - l1.p2.x;
double c1 = l1.p2.x * l1.p1.y - l1.p1.x * l1.p2.y;
double a2 = l2.p2.y - l2.p1.y;
double b2 = l2.p1.x - l2.p2.x;
double c2 = l2.p2.x * l2.p1.y - l2.p1.x * l2.p2.y;
double det = a1 * b2 - a2 * b1;
intersection.x = (b2 * c1 - b1 * c2) / det;
intersection.y = (a1 * c2 - a2 * c1) / det;*/
return 1; //相交
}
return 0; //不相交
}
//计算多边形最小宽度
int TopologicalAnalysis::getLineWithPolygonMinWidth(const vector<double>& polygonX,const vector<double>& polygonY)
{
int n = polygonX.size();
double minWidth = INT64_MAX;
int lineID = 0;
for (int i=0;i<n-1;++i) //遍历每一条边
{
int startID = i;
int endID = i + 1;
double width = 0;
for (int j=0;j<n-1;++j) //计算除边两个顶点外多边形其他顶点到直线的距离
{
if(startID == j || endID == j || (endID== n-1 && j==0)) continue;
//计算垂足点
double linePt1[2] = {polygonX[startID],polygonY[startID]};
double linePt2[2] = {polygonX[endID],polygonY[endID]};
double targetPt[2] = {0.0,0.0};
double pt[2] = {polygonX[j],polygonY[j]};
GetPointToLineVerticalCross(linePt1,linePt2,pt,targetPt);
//计算距离
double dist;
CalculateTwoPtsDistance(dist,pt[0],pt[1],targetPt[0],targetPt[1],3);
if(dist > width) width = dist;
}
if(width < minWidth)
{
minWidth = width;
lineID = startID;
}
}
return lineID;
}
//判断点与直线的位置关系
int TopologicalAnalysis::pointPosition(const Point2D& pt,const Line2D& line)
{
double cross = crossProduct(line.p1, line.p2, pt);
if (cross > 0) {
return 1; //左侧
} else if (cross < 0) {
return -1; //右侧
} else {
return 0; //线上
}
}
// 判断点P是否在多边形polygon内
bool TopologicalAnalysis::isPointInPolygon(const Point2D& P, vector<double>& regionLons,vector<double>& regionLats) {
int n = regionLons.size();
bool inside = false;
double xints;
for(int i=0, j=n-1; i<n; j=i++) {
double xi = regionLons[i], yi = regionLats[i];
double xj = regionLons[j], yj = regionLats[j];
// 点在多边形的顶点上也是一种特殊情况,这里简化处理未包含
// 检查射线是否与当前边相交
if(((yi > P.y) != (yj > P.y)) && // 边的两端点在射线两侧
(P.x < (xj - xi) * (P.y - yi) / (yj - yi) + xi)) { // 射线与边相交的条件
inside = !inside; // 交点数加一改变inside状态
}
}
return inside;
}
//直线与线段的交点
bool TopologicalAnalysis::findIntersection(double x1, double y1, double x2, double y2, // 直线1的两个点
double x3, double y3, double x4, double y4,Point2D& intersection) { // 线段的两个端点
// 计算直线1的方向向量
double dx1 = x2 - x1;
double dy1 = y2 - y1;
// 计算线段的方向向量
double dx2 = x4 - x3;
double dy2 = y4 - y3;
// 计算向量积,判断是否平行(即无交点)
double cross = -dx1 * dy2 + dy1 * dx2;
if (cross == 0) return false;
// 计算参数t1直线1上的点和t2线段上的点
double t1 = (dx2 * (y3 - y1) - dy2 * (x3 - x1)) / cross;
double t2 = (dx1 * (y3 - y1) - dy1 * (x3 - x1)) / cross;
// 判断t2是否在线段上
if (t2 >= 0 && t2 <= 1) {
// 计算并返回交点坐标
intersection.x = x1 + t1 * dx1;
intersection.y = y1 + t1 * dy1;
return true;
} else {
// 如果t2不在[0, 1]区间内,说明不相交于线段上
return false;
}
}

@ -5,14 +5,26 @@
#include <algorithm>
#include <limits>
#include "geocompute.h"
#include <cstdint>
using namespace std;
struct Point2D {
double x, y;
//double x, y;
double x; // x坐标
double y; // y坐标
double z; // z坐标默认为0如果需要三维点则给z赋值
Point2D(double a = 0, double b = 0, double c = 0) { x = a; y = b; z = c; } // 构造函数
};
struct Line2D {
Point2D p1, p2;
//Point2D p1, p2;
Point2D p1; // 起点
Point2D p2; // 终点
bool is_seg; // 是否是线段
Line2D() {}; // 默认构造函数
Line2D(Point2D a, Point2D b, bool _is_seg = true) { p1 = a; p2 = b; is_seg = _is_seg; } // 构造函数(默认是线段)
};
struct Rectangle2D {
@ -55,12 +67,230 @@ public:
bool GetBoundingBoxVertices(const vector<double>& polygonX,const vector<double>& polygonY,vector<double>& rectangleX,vector<double>& rectangleY);
//计算直线与多边形的交点
void linePolygonIntersections(const Point2D& linePt1,const Point2D& linePt2,const vector<double>& polygonX,const std::vector<double>& polygonY,std::vector<Point2D>& result);
int linePolygonIntersections(const Point2D& linePt1,const Point2D& linePt2,const vector<double>& polygonX,const std::vector<double>& polygonY,std::vector<Point2D>& result);
/** 计算多边形最小宽度对应的边
* param: polygonX,polygonY,()
* return: 线ID
*/
int getLineWithPolygonMinWidth(const vector<double>& polygonX,const vector<double>& polygonY);
//判断点与直线的位置关系
int pointPosition(const Point2D& pt,const Line2D& line);
// 判断点P是否在多边形polygon内
bool isPointInPolygon(const Point2D& P, vector<double>& regionLons,vector<double>& regionLats);
private:
// 判断两条线段是否相交
int isLineIntersecting(const Line2D& l1, const Line2D& l2, Point2D& intersection);
//数学计算
private:
//计算两点(向量)的点积
double dotProduct(const Point2D& p1, const Point2D& p2) {
return p1.x * p2.x + p1.y * p2.y;
}
//计算两个点(向量)之间的差向量
Point2D subtract(const Point2D& p1, const Point2D& p2) {
Point2D point;
point.x = p1.x - p2.x;
point.y = p1.y - p2.y;
return point;
}
//计算向量叉积
double crossProduct(const Point2D& A, const Point2D& B, const Point2D& P) {
return (B.x - A.x) * (P.y - A.y) - (B.y - A.y) * (P.x - A.x);
}
/*
double length(const Point2D& p) {
return std::sqrt(p.x * p.x + p.y * p.y);
}*/
/*
Point2D normalize(const Point2D& p) {
double len = length(p);
Point2D pt;
pt.x = p.x / len;
pt.y = p.y / len;
return pt;
}*/
private:
// 点的加法
Point2D add(const Point2D& lhs, const Point2D& rhs)
{
Point2D res;
res.x = lhs.x + rhs.x;
res.y = lhs.y + rhs.y;
res.z = lhs.z + rhs.z;
return res;
}
// 点的减法
Point2D sub(const Point2D& lhs, const Point2D& rhs)
{
Point2D res;
res.x = lhs.x - rhs.x;
res.y = lhs.y - rhs.y;
res.z = lhs.z - rhs.z;
return res;
}
// 向量的乘法
Point2D mul(const Point2D& p, double ratio)
{
Point2D res;
res.x = p.x * ratio;
res.y = p.y * ratio;
res.z = p.z * ratio;
return res;
}
// 向量的除法
Point2D div(const Point2D& p, double ratio)
{
Point2D res;
res.x = p.x / ratio;
res.y = p.y / ratio;
res.z = p.z / ratio;
return res;
}
// 点判断相等
bool equal(const Point2D& lhs, const Point2D& rhs)
{
return(lhs.x == rhs.x && lhs.y == rhs.y && lhs.z == rhs.z);
}
// 1.3、矢量标准化矢量的长度规约到1
//
// 参数: vec 矢量
//
Point2D normalize(const Point2D& vec)
{
Point2D res;
res = div(vec, length(vec));
return res;
}
// 1.9、点是否在线上
// 线分为直线和线段,直线表示的是直线是否经过点
//
// 参数p : 点 l : 线段或者线
//
bool isponl(const Point2D& p, const Line2D& l)
{
Point2D line_vec = sub(l.p2, l.p1);
Point2D point_vec1 = sub(p, l.p1);
Point2D point_vec2 = sub(p, l.p2);
Point2D mul_vec = multiply(line_vec, point_vec1);
double dot = dotMultiply(point_vec1, point_vec2);
// 点是否在线段上
if (l.is_seg)
{
if (equal(p, l.p1) || equal(p, l.p2))
return true;
return (0.0 == length(mul_vec) && dot < 0.0);
}
// 点是否在直线上
else
{
return (0.0 == length(mul_vec));
}
}
// 1.4、矢量点乘
//
// 参数:(p1-op)为矢量1p2-op为矢量2
//
double dotMultiply(const Point2D& op, const Point2D& p1, const Point2D& p2)
{
return ((p1.x - op.x) * (p2.x - op.x) + (p1.y - op.y) * (p2.y - op.y) + (p1.z - op.z) * (p2.z - op.z));
}
// 参数vec1为矢量1vec2为矢量2
//
double dotMultiply(const Point2D& vec1, const Point2D& vec2)
{
return(vec1.x * vec2.x + vec1.y * vec2.y + vec1.z * vec2.z);
}
// 1.5、矢量叉乘
//
// 参数:(p1-op)为矢量1p2-op为矢量2
//
Point2D multiply(const Point2D& op, const Point2D& p1, const Point2D& p2)
{
Point2D result;
result.x = (p1.y - op.y) * (p2.z - op.z) - (p2.y - op.y) * (p1.z - op.z);
result.y = (p1.z - op.z) * (p2.x - op.x) - (p2.z - op.z) * (p1.x - op.x);
result.z = (p1.x - op.x) * (p2.y - op.y) - (p2.x - op.x) * (p1.y - op.y);
return result;
}
// 参数: vec1为矢量1vec2为矢量2
//
Point2D multiply(const Point2D& vec1, const Point2D& vec2)
{
Point2D result;
result.x = vec1.y * vec2.z - vec2.y * vec1.z;
result.y = vec1.z * vec2.x - vec2.z * vec1.x;
result.z = vec1.x * vec2.y - vec2.x * vec1.y;
return result;
}
// 参数: vec1 矢量1 vec2 矢量2
//
double Cos(const Point2D& vec1, const Point2D& vec2)
{
Point2D unit_vec1 = normalize(vec1);
Point2D unit_vec2 = normalize(vec2);
return dotMultiply(unit_vec1, unit_vec2);
}
// 1.2、矢量的长度
//
// 参数: vec 矢量
//
double length(const Point2D& vec)
{
return (sqrt(pow(vec.x, 2) + pow(vec.y, 2) + pow(vec.z, 2)));
}
// 计算两点之间的向量
Point2D mathVector(const Point2D& p1, const Point2D& p2) {
Point2D pt;
pt.x = p2.x - p1.x;
pt.y = p2.y - p1.y;
return pt;
}
// 计算两点之间的叉积
double crossProduct(const Point2D& p1, const Point2D& p2) {
return p1.x * p2.y - p1.y * p2.x;
}
//直线与线段的交点
bool findIntersection(double x1, double y1, double x2, double y2, // 直线1的两个点
double x3, double y3, double x4, double y4,Point2D& intersection);
};

@ -48,8 +48,8 @@ BOOL DesignSurveyLineDlg::OnInitDialog()
GetDlgItem( IDC_BTN_CALCULATELINE )->EnableWindow( false );
GetDlgItem( IDC_BTN_CALCULATETIME )->EnableWindow( false );
SetDlgItemText(IDC_EDIT_FLYSPEED,"10");
SetDlgItemText(IDC_EDIT_EXTERNALLENGTH,"0");
return TRUE;
}
@ -76,6 +76,8 @@ CString DesignSurveyLineDlg::extractFileName(CString fileName)
//设置航测区域
void DesignSurveyLineDlg::SetSurveyRegion(const vector<double>& lons,const vector<double>& lats)
{
surveyRegionLons.clear();
surveyRegionLats.clear();
for (int i=0;i<lons.size();++i)
{
surveyRegionLons.push_back(lons[i]);
@ -85,39 +87,108 @@ void DesignSurveyLineDlg::SetSurveyRegion(const vector<double>& lons,const vecto
}
//计算测绘航线
void DesignSurveyLineDlg::calculateSurveyLine(double lineInterval,vector<double>&surveyLineLons,vector<double>& surveyLineLats)
void DesignSurveyLineDlg::calculateSurveyLine(double lineInterval,vector<double>&surveyLineLons,vector<double>& surveyLineLats,double outLength)
{
vector<double> recLons;
vector<double> recLats;
TopologicalAnalysis analysis;
GeoCompute geocompute;
analysis.GetBoundingBoxVertices(surveyRegionLons,surveyRegionLats,recLons,recLats);
//计算外包矩形
//analysis.GetBoundingBoxVertices(surveyRegionLons,surveyRegionLats,recLons,recLats);
int startPt1 = analysis.getLineWithPolygonMinWidth(surveyRegionLons,surveyRegionLats);
recLons.push_back(surveyRegionLons[startPt1]);
recLons.push_back(surveyRegionLons[startPt1+1]);
recLats.push_back(surveyRegionLats[startPt1]);
recLats.push_back(surveyRegionLats[startPt1+1]);
double flyAngle;//飞行航向
CalculateTwoPtsAzimuth(flyAngle,surveyRegionLons[startPt1],surveyRegionLats[startPt1],surveyRegionLons[startPt1+1],surveyRegionLats[startPt1+1],3);
//计算偏移航向
Line2D line;
line.p1.x = surveyRegionLons[startPt1];
line.p1.y = surveyRegionLats[startPt1];
line.p2.x = surveyRegionLons[startPt1 + 1];
line.p2.y = surveyRegionLats[startPt1 + 1];
Point2D p; //直线的下一个顶点
if (startPt1+1 == (surveyRegionLons.size()-1)) //直线为多边形最后一条边
{
p.x = surveyRegionLons[1];
p.y = surveyRegionLats[1];
}
else
{
p.x = surveyRegionLons[startPt1 + 2];
p.y = surveyRegionLats[startPt1 + 2];
}
int ptPos = analysis.pointPosition(p,line);
if (ptPos == 1) //左侧
{
int i = (flyAngle + 270)/360;
flyAngle = (flyAngle + 270) - 360*i;
}
else if(ptPos == -1) //右侧
{
int i = (flyAngle + 90)/360;
flyAngle = (flyAngle + 90) - 360*i;
}
double lon1,lat1,lon2,lat2;
//第一条切割线为航线间隔一半
geocompute.computeOffsetGeoPosition(recLons[0],recLats[0],180,lineInterval/2000,lon1,lat1);
geocompute.computeOffsetGeoPosition(recLons[1],recLats[1],180,lineInterval/2000,lon2,lat2);
geocompute.computeOffsetGeoPosition(recLons[0],recLats[0],flyAngle,lineInterval/2000,lon1,lat1);
geocompute.computeOffsetGeoPosition(recLons[1],recLats[1],flyAngle,lineInterval/2000,lon2,lat2);
Point2D pt1,pt2;
pt1.x = lon1;
pt1.y = lat1;
pt2.x = lon2;
pt2.y = lat2;
vector<Point2D> result;
analysis.linePolygonIntersections(pt1,pt2,surveyRegionLons,surveyRegionLats,result);
//交点个数
int nCrossPt = analysis.linePolygonIntersections(pt1,pt2,surveyRegionLons,surveyRegionLats,result);
while(lat1>recLats[2]){
while(nCrossPt>1){
//平移切割线
geocompute.computeOffsetGeoPosition(lon1,lat1,180,lineInterval/1000,lon1,lat1);
geocompute.computeOffsetGeoPosition(lon2,lat2,180,lineInterval/1000,lon2,lat2);
geocompute.computeOffsetGeoPosition(lon1,lat1,flyAngle,lineInterval/1000,lon1,lat1);
geocompute.computeOffsetGeoPosition(lon2,lat2,flyAngle,lineInterval/1000,lon2,lat2);
pt1.x = lon1;
pt1.y = lat1;
pt2.x = lon2;
pt2.y = lat2;
//计算交点
analysis.linePolygonIntersections(pt1,pt2,surveyRegionLons,surveyRegionLats,result);
nCrossPt = analysis.linePolygonIntersections(pt1,pt2,surveyRegionLons,surveyRegionLats,result);
}
int nlinePts = result.size();
if (nlinePts%2!=0)
{
nlinePts--;
}
//计算外扩航点
if (nlinePts>1 && outLength>0)
{
double angle;
CalculateTwoPtsAzimuth(angle,result[0].x,result[0].y,result[1].x,result[1].y,3);
//计算外扩航向
double outAngle1,outAngle2;
outAngle2 = angle;
int n = (angle + 180)/360;
outAngle1 = (angle + 180) - 360*n;
geocompute.computeOffsetGeoPosition(result[1].x,result[1].y,outAngle2,outLength/1000,lon2,lat2);
result[1].x = lon2;
result[1].y = lat2;
for (int i=2;i<nlinePts;i+=2)
{
geocompute.computeOffsetGeoPosition(result[i].x,result[i].y,outAngle1,outLength/1000,lon1,lat1);
geocompute.computeOffsetGeoPosition(result[i+1].x,result[i+1].y,outAngle2,outLength/1000,lon2,lat2);
result[i].x = lon1;
result[i].y = lat1;
result[i+1].x = lon2;
result[i+1].y = lat2;
}
}
//串联交点
int j = 1;
for (int i=0;i<result.size();i+=2)
int j = 0;
for (int i=0;i<nlinePts;i+=2)
{
if (j == 1)
{
@ -336,12 +407,20 @@ void DesignSurveyLineDlg::OnBnClickedBtnCalculateline()
return;
}
GetDlgItemText(IDC_EDIT_EXTERNALLENGTH,cstr);
double outLength = _ttof(cstr);
if (outLength < 0 )
{
BCGPMessageBox("外扩长度必须大于0m");
return;
}
g_Height = height;
//测绘航线坐标
vector<double> surveyLineLons;
vector<double> surveyLineLats;
//计算航测航线
calculateSurveyLine(lineInterval,surveyLineLons,surveyLineLats);
calculateSurveyLine(lineInterval,surveyLineLons,surveyLineLats,outLength);
//保存航测航线
saveSurveyLine(surveyLineLons,surveyLineLats,height);
//发送消息到主程序,进行标绘

@ -28,7 +28,7 @@ public:
enum { IDD = IDD_DLG_DESIGNSURVEYLINE };
private:
void calculateSurveyLine(double lineInterval,vector<double>&surveyLineLons,vector<double>& surveyLineLats);//¼ÆËã²â»æº½Ïß
void calculateSurveyLine(double lineInterval,vector<double>&surveyLineLons,vector<double>& surveyLineLats,double outLength=0);//¼ÆËã²â»æº½Ïß
void saveSurveyLine(const vector<double>&surveyLineLons,const vector<double>& surveyLineLats,double height); //保存测绘航线
bool saveSurveyRegion(const vector<double>&surveyRegionLons,const vector<double>& surveyRegionLats); //保存航测区域
double calculateRouteLength(const vector<double>&surveyLineLons,const vector<double>& surveyLineLats); //计算航程

@ -166,9 +166,10 @@
#define IDC_EDIT_FLYSPEED 1056
#define IDB_BITMAP2 1057
#define IDC_EDIT_MARKER_NAME 1057
#define IDC_TXT_ROUTELENGTH2 1057
#define IDC_TXT_FLYTIME 1057
#define IDC_TREE_MARKERS 1058
#define IDC_EDIT_ 1058
#define IDC_EDIT_EXTERNALLENGTH 1058
#define IDD_DIALOG_MARKER 1063
#define IDR_MENU3 1066
#define IDR_LIST_POPUP 1066

Loading…
Cancel
Save