經(jīng)緯度互換
度(DDD):E 108.90593度 N 34.21630度
如何將度(DDD):: 108.90593度換算成度分秒(DMS)東經(jīng)E 108度54分22.2秒?轉(zhuǎn)換方法是將108.90593整數(shù)位不變?nèi)?08(度),用0.90593*60=54.3558,取整數(shù)位54(分),0.3558*60=21.348再取整數(shù)位21(秒),故轉(zhuǎn)化為108度54分21秒.
同樣將度分秒(DMS):東經(jīng)E 108度54分22.2秒 換算成度(DDD)的方法如下:108度54分22.2秒=108+(54/60)+(22.2/3600)=108.90616度
因為計算時小數(shù)位保留的原因弥喉,導(dǎo)致正反計算存在一定誤差寇漫,但誤差影響不是很大。1秒的誤差就是幾米的樣子焚辅。GPS車友可以用上述方法換算成自己需要的單位坐標(biāo)凄贩。
經(jīng)緯度換算成米
緯度分為60分誓军,每一分再分為60秒以及秒的小數(shù)。
緯度線投射在圖上看似水平的平行線疲扎,但實際上是不同半徑的圓昵时。有相同特定緯度的所有位置都在同一個緯線上。
赤道的緯度為0°椒丧,將行星平分為南半球和北半球壹甥。
緯度是指某點與地球球心的連線和地球赤道面所成的線面角,其數(shù)值在0至90度之間瓜挽。位于赤道以北的點的緯度叫北緯盹廷,記為N,位于赤道以南的點的緯度稱南緯久橙,記為S俄占。
緯度數(shù)值在0至30度之間的地區(qū)稱為低緯地區(qū),緯度數(shù)值在30至60度之間的地區(qū)稱為中緯地區(qū)淆衷,緯度數(shù)值在60至90度之間的地區(qū)稱為高緯地區(qū)缸榄。
赤道、南回歸線祝拯、北回歸線甚带、南極圈和北極圈是特殊的緯線她肯。
緯度1秒的長度
地球的子午線總長度大約40008km。平均:
緯度1度 = 大約111km
緯度1分 = 大約1.85km
緯度1秒 = 大約30.9m
根據(jù)地球上任意兩點的經(jīng)緯度計算兩點間的距離
地球是一個近乎標(biāo)準(zhǔn)的橢球體鹰贵,它的赤道半徑為6378.140千米晴氨,極半徑為 6356.755千米,平均半徑6371.004千米碉输。如果我們假設(shè)地球是一個完美的球體籽前,那么它的半徑就是地球的平均半徑,記為R敷钾。如果以0度經(jīng)線為基 準(zhǔn)枝哄,那么根據(jù)地球表面任意兩點的經(jīng)緯度就可以計算出這兩點間的地表距離(這里忽略地球表面地形對計算帶來的誤差,僅僅是理論上的估算值)阻荒。設(shè)第一點A的經(jīng) 緯度為(LonA, LatA)挠锥,第二點B的經(jīng)緯度為(LonB, LatB),按照0度經(jīng)線的基準(zhǔn)侨赡,東經(jīng)取經(jīng)度的正值(Longitude)蓖租,西經(jīng)取經(jīng)度負(fù)值(-Longitude),北緯取90-緯度值(90- Latitude)辆毡,南緯取90+緯度值(90+Latitude)菜秦,則經(jīng)過上述處理過后的兩點被計為(MLonA, MLatA)和(MLonB, MLatB)甜害。那么根據(jù)三角推導(dǎo)舶掖,可以得到計算兩點距離的如下公式:
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
如果僅對經(jīng)度作正負(fù)的處理该肴,而不對緯度作90-Latitude(假設(shè)都是北半球情竹,南半球只有澳洲具有應(yīng)用意義)的處理,那么公式將是:
C = sin(LatA)*sin(LatB) + cos(LatA)*cos(LatB)*cos(MLonA-MLonB)
Distance = R*Arccos(C)*Pi/180
以上通過簡單的三角變換就可以推出匀哄。
如果三角函數(shù)的輸入和輸出都采用弧度值秦效,那么公式還可以寫作:
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
根據(jù)一個經(jīng)緯度,計算出當(dāng)前經(jīng)緯度的半徑涎嚼,可用于打卡阱州,場合。工具類
/**
* 經(jīng)緯度法梯,圍欄相關(guān)工具類
* 根據(jù)一個經(jīng)緯度苔货,計算出當(dāng)前經(jīng)緯度的半徑,可用于打卡,場合夜惭。
* @author zhangtonghao
* @create 2022-03-17 14:37
*/
public class FenceUtils {
? ? //圓周率
? ? private static final double PI = 3.1415926;
? ? /**
? ? * 計算地球上任意兩點(經(jīng)緯度)距離
? ? *
? ? * @param long1 第一點經(jīng)度
? ? * @param lat1? 第一點緯度
? ? * @param long2 第二點經(jīng)度
? ? * @param lat2? 第二點緯度
? ? * @return 返回距離 單位:米
? ? */
? ? public static int distanceByLongNLat(double long1, double lat1, double long2, double lat2) {
? ? ? ? double a, b, R;
? ? ? ? //地球半徑
? ? ? ? R = 6378137;
? ? ? ? lat1 = lat1 * Math.PI / 180.0;
? ? ? ? lat2 = lat2 * Math.PI / 180.0;
? ? ? ? a = lat1 - lat2;
? ? ? ? b = (long1 - long2) * Math.PI / 180.0;
? ? ? ? double d;
? ? ? ? double sa2, sb2;
? ? ? ? sa2 = Math.sin(a / 2.0);
? ? ? ? sb2 = Math.sin(b / 2.0);
? ? ? ? d = 2 * R * Math.asin(Math.sqrt(sa2 * sa2 + Math.cos(lat1) * Math.cos(lat2) * sb2 * sb2));
? ? ? ? return (int)d;
? ? }
? ? /**
? ? * 根據(jù)經(jīng)緯度和半徑計算經(jīng)緯度范圍
? ? *
? ? * @param raidus 單位米
? ? * @return minLat, minLng, maxLat, maxLng
? ? */
? ? public static double[] getAround(double lat, double lon, int raidus) {
? ? ? ? Double latitude = lat;
? ? ? ? Double longitude = lon;
? ? ? ? Double degree = (24901 * 1609) / 360.0;
? ? ? ? double raidusMile = raidus;
? ? ? ? Double dpmLat = 1 / degree;
? ? ? ? Double radiusLat = dpmLat * raidusMile;
? ? ? ? Double minLat = latitude - radiusLat;
? ? ? ? Double maxLat = latitude + radiusLat;
? ? ? ? Double mpdLng = degree * Math.cos(latitude * (PI / 180));
? ? ? ? Double dpmLng = 1 / mpdLng;
? ? ? ? Double radiusLng = dpmLng * raidusMile;
? ? ? ? Double minLng = longitude - radiusLng;
? ? ? ? Double maxLng = longitude + radiusLng;
? ? ? ? return new double[]{minLat, minLng, maxLat, maxLng};
? ? }
}
測試使用:
創(chuàng)作不易姻灶,如果這篇文章對你有用,請點個贊謝謝?(?ω?)?诈茧!