现在的位置: 首页 > 综合 > 正文

两经纬度之间的距离计算

2013年10月03日 ⁄ 综合 ⁄ 共 2088字 ⁄ 字号 评论关闭

以下是计算两经纬度之间距离的代码,分为:头文件、源代码和测试代码三部分。、
具体如下:

// LatLonDistanceDlg.h : 头文件
//

#pragma once

typedef struct
{
	double dLongitude;
	double dLatitude;
}MyLatLong_T,*pMyLatLong_T;

// CLatLonDistanceDlg 对话框
class CLatLonDistanceDlg : public CDialog
{
	......

	void DistanceOfTwoPositions(MyLatLong_T ll_PosStart, MyLatLong_T ll_PosEnd, double &dis);
// 实现
protected:
	......
};

// LatLonDistanceDlg.cpp : 实现文件
//

// 常量定义
const double gConstPI = 3.1415926536;
// WGS-84 长轴半径
#define EARTH_LONG_RADIUS_WGS84	6378137.0		// 单位: 米
// WGS-84 地球扁率(earth flattening)
#define EARTH_FLATTENING_WGS84	298.257223563
// meters per sea mile
#define METERS_PER_SEA_MILE		1852.0

// 输入参数: MyLatLong_T 是个结构,包括经度和纬度
// 输出参数: dDistance 就是返回的大圆距离
void CLatLonDistanceDlg::DistanceOfTwoPositions(MyLatLong_T StartLatLong, MyLatLong_T EndLatLong, double &dDistance)
{
	double DInRadians;
	double dTmpVal = 0.0;
	double dFi = 0.0;
	double dFi2 = 0.0;
	double dDrda = EndLatLong.dLongitude - StartLatLong.dLongitude;
	double dTmp = 0.0;
	double dTmp2 = 0.0;

	dDrda = dDrda * gConstPI / 180.0;	// in radians
	dFi = StartLatLong.dLatitude;
	dFi2 = EndLatLong.dLatitude;

	dFi = dFi * gConstPI / 180.0;		// in radians
	dFi2 = dFi2 * gConstPI / 180.0;		// in radians

	dTmpVal = sin(dFi) * sin(dFi2) + cos(dFi) * cos(dFi2) * cos(dDrda);
	if(fabs(dTmpVal) > 1.0)
	{
		AfxMessageBox(L"Invalidate value of arccos!");		// Use Unicode Character Set
		return ;
	}
	DInRadians = acos(dTmpVal);			// in radians
	dTmp = (sin(dFi) + sin(dFi2));
	dTmp2 = (sin(dFi) - sin(dFi2));
	dTmpVal = ((3 * sin(DInRadians) - DInRadians) * dTmp * dTmp ) / (1 + cos(DInRadians));
	dTmpVal = dTmpVal - ((3 * sin(DInRadians) + DInRadians) * dTmp2 * dTmp2) / (1 - cos(DInRadians));

	dDistance = EARTH_LONG_RADIUS_WGS84 * DInRadians + (EARTH_LONG_RADIUS_WGS84 / (4 * EARTH_FLATTENING_WGS84)) * dTmpVal;//in meters
}

// 测试代码
// TODO: 在此添加额外的初始化代码
{
	// 深圳百合酒店 纬度:22.601369,经度114.115145
	// 深圳百合星城 纬度:22.601334,经度114.115807
	// 深圳布吉农批 纬度:22.583596,经度114.112227
	MyLatLong_T LatLon;
	MyLatLong_T LatLon2;
	MyLatLong_T LatLon3;
	double dDis = 0.0;

	LatLon.dLatitude = 22.601369;
	LatLon.dLongitude = 114.115145;
	LatLon2.dLatitude = 22.601334;
	LatLon2.dLongitude = 114.115807;
	LatLon3.dLatitude = 22.583596;
	LatLon3.dLongitude = 114.112227;

	DistanceOfTwoPositions(LatLon,LatLon2,dDis);
	TRACE("%f\r\n",dDis);	// 68.177865
	DistanceOfTwoPositions(LatLon,LatLon3,dDis);
	TRACE("%f\r\n",dDis);	// 1990.891295
}

抱歉!评论已关闭.