Java實現(xiàn)度分秒坐標轉十進制度
前言
在地理信息系統(tǒng)(GIS)、導航、測繪等領域,精確地表示和轉換地理位置坐標是一項基本而重要的任務。地理坐標通常以經度和緯度的形式表示,它們可以采用度分秒(DMS)或十進制度(DD)兩種格式。度分秒是一種傳統(tǒng)的表示方式,它將角度分為度、分和秒,而十進制度則以小數形式直接表示角度,更便于計算機處理。隨著技術的發(fā)展,十進制度因其精確性和便捷性在現(xiàn)代應用中越來越受到青睞。
在實際應用中,經常需要將度分秒格式的坐標轉換為十進制度,以便于進行計算和數據處理。例如,在GIS軟件中,地圖的坐標系統(tǒng)可能需要統(tǒng)一為十進制度以提高計算效率;在航海和航空領域,雖然傳統(tǒng)上使用度分秒,但在與現(xiàn)代導航系統(tǒng)集成時,也需要轉換為十進制度。因此,掌握度分秒到十進制度的轉換方法對于相關領域的專業(yè)人士來說是一項必備技能。
本文將介紹如何使用Java編程語言實現(xiàn)度分秒坐標到十進制度的轉換。我們將從坐標轉換的基本概念入手,詳細闡述轉換的數學原理,并提供一個簡潔、高效的Java實現(xiàn)方案。通過實際代碼示例,展示如何在Java中處理度分秒格式的字符串,將其分解為度、分、秒,并計算出對應的十進制度數值。此外,我們還將討論可能遇到的一些常見問題,如精度處理和異常情況的處理,并提供解決方案。
通過閱讀本文,讀者將能夠理解度分秒和十進制度之間的轉換原理,并掌握使用Java進行坐標轉換的實用技能。這不僅有助于提高讀者在GIS、導航等領域的專業(yè)能力,也為處理地理坐標數據提供了一個強有力的工具。隨著地理信息技術的不斷發(fā)展,掌握這些基本技能將變得越來越重要。
一、度分秒的使用場景
在介紹度分秒的坐標向十進制度之前,我們首先來看看度分秒位置表示的使用場景。坐標位置點是用來確定地球表面上一個特定地點的地理坐標系統(tǒng)。這些坐標通常以經度和緯度來表示,它們可以以不同的格式表達,包括度分秒(DMS)和十進制度(DD)。
1、表示方法
度分秒是一種傳統(tǒng)的表示地理坐標的方式,它將角度分為度、分和秒。
- 度(Degree):地球圓周被分為360度,每度進一步分為60分。
- 分(Minute):每一度被分為60分,每分等于1/60度。
- 秒(Second):每一分被分為60秒,每秒等于1/60分。
在度分秒格式中,一個坐標點可以表示為:度°分′秒″。例如,一個坐標點可以寫作 50°16′36″N(北緯50度16分36秒)和 68°1′12″W(西經68度1分12秒)。眾所周知,與度分秒不同的還有經緯度的表達方式。十進制度是一種更現(xiàn)代的表示地理坐標的方式,它直接以小數形式表示角度。在十進制度格式中,一個坐標點可以表示為:度.分。例如,上述的50°46′36″可以表示為50.2676667°。
2、兩者的轉換方法
將度分秒轉換為十進制度,可以使用以下公式:
十進制度=度+分/60+秒/(60*60),將上面的50°16′36″的位置轉為經緯度位置計算過程為:50+16/60+36/3600=50+0.266666+0.01=50.26766。而轉換后的值就是我們可以直接在一些前端組件或者后端應用中直接使用的值。
3、區(qū)別及使用場景
兩者的區(qū)別:
精確度:十進制度可以提供更高的精確度,因為它可以表示到小數點后很多位。易讀性:度分秒格式對于非專業(yè)人士來說可能更直觀,因為它模擬了傳統(tǒng)的測量方式。 計算:在進行地理計算時,十進制度通常更方便,因為它避免了度、分、秒之間的轉換。
應用場景
航海和航空:由于歷史原因,航海和航空領域仍然廣泛使用度分秒格式。地圖和GIS:現(xiàn)代地圖制作和地理信息系統(tǒng)(GIS)通常使用十進制度,因為它與計算機系統(tǒng)兼容性更好??茖W和工程:在需要高精度的科學和工程領域,十進制度是首選。在航海的應用方面,我們經常在海事局的官方網站上看到的都是度分秒的坐標形式。
新設32 HAO DUN虛擬AIS航標,位置: 24-30.88N 118-14.20E;MMSI: 994136577;航標類型:東方位標;發(fā)射模式:自主連續(xù);播發(fā)間隔:3分鐘。
新設33 HAO DUN虛擬AIS航標,位置:24-30.89N 118-14.25E;MMSI: 994126460;航標類型:西方位標;發(fā)射模式:自主連續(xù);播發(fā)間隔:3分鐘。
請過往船舶注意
二、Java代碼轉換的實現(xiàn)
Java作為一種廣泛使用的編程語言,以其跨平臺性、高性能和豐富的庫支持,在處理地理坐標轉換方面具有天然優(yōu)勢。通過Java實現(xiàn)度分秒到十進制度的轉換,不僅可以提高開發(fā)效率,還可以保證轉換過程的準確性和可靠性。此外,Java的面向對象特性使得轉換程序易于維護和擴展,便于集成到更復雜的系統(tǒng)中。因此本小節(jié)將重點介紹如何使用Java來實現(xiàn)度分秒和十進制度的轉換。
1、確定計算值的符號
眾所周知,在地理系統(tǒng)中,緯度有南緯和北緯;經度有東經和西經的區(qū)別。這是一個360度組成的球形。因此我們在進行坐標計算的時候,要考慮這種天然的位置符號關系。比如在表示西經100度時,用十進制數表達時就需要添加一個負號。而東經是不需要的。然而,可能用來表示東經和北緯的除了用英文的模式,還可能使用英文的模式,即N、W、E、S等。由于標注習慣的不同,有的用戶或者系統(tǒng)喜歡把標注符號放在前面,也有喜歡標注在后面。這些都是可以的。但是要想實現(xiàn)統(tǒng)一的坐標轉換,我們要可以識別上述的標志,能在最終的結果中進行符號的添加。
為了實現(xiàn)上面的需求,我們先來定義兩個字符串數字。一個是正數的經緯度標識字符串,另外一個是負數的經緯度標識字符串。代碼如下所示:
private static final String [] LAT_LON = {"E","N","東經","北緯"};//正常經緯度單位 private static final String [] NEGATIVE_LAT_LON = {"W","S","西經","南緯"}; // 需要轉為負數的經緯度單位
在進行字符轉換時,尤其是負號的數值轉換時,我們首先需要判斷在傳入的坐標位置中包含了標識符,代碼如下:
/** * - 檢查經緯度字符串中是否包含負數的坐標 * @param jwd * @return */ public static boolean checkFlag(String jwd) { if(StringUtils.isEmpty(jwd)) { return false; } boolean result = false; for(String sign : NEGATIVE_LAT_LON) { int index = jwd.trim().indexOf(sign); if(index >= 0) { result = true; break; } } return result; }
2、數值的清洗
在經過經緯度的數值符號計算之后,就可以將這些標記字符串去掉,只保留下來需要分割計算的具體度分秒值。數據清洗的方法簡單,循環(huán)我們的正常經緯度標記數組和負數經緯度數組,最后再替換標準的冒號和非標準的冒號。得到最終清洗之后的字符串就是我們清洗之后的值。
/** * - 經緯度數據清洗 * @param jwd * @return */ public static String jwdClearn(String jwd) { if(StringUtils.isEmpty(jwd)) { return jwd; } String result = jwd; //循環(huán)進行正數據處理 for(String sign : LAT_LON) { result = result.replace(sign, ""); } //循環(huán)進行負數據處理 for(String sign : NEGATIVE_LAT_LON) { result = result.replace(sign, ""); } result = result.replace(":", "").replace(":", ""); return result; }
3、度分秒轉換
掌握了數值符號的判定和數據清洗之后,下面就可以對清洗之后的數值進行坐標轉換。轉換的計算方法就是第一節(jié)中提到的計算方法。本身沒有很難的實現(xiàn)邏輯,因此在這里不進行詳細的介紹。直接貼出實現(xiàn)的代碼,最后返回的值之前,需要根據符號的判斷,返回對應的值。
/** * -經緯度轉化,度分秒轉度. * -如:108°13′21″= 108.2225 * @param jwd * @return */ public static String DmsTurnDD(String jwd) { boolean negativeSign = false; if (Strings.isNotEmpty(jwd) && (jwd.contains("°"))) {//如果不為空并且存在度單位 //負數標記 negativeSign = checkFlag(jwd); //計算前進行數據處理 //jwd = jwd.replace("E", "").replace("N", "").replace(":", "").replace(":", ""); jwd = jwdClearn(jwd); double d = 0, m = 0, s = 0; d = Double.parseDouble(jwd.split("°")[0]); //不同單位的分,可擴展 if (jwd.contains("′")) {//正常的′ m = Double.parseDouble(jwd.split("°")[1].split("′")[0]); } else if (jwd.contains("'")) {//特殊的' m = Double.parseDouble(jwd.split("°")[1].split("'")[0]); } //不同單位的秒,可擴展 if (jwd.contains("″")) {//正常的″ //有時候沒有分 如:112°10.25″ s = jwd.contains("′") ? Double.parseDouble(jwd.split("′")[1].split("″")[0]) : Double.parseDouble(jwd.split("°")[1].split("″")[0]); } else if (jwd.contains("''")) {//特殊的'' //有時候沒有分 如:112°10.25'' s = jwd.contains("'") ? Double.parseDouble(jwd.split("'")[1].split("''")[0]) : Double.parseDouble(jwd.split("°")[1].split("''")[0]); } jwd = String.valueOf(d + m / 60 + s / 60 / 60);//計算并轉換為string } return negativeSign ? "-" + jwd : jwd; }
4、轉換實例
為了驗證上述的度分秒坐標是否正確的進行了轉換,下面我們來編寫測試代碼。測試不同的度分秒坐標轉為十進制坐標的方法。我們分別將經緯度的標記寫成中文和英文的都有,同時在具體的度分秒值的前面和后面都有。以此來測試程序的穩(wěn)定性和可靠性。
public static void main(String[] args) { List<String> latlonList = new ArrayList<String>(); latlonList.add("北緯15°08.1′"); latlonList.add("東經117°50.9′"); latlonList.add("北緯15°07.4′"); latlonList.add("東經117°50.8′"); latlonList.add("33°25'4.68\"S"); latlonList.add("15°08.1′南緯"); latlonList.add("117°50.9′西經"); latlonList.add("東經117°50.8′"); latlonList.add("南緯15°08.1′"); latlonList.add("W15°08.1′"); latlonList.add("E15°08.1′"); latlonList.add("65°08.1′N"); latlonList.add("68°08.1′"); latlonList.add("115°51.9′"); latlonList.add("25°15′26\"N"); latlonList.add("120°29′20\"E"); latlonList.add("24°50′30\"N"); latlonList.add("E120°05′45\""); latlonList.add("25°04′32\"N"); latlonList.add("119°51′22\"E"); latlonList.add("S25°28′12\""); latlonList.add("W120°14′30\""); latlonList.add("50°16′36″"); for(String latlon : latlonList) { System.out.println(latlon + "\t===>\t" +CoordinateUtil.DmsTurnDD(latlon)); } }
接下來在程序控制臺中看一下轉換的輸出結果。
可以看到所有的度分秒坐標均已經正常的進行轉換,同時你可以使用計算機進行驗證計算結果是否正確。
三、總結
本文將介紹如何使用Java編程語言實現(xiàn)度分秒坐標到十進制度的轉換。我們將從坐標轉換的基本概念入手,詳細闡述轉換的數學原理,并提供一個簡潔、高效的Java實現(xiàn)方案。通過實際代碼示例,展示如何在Java中處理度分秒格式的字符串,將其分解為度、分、秒,并計算出對應的十進制度數值。
到此這篇關于Java實現(xiàn)度分秒坐標轉十進制度的文章就介紹到這了,更多相關Java度分秒坐標轉十進制內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring?Boot提高開發(fā)效率必備工具lombok使用
這篇文章主要為大家介紹了Spring?Boot提高開發(fā)效率的必備工具lombok使用方法示例及步驟說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-03-03解讀Java中打印輸出對象內容為什么可以不寫.toString()
這篇文章主要介紹了解讀Java中打印輸出對象內容為什么可以不寫.toString()問題,具有很的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09