⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gpspositiondlg.cpp

📁 地球上用经纬度确定的两点间距离的计算
💻 CPP
字号:
// GPSPositionDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "GPSPosition.h"
#include "GPSPositionDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CGPSPositionDlg 对话框

CGPSPositionDlg::CGPSPositionDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CGPSPositionDlg::IDD, pParent)
{
	m_a_lat_deg = 0;
	m_a_lat_min = 0;
	m_a_lat_sec = 0.0;
	m_a_lon_deg = 0;
	m_a_lon_min = 0;
	m_a_lon_sec = 0.0;
	m_b_lat_min = 0;
	m_b_lat_sec = 0.0;
	m_b_lon_deg = 0;
	m_b_lon_min = 0;
	m_b_lon_sec = 0.0;
	m_dist = 0.0;
	m_b_lat_deg = 0;
   
	m_edit_lona = 0.0;
    m_edit_lata = 0.0;
    m_edit_lonb = 0.0;;
    m_edit_latb = 0.0;


	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CGPSPositionDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Text(pDX, IDC_EDIT6, m_a_lat_deg);
	DDV_MinMaxInt(pDX, m_a_lat_deg, 0, 360);
	DDX_Text(pDX, IDC_EDIT7, m_a_lat_min);
	DDV_MinMaxInt(pDX, m_a_lat_min, 0, 59);
	DDX_Text(pDX, IDC_EDIT8, m_a_lat_sec);
	DDV_MinMaxDouble(pDX, m_a_lat_sec, 0., 59.999999999);
	DDX_Text(pDX, IDC_EDIT9, m_a_lon_deg);
	DDV_MinMaxInt(pDX, m_a_lon_deg, 0, 360);
	DDX_Text(pDX, IDC_EDIT10, m_a_lon_min);
	DDV_MinMaxInt(pDX, m_a_lon_min, 0, 59);
	DDX_Text(pDX, IDC_EDIT11, m_a_lon_sec);
	DDV_MinMaxDouble(pDX, m_a_lon_sec, 0., 59.999999999);
	DDX_Text(pDX, IDC_EDIT13, m_b_lat_min);
	DDX_Text(pDX, IDC_EDIT14, m_b_lat_sec);
	DDV_MinMaxDouble(pDX, m_b_lat_sec, 0., 59.999999999);
	DDX_Text(pDX, IDC_EDIT12, m_b_lon_deg);
	DDV_MinMaxInt(pDX, m_b_lon_deg, 0, 360);
	DDX_Text(pDX, IDC_EDIT16, m_b_lon_min);
	DDV_MinMaxInt(pDX, m_b_lon_min, 0, 59);
	DDX_Text(pDX, IDC_EDIT17, m_b_lon_sec);
	DDV_MinMaxDouble(pDX, m_b_lon_sec, 0., 59.999999999);
	DDX_Text(pDX, IDC_EDIT_distance, m_dist);
	DDX_Text(pDX, IDC_EDIT15, m_b_lat_deg);
	DDV_MinMaxInt(pDX, m_b_lat_deg, 0, 360);


	DDX_Text(pDX, IDC_EDIT_lona, m_edit_lona);
	DDV_MinMaxDouble(pDX, m_edit_lona, 0, 360);
	DDX_Text(pDX, IDC_EDIT_lata, m_edit_lata);
	DDV_MinMaxDouble(pDX, m_edit_lata, 0, 360);

	DDX_Text(pDX, IDC_EDIT_lonb, m_edit_lonb);
	DDV_MinMaxDouble(pDX, m_edit_lonb, 0, 360);
	DDX_Text(pDX, IDC_EDIT_latb, m_edit_latb);
	DDV_MinMaxDouble(pDX, m_edit_latb, 0, 360);

}

BEGIN_MESSAGE_MAP(CGPSPositionDlg, CDialog)
#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
	ON_WM_SIZE()
#endif
	//}}AFX_MSG_MAP

/*
    ON_BN_CLICKED(IDC_RADIO1, OnButton1)
	ON_BN_CLICKED(IDC_RADIO2, OnButton1)
	ON_BN_CLICKED(IDC_RADIO3, OnButton1)
	ON_BN_CLICKED(IDC_RADIO4, OnButton1)
*/

	ON_BN_CLICKED(IDC_BT_Count, &CGPSPositionDlg::OnBnClickedBtCount)
END_MESSAGE_MAP()


// CGPSPositionDlg 消息处理程序

#define PI 3.14159265358979323846

BOOL CGPSPositionDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码
	
	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
void CGPSPositionDlg::OnSize(UINT /*nType*/, int /*cx*/, int /*cy*/)
{
	DRA::RelayoutDialog(
		AfxGetInstanceHandle(), 
		this->m_hWnd, 
		DRA::GetDisplayMode() != DRA::Portrait ? 
			MAKEINTRESOURCE(IDD_GPSPOSITION_DIALOG_WIDE) : 
			MAKEINTRESOURCE(IDD_GPSPOSITION_DIALOG));
}
#endif



double CGPSPositionDlg::CalDist(double lat_a, double lon_a, double lat_b, double lon_b)
{
   double theta = lon_a-lon_b;
   double dist;
   dist = sin(lat_a)*sin(lat_b)+cos(lat_a)*cos(lat_b)*cos(theta);
   dist = acos(dist);
   dist = radtodeg(dist);
   dist = dist *60 *1.1515;
   dist = dist * 1.609344;
   return dist;
}

double CGPSPositionDlg::degminsectorad(int deg, int min, double sec)//作用:将度化为弧度
{
   double ret,temp;
   ret = deg;
   temp = min+sec;
   temp = temp /60.0;
   ret += temp;
   ret =  ret * PI / 180.0;
   return ret;

}

double CGPSPositionDlg::degtorad(double deg)//作用:将度化为弧度
{
   double ret;
   ret = deg;
   //temp = min+sec;
   //temp = temp /60.0;
   //ret += temp;
   ret =  ret * PI / 180.0;
   return ret;

}
double CGPSPositionDlg::radtodeg(double rad)//作用:将弧度转化为度
{
	double ret;
    ret = rad / PI * 180.0;
	return ret;
}


void CGPSPositionDlg::OnBnClickedBtCount()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData();
	double lat_a, lat_b, lon_a, lon_b;

	UINT aSelect = GetCheckedRadioButton(IDC_RADIO1, IDC_RADIO2);
	UINT bSelect = GetCheckedRadioButton(IDC_RADIO3, IDC_RADIO4);
	switch (aSelect)
	{
	case IDC_RADIO1:
		lat_a = degtorad(m_edit_lata);
		lon_a = degtorad(m_edit_lona);
		break;
	case IDC_RADIO2:
		lat_a = degminsectorad(m_a_lat_deg, m_a_lat_min, m_a_lat_sec);
		lon_a = degminsectorad(m_a_lon_deg, m_a_lon_min, m_a_lon_sec);
		break;
	default:
		break;
	}

	switch (bSelect)
	{
	case IDC_RADIO3:
		lat_b = degtorad(m_edit_lata);
		lon_b = degtorad(m_edit_lona);
		break;
	case IDC_RADIO4:
		lat_b = degminsectorad(m_b_lat_deg, m_b_lat_min, m_b_lat_sec);
		lon_b = degminsectorad(m_b_lon_deg, m_b_lon_min, m_b_lon_sec);

		break;
	default:
		break;
	}
	m_dist = CalDist(lat_a, lon_a, lat_b, lon_b);
	UpdateData(FALSE);
}
          

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -