版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
本文格式為Word版,下載可任意編輯——輕松實(shí)現(xiàn)坐標(biāo)轉(zhuǎn)換輕松實(shí)現(xiàn)坐標(biāo)轉(zhuǎn)換
不同地理位置系統(tǒng)轉(zhuǎn)換入門
級(jí)別:初級(jí)
SamiSalkosuo
(mailto:sami.salkosuo@?subject=輕松實(shí)現(xiàn)坐標(biāo)轉(zhuǎn)換),應(yīng)用程序架構(gòu)師,IBM2023年9月07日
文檔選項(xiàng)
打印本頁(yè)
打印本頁(yè)
將此頁(yè)作為電子郵件發(fā)送
好多流行的應(yīng)用程序可以提供基于位置的服務(wù),但是計(jì)算機(jī)如何識(shí)別真實(shí)世界中的位置呢?好多方法都涉及到地理坐標(biāo)系統(tǒng),并且在實(shí)際應(yīng)用中存在不同的此類系統(tǒng)。在本文中,應(yīng)用程序架構(gòu)師SamiSalkosuo演示了使用Java?代碼在兩種流行的系統(tǒng)之間轉(zhuǎn)換位置數(shù)據(jù):人們較為熟悉的經(jīng)緯度系統(tǒng)和統(tǒng)一橫軸墨卡托投影(UniversalTransverseMercator)系統(tǒng)。
將此頁(yè)作為電子郵件發(fā)送樣例代碼
位置服務(wù)——包括基于GPS的導(dǎo)航系統(tǒng)和地圖站點(diǎn)(如GoogleMaps和
Yahoo!Maps)——現(xiàn)在深受客戶歡迎。好多企業(yè)已經(jīng)利用了某些位置感知服務(wù),而更多的用戶將參與到這個(gè)行列中來(lái),由于他們已認(rèn)識(shí)到該服務(wù)帶來(lái)的優(yōu)勢(shì)和潛能。在2023年,Garter就曾表示,“位置感知服務(wù)在未來(lái)兩到五年內(nèi)將成為主流〞,并且已經(jīng)有“越來(lái)越多的組織部署了位置感知移動(dòng)業(yè)務(wù)應(yīng)用程序。〞(請(qǐng)參閱參考資料,獲得該報(bào)告的鏈接)。
當(dāng)企業(yè)決定實(shí)現(xiàn)某種位置感知應(yīng)用程序時(shí),編寫此類應(yīng)用程序的任務(wù)最終都落在開發(fā)人員的身上。構(gòu)建位置感知服務(wù)涉及多種任務(wù),或大或小,其中一項(xiàng)任務(wù)(相對(duì)較?。┛赡芤獙⒁环N系統(tǒng)坐標(biāo)轉(zhuǎn)換為另一種系統(tǒng)坐標(biāo)。本文將演示執(zhí)行此類轉(zhuǎn)換的代碼,從而幫助您節(jié)省大量的工作。兩種不同的坐標(biāo)系統(tǒng)
在詳細(xì)研究本文代碼之前,首先需要探討即將處理的代碼所屬的坐標(biāo)系統(tǒng):較為熟悉的經(jīng)緯度系統(tǒng)和統(tǒng)一橫軸墨卡托投影系統(tǒng)(UniversalTransverseMercator,UTM)。我們還要提到以UTM為基礎(chǔ)的軍事格網(wǎng)參考系(MGRS)。經(jīng)緯度系統(tǒng)
經(jīng)緯度系統(tǒng)可能是最為人熟知的地理坐標(biāo)設(shè)計(jì)方法。它使用兩個(gè)數(shù)值表示位置。緯度表示從地球中心到地球表面東西方向線之間的角度。經(jīng)度指從地球中心到地球表面南北方向線之間的角度。經(jīng)緯度可以表示為十進(jìn)制角度(DD),或表示為度、分、和秒(DMS);后者的格式可表示為諸如49°30'00\30'00\。這是GPS設(shè)備使用的典型格式。
地球以赤道(0°緯線)為界,分為南半球和北半球,又以0°經(jīng)線(從南極到北極的假想線,通過(guò)英國(guó)的格林威治市)為界分為東西半球。北半球的緯度從0度到90度,而南半球的緯度從0度到-90度。東半球的經(jīng)度范圍從0度到180度,西半球的經(jīng)度范圍為0度到-180度。
舉例說(shuō)明,坐標(biāo)61.44,25.40(使用DD單位)或61°26'24''N,25°23'60''E
(使用DMS單位)位于芬蘭南部。坐標(biāo)-47.04,-73.48(使用DD單位)或47°02'24''S,73°28'48''W(使用DMS單位)位于智利南部。圖1展示了表面覆蓋經(jīng)緯線的地球:
圖1.地球表面覆蓋了經(jīng)緯線
請(qǐng)參閱參考資料,獲得更詳細(xì)的內(nèi)容。統(tǒng)一橫軸墨卡托投影
UTM坐標(biāo)系統(tǒng)使用基于網(wǎng)格的方法表示坐標(biāo)。UTM系統(tǒng)將地球分為60個(gè)區(qū),每個(gè)區(qū)基于橫軸墨卡托投影。繪圖法中的地圖投影方法可以在平面中表示一個(gè)兩維的曲面,例如一個(gè)標(biāo)準(zhǔn)地圖。圖2展示了一個(gè)橫軸墨卡托投影:
圖2.橫軸墨卡托投影
UTM經(jīng)度區(qū)范圍為1到60;其中58個(gè)區(qū)的東西跨度為6°(稍后詳細(xì)探討另外兩個(gè)區(qū))。經(jīng)度區(qū)涵蓋了地球中緯度范圍從80°S到84°N之間的所有區(qū)域。一共有20個(gè)UTM緯度區(qū),每個(gè)區(qū)的南北跨度為8°;使用字母C到X標(biāo)識(shí)(其中沒有字母I和O)。A、B、Y、Z區(qū)不在系統(tǒng)范圍以內(nèi);它們覆蓋了南極和北極區(qū)。圖3展示了歐洲的UTM區(qū)。從圖3中可看到兩個(gè)非標(biāo)準(zhǔn)的經(jīng)度區(qū):32V區(qū)
被擴(kuò)展為覆蓋整個(gè)挪威的南部,而31V區(qū)被縮小,所以只覆蓋了一片汪洋大海。
圖3.歐洲地區(qū)的UTM區(qū)
UTM坐標(biāo)的表示格式為:經(jīng)度區(qū)緯度區(qū)以東以北,其中以東表示從經(jīng)度區(qū)的中心子午線的投影距離,而以北表示距離赤道的投影距離。這個(gè)兩個(gè)值的單位均為米。舉例來(lái)說(shuō),使用UTM表示經(jīng)/緯度坐標(biāo)61.44,25.40的結(jié)果就是35V4146686812844;而經(jīng)/緯度坐標(biāo)-47.04,-73.48的表示結(jié)果為18G6154714789269。
請(qǐng)參閱參考資料,獲取更多有關(guān)UTM和TraverseMercator投影的信息。軍事格網(wǎng)參考系
MGRS是北約(NATO)軍事組織使用的標(biāo)準(zhǔn)坐標(biāo)系統(tǒng)。MGRS以UTM為基礎(chǔ)并進(jìn)一步將每個(gè)區(qū)劃分為100km×100km的小方塊。這些方塊使用兩個(gè)相連的字母標(biāo)識(shí):第一個(gè)字母表示經(jīng)度區(qū)的東西位置,而其次個(gè)字母表示南北位置。例如,UTM點(diǎn)35V4146686812844等價(jià)于MGRS點(diǎn)35VMJ1466812844。
該MGRS點(diǎn)精度為米,使用15個(gè)字符表示,其中最終10個(gè)字符表示指定網(wǎng)格中的以東和以北的值??梢允褂?5個(gè)字符表示MGRS值(如前例),也可表示為13、11、9或7個(gè)字符;因此,所表示的值的精度分別為1米、10米、100米、1,000米或10,000米。
本文并未對(duì)MGRS進(jìn)行詳細(xì)說(shuō)明,但是本文的下載代碼包含了經(jīng)緯度坐標(biāo)和MGRS坐標(biāo)之間的轉(zhuǎn)換。請(qǐng)參閱參考資料,獲得更多信息。
回頁(yè)首
坐標(biāo)轉(zhuǎn)換
確定地球上某個(gè)位置的經(jīng)度和緯度坐標(biāo)的最低需求是,你至少能夠看到星星和太陽(yáng),并具備一個(gè)六分儀和能夠顯示GMT時(shí)間的時(shí)鐘T。根據(jù)空中某個(gè)物體與地平線之間的角度可以確定緯度,然后根據(jù)地球旋轉(zhuǎn)計(jì)算出經(jīng)度。本文并未詳細(xì)探討這些細(xì)節(jié)(想要了解更多請(qǐng)參閱參考資料),相反,我們假設(shè)您已經(jīng)具有DD、DMS或UTM格式的坐標(biāo)。
在十進(jìn)制角度和度/分/秒格式之間進(jìn)行轉(zhuǎn)換
DD和DMS坐標(biāo)格式之間的轉(zhuǎn)換十分簡(jiǎn)單。下面給出了DD到DMS的轉(zhuǎn)換公式:
DD:dd.ff
DMS:ddmmss
dd=dd
mm.gg=60*ffss=60*gg
這里的gg代表計(jì)算的小數(shù)部分。負(fù)緯度表示位于南半球(S)的位置而負(fù)經(jīng)度表示西半球(W)的位置。例如,假設(shè)您具有一個(gè)DD格式的坐標(biāo)61.44,25.40。依照下面的公式將其轉(zhuǎn)換:
latdd=61
latmm.gg=60*0.44=26.4latss=60*0.4=24
以及:
londd=25
lonmm.gg=60*0.40=24.0lonss=60*0.0=0
因此,轉(zhuǎn)換為DMS格式的坐標(biāo)變成了61°26'24''N25°24'00''E。
將DMS轉(zhuǎn)換為DD格式的公式如下所示:
DD:dd.ff
DMS:ddmmss
dd.ff=dd+mm/60+ss/3600
注意,南半球(S)的位置為負(fù)緯度,西半球(W)位置為負(fù)經(jīng)度。
現(xiàn)在將DMS格式坐標(biāo)47°02'24''S和73°28'48''W轉(zhuǎn)換為DD格式的坐標(biāo):
latdd.ff=-(47+2/60+24/3600)=-47.04londd.ff=-(73+28/60+48/3600)=-73.48
轉(zhuǎn)換后的DD格式的坐標(biāo)為-47.04和-73.48。在經(jīng)緯度和UTM坐標(biāo)之間進(jìn)行轉(zhuǎn)換
十進(jìn)制坐標(biāo)可通過(guò)一個(gè)六分儀和一個(gè)記時(shí)計(jì)確定,與此不同的是,必需通過(guò)計(jì)算才能確定UTM坐標(biāo)。雖然這些計(jì)算無(wú)非是最基本的三角形和代數(shù)計(jì)算,但是所使用的公式十分繁雜。假使您閱讀了“TheUniversalGrids:UniversalTransverse
Mercator(UTM)andUniversalPolarStereographic(UPS)〞(參閱參考資料獲得鏈接),就知道它有多繁雜了。
本文沒有給出UTM轉(zhuǎn)換公式,但是可從下面一節(jié)中給出的源代碼中窺探一二,更多信息請(qǐng)參閱參考資料提供的鏈接。
回頁(yè)首
使用Java代碼轉(zhuǎn)換坐標(biāo)
本節(jié)介紹了執(zhí)行坐標(biāo)轉(zhuǎn)換(十進(jìn)制角度和UTM)的庫(kù)類的源代碼。該Java類名為com.ibm.util.CoordinateConversion;其思想是構(gòu)建一個(gè)提供轉(zhuǎn)換方法的類。該類包含實(shí)際執(zhí)行轉(zhuǎn)換的內(nèi)部類;假使需要的話,可以從CoordinateConversion類中重構(gòu)內(nèi)部類,從而創(chuàng)立一個(gè)庫(kù)包或向現(xiàn)有包添加類。該類執(zhí)行的轉(zhuǎn)換精度低于1米。
CoordinateConversion的源代碼包含大約750行代碼,因此本文沒有全部顯示。
以下小節(jié)描述了有關(guān)方法,本文的下載小節(jié)中附帶了完整的源代碼。CoordinateConversion
CoordinateConversion是主類,它被實(shí)例化為在需要是執(zhí)行坐標(biāo)轉(zhuǎn)換。清單1展示了相關(guān)的公共方法,以及CoordinateConversion類中包含的私有內(nèi)部類:
清單1.CoordinateConversion
publicclassCoordinateConversion{
publicCoordinateConversion(){}
publicdouble[]utm2LatLon(StringUTM){
UTM2LatLonc=newUTM2LatLon();returnc.convertUTMToLatLong(UTM);}
publicStringlatLon2UTM(doublelatitude,doublelongitude){
LatLon2UTMc=newLatLon2UTM();
returnc.convertLatLonToUTM(latitude,longitude);}
//..implementationomitted
privateclassLatLon2UTM{
publicStringconvertLatLonToUTM(doublelatitude,doublelongitude){
//..implementationomitted}
//..implementationomitted}
privateclassLatLon2MGRUTMextendsLatLon2UTM{
publicStringconvertLatLonToMGRUTM(doublelatitude,doublelongitude){
//..implementationomitted}
//..implementationomitted}
privateclassMGRUTM2LatLonextendsUTM2LatLon{
publicdouble[]convertMGRUTMToLatLong(Stringmgrutm){
//..implementationomitted}
//..implementationomitted}
privateclassUTM2LatLon{
publicdouble[]convertUTMToLatLong(StringUTM){
//..implementationomitted}
//..implementationomitted}
privateclassDigraphs{
//usedtogetdigraphswhendoingconversionbetween//lat/longandMGRS
//..implementationomitted}
privateclassLatZones{
//includemethodstodeterminelatitudezones//..implementationomitted}
下一節(jié)將進(jìn)一步探討經(jīng)緯度與UTM之間的轉(zhuǎn)換。將經(jīng)緯度轉(zhuǎn)換為UTM
將經(jīng)緯度坐標(biāo)轉(zhuǎn)換為UTM坐標(biāo)需要使用StringlatLon2UTM(doublelatitude,doublelongitude)方法。該方法的實(shí)現(xiàn)創(chuàng)立了一個(gè)新的內(nèi)部類LatLon2UTMc=newLatLon2UTM();實(shí)例,并將UTM坐標(biāo)返回為由15個(gè)字符組成的字符串(即精度為1米)。LatLon2UTM方法的實(shí)現(xiàn)如清單2所示:
清單2.publicStringconvertLatLonToUTM(doublelatitude,doublelongitude)
publicStringconvertLatLonToUTM(doublelatitude,doublelongitude)
{
validate(latitude,longitude);StringUTM=\
setVariables(latitude,longitude);
StringlongZone=getLongZone(longitude);LatZoneslatZones=newLatZones();
StringlatZone=latZones.getLatZone(latitude);
double_easting=getEasting();
double_northing=getNorthing(latitude);
UTM=longZone+\_northing);
returnUTM;}
該方法執(zhí)行轉(zhuǎn)換的方法為:調(diào)用各種方法獲得經(jīng)緯度區(qū),然后計(jì)算以東和以北值,等等。使用validate()方法對(duì)輸入進(jìn)行驗(yàn)證;假使(latitude90.0||longitude=180.0)子句為真,將拋出一個(gè)IllegalArgumentException。
清單3中的setVariables()方法設(shè)置計(jì)算轉(zhuǎn)換所需的各種變量(請(qǐng)查看“TheUniversalGrids〞獲取更多信息;可從參考資料獲取鏈接):
清單3.protectedvoidsetVariables(doublelatitude,doublelongitude)
protectedvoidsetVariables(doublelatitude,doublelongitude){
latitude=degreeToRadian(latitude);
rho=equatorialRadius*(1-e*e)/POW(1-POW(e*SIN(latitude),2),3/2.0);
nu=equatorialRadius/POW(1-POW(e*SIN(latitude),2),(1/2.0));
doublevar1;
if(longitude(0.00000.0000)\(0.1300-0.2324)\(-45.645623.3545)\(-12.7650-33.8765)\(-80.5434-170.6540)\(90.0000177.0000)\(-90.0000-177.0000)\(90.00003.0000)\(23.4578-135.4545)\(77.3450156.9876)\(-89.3454-48.9306)\
將UTM坐標(biāo)轉(zhuǎn)換為經(jīng)緯度坐標(biāo)
UTM坐標(biāo)到經(jīng)緯度坐標(biāo)的轉(zhuǎn)換要比相反的轉(zhuǎn)換過(guò)程簡(jiǎn)單一些。同樣,“TheUniversalGrids〞(請(qǐng)參閱參考資料)提供了轉(zhuǎn)換公式。清單8展示了convertUTMToLatLong()方法的代碼。該方法返回一個(gè)雙數(shù)組,其中第一個(gè)元素(數(shù)組索引[0])表示緯度,而其次個(gè)元素(數(shù)組索引[1])表示經(jīng)度。由于UTM字符串參數(shù)的精度為1米,因此經(jīng)緯度坐標(biāo)具有與之一致的精度。
清單8.publicdouble[]convertUTMToLatLong(StringUTM)
publicdouble[]convertUTMToLatLong(StringUTM){
double[]latlon={0.0,0.0};String[]utm=UTM.split(\zone=Integer.parseInt(utm[0]);StringlatZone=utm[1];
easting=Double.parseDouble(utm[2]);northing=Double.parseDouble(utm[3]);
Stringhemisphere=getHemisphere(latZone);doublelatitude=0.0;doublelongitude=0.0;
if(hemisphere.equals(\{
northing=10000000-northing;}
setVariables();
latitude=180*(phi1-fact1*(fact2+fact3+fact4))/Math.PI;
if(zone>0){
zoneCM=6*zone-183.0;}
else{
zoneCM=3.0;}
longitude=zoneCM-_a3;if(hemisphere.equals(\{
latitude=-latitude;}
latlon[0]=latitude;latlon[1]=longitude;returnlatlon;}
convertUTMToLatLong()方法將傳入的UTM字符串(格式為34G6834734942631)分解,并使用getHemisphere()方法確定字符串表示的位置所在的半球。這種確定十分簡(jiǎn)單:緯度區(qū)A、C、D、E、F、G、H、J、K、L和M位于南半球,而
其余區(qū)位于北半球。
清單9所示的setVariables()方法將設(shè)置計(jì)算所需的變量,然后馬上計(jì)算緯度值。經(jīng)度值則通過(guò)經(jīng)度區(qū)計(jì)算。
清單9.protectedvoidsetVariables()
protectedvoidsetVariables(){
arc=northing/k0;mu=arc
/(a*(1-POW(e,2)/4.0-3*POW(e,4)/64.0-5*POW(e,6)/256.0));
ei=(1-POW((1-e*e),(1/2.0)))/(1+POW((1-e*e),(1/2.0)));
ca=3*ei/2-27*POW(ei,3)/32.0;
cb=21*POW(ei,2)/16-55*POW(ei,4)/32;cc=151*POW(ei,3)/96;cd=1097*POW(ei,4)/512;
phi1=mu+ca*SIN(2*mu)+cb*SIN(4*mu)+cc*SIN(6*mu)+cd
*SIN(8*mu);
n0=a/POW((1-POW((e*SIN(phi1)),2)),(1/2.0));
r0=a*(1-e*e)/POW((1-POW((e*SIN(phi1)),2)),(3/2.0));fact1=n0*TAN(phi1)/r0;
_a1=500000-easting;dd0=_a1/(n0*k0);fact2=dd0*dd0/2;
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 觀賞魚養(yǎng)殖工常識(shí)模擬考核試卷含答案
- 鋁鎂粉球磨工班組建設(shè)評(píng)優(yōu)考核試卷含答案
- 石膏裝飾板加工工崗前改進(jìn)考核試卷含答案
- 開廠投資合同范本
- 投資理財(cái)合同范本
- 開便利店合同范本
- 車輛代持合同范本
- 公司用工協(xié)議合同
- 食物配送合同范本
- 鋼棚轉(zhuǎn)讓合同范本
- 2025四川廣元旺蒼縣旺泰人力資源服務(wù)有限公司代理部分縣屬國(guó)有企業(yè)面向社會(huì)考試招聘工作人員19人考試筆試備考試題及答案解析
- 描繪自強(qiáng)人生課件
- 流行性腦脊髓膜炎常見癥狀及護(hù)理
- 2025民族出版社專業(yè)技術(shù)人員公開招聘4人備考題庫(kù)(第二批北京)帶答案詳解(完整版)
- 藥物治療與護(hù)理工作的關(guān)聯(lián)性及臨床價(jià)值
- 2025-2026學(xué)年安徽省合肥一中高一(上)期中英語(yǔ)試卷
- 2025至2030中國(guó)銀導(dǎo)電膠行業(yè)市場(chǎng)深度研究與戰(zhàn)略咨詢分析報(bào)告
- 企業(yè)雙重預(yù)防體系建設(shè)管理手冊(cè)
- 即時(shí)零售行業(yè)發(fā)展報(bào)告2025-商務(wù)部x美團(tuán)閃購(gòu)-202511
- 膝關(guān)節(jié)韌帶損傷的護(hù)理
- 動(dòng)脈瘤破裂出血課件
評(píng)論
0/150
提交評(píng)論