å¨èµ¤éä¸ï¼1ç»åº¦å·®å¯¹åºçè·ç¦»æ¯111åç±³ï¼å¨å
¶ä»çº¬çº¿ä¸ï¼å¦æ纬度为Aï¼å1ç»åº¦å·®å¯¹åºçè·ç¦»æ¯111*COSAåç±³ã
å¨ç»çº¿ä¸ï¼1纬度差对åºçè·ç¦»æ¯111åç±³ã
æ ¹æ®å°çä¸ä»»æ两ç¹ç
ç»çº¬åº¦è®¡ç®ä¸¤ç¹é´çè·ç¦»
å°çæ¯ä¸ä¸ªè¿ä¹æ åçæ¤çä½ï¼å®ç赤éåå¾ä¸º6378.140åç±³ï¼æåå¾ä¸º
6356.755åç±³ï¼å¹³ååå¾6371.004åç±³ãå¦ææ们å设å°çæ¯ä¸ä¸ªå®ç¾ççä½ï¼é£ä¹å®çåå¾å°±æ¯å°ççå¹³ååå¾ï¼è®°ä¸ºRãå¦æ以
0度ç»çº¿ä¸ºåº
åï¼é£ä¹æ ¹æ®å°ç表é¢ä»»æ两ç¹çç»çº¬åº¦å°±å¯ä»¥è®¡ç®åºè¿ä¸¤ç¹é´çå°è¡¨è·ç¦»ï¼è¿é忽ç¥å°ç表é¢å°å½¢å¯¹è®¡ç®å¸¦æ¥ç误差ï¼ä»
ä»
æ¯ç论ä¸çä¼°ç®å¼ï¼ã设第ä¸ç¹Açç»
纬度为(LonA, LatA)ï¼ç¬¬äºç¹Bçç»çº¬åº¦ä¸º(LonB,
LatB)ï¼æç
§0度ç»çº¿çåºåï¼ä¸ç»åç»åº¦çæ£å¼(Longitude)ï¼è¥¿ç»åç»åº¦è´å¼(-Longitude)ï¼å纬å90-纬度å¼(90-
Latitude)ï¼å纬å90+纬度å¼(90+Latitude)ï¼åç»è¿ä¸è¿°å¤çè¿åç两ç¹è¢«è®¡ä¸º(MLonA, MLatA)å(MLonB,
MLatB)ãé£ä¹æ ¹æ®ä¸è§æ¨å¯¼ï¼å¯ä»¥å¾å°è®¡ç®ä¸¤ç¹è·ç¦»çå¦ä¸å
¬å¼ï¼
C = sin(MLatA)*sin(MLatB)*cos(MLonA-MLonB) + cos(MLatA)*cos(MLatB)
Distance = R*Arccos(C)*Pi/180
è¿éï¼RåDistanceåä½æ¯ç¸åï¼å¦ææ¯éç¨6371.004åç±³ä½ä¸ºåå¾ï¼é£ä¹Distanceå°±æ¯å米为åä½ï¼å¦æè¦ä½¿ç¨å
¶ä»åä½ï¼æ¯å¦mileï¼è¿éè¦ååä½æ¢ç®ï¼1åç±³=0.621371192mile
å¦æä»
对ç»åº¦ä½æ£è´çå¤çï¼èä¸å¯¹çº¬åº¦ä½90-Latitude(å设é½æ¯ååçï¼ååçåªæ
澳洲å
·æåºç¨æä¹)çå¤çï¼é£ä¹å
¬å¼å°æ¯ï¼
C = sin(LatA)*sin(LatB) + cos(LatA)*cos(LatB)*cos(MLonA-MLonB)
Distance = R*Arccos(C)*Pi/180
以ä¸éè¿ç®åçä¸è§åæ¢å°±å¯ä»¥æ¨åºã
å¦æ
ä¸è§å½æ°çè¾å
¥åè¾åºé½éç¨å¼§åº¦å¼ï¼é£ä¹å
¬å¼è¿å¯ä»¥åä½ï¼
C = sin(LatA*Pi/180)*sin(LatB*Pi/180) + cos(LatA*Pi/180)*cos(LatB*Pi/180)*cos((MLonA-MLonB)*Pi/180)
Distance = R*Arccos(C)*Pi/180
ä¹å°±æ¯ï¼
C = sin(LatA/57.2958)*sin(LatB/57.2958) + cos(LatA/57.2958)*cos(LatB/57.2958)*cos((MLonA-MLonB)/57.2958)
Distance = R*Arccos(C) = 6371.004*Arccos(C) kilometer = 0.621371192*6371.004*Arccos(C) mile = 3958.758349716768*Arccos(C) mile
å¨å®é
åºç¨å½ä¸ï¼ä¸è¬æ¯éè¿ä¸ä¸ªä¸ªä½ç
é®æ¿ç¼ç æ¥æ¥æ¾è¯¥é®æ¿ç¼ç 对åºçå°åºä¸å¿çç»çº¬åº¦ï¼ç¶
ååæ ¹æ®è¿äºç»çº¬åº¦æ¥è®¡ç®å½¼æ¤çè·ç¦»ï¼ä»èä¼°ç®åºæäºç¾¤ä½ä¹é´ç大è´è·ç¦»èå´(æ¯å¦é
åºæ
客çåå¸èå´-å个æ
客çé®æ¿ç¼ç 对åºçç»çº¬åº¦åé
åºçç»çº¬åº¦æ
计ç®çè·ç¦»èå´-çç)ï¼æ以ï¼éè¿é®æ¿ç¼ç æ¥è¯¢ç»çº¬åº¦è¿æ ·ä¸ä¸ªæ°æ®åºæ¯ä¸ä¸ªå¾æç¨çèµæºã
éï¼C#代ç ï¼
private const double EARTH_RADIUS = 6378.137;//
å°çåå¾private static double rad(double d)
{
return d * Math.PI / 180.0;
}
public static double GetDistance(double lat1, double lng1, double lat2, double lng2)
{
double radLat1 = rad(lat1);
double radLat2 = rad(lat2);
double a = radLat1 - radLat2;
double b = rad(lng1) - rad(lng2);
double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a/2),2) +
Math.Cos(radLat1)*Math.Cos(radLat2)*Math.Pow(Math.Sin(b/2),2)));
s = s * EARTH_RADIUS;
s = Math.Round(s * 10000) / 10000;
return s;
}