在SpringBoot中使用UniHttp簡化天地圖路徑規(guī)劃調(diào)用實(shí)踐記錄(場景分析)
前言
在當(dāng)今數(shù)字化飛速發(fā)展的時(shí)代,地理信息系統(tǒng)(GIS)技術(shù)在眾多領(lǐng)域發(fā)揮著至關(guān)重要的作用。從城市規(guī)劃、交通管理到物流配送、出行導(dǎo)航,路徑規(guī)劃作為 GIS 的核心功能之一,其重要性不言而喻。天地圖作為我國權(quán)威的地理信息公共服務(wù)平臺(tái),提供了豐富且精準(zhǔn)的地理數(shù)據(jù)和強(qiáng)大的路徑規(guī)劃接口,為開發(fā)者們帶來了極大的便利。在今天交通環(huán)境非常豐富的場景下,我們大家都是交通的密切參與者,而路徑規(guī)劃和導(dǎo)航應(yīng)該是大家平時(shí)用得非常多的一個(gè)應(yīng)用。比如高德、百度等互聯(lián)網(wǎng)平臺(tái)。下圖是從百度地圖截取的從長沙黃花國際機(jī)場到橘子洲景區(qū)的駕車路徑規(guī)劃信息,如下圖所示:
通過導(dǎo)航的規(guī)劃,很輕松的就可以掌握如何快速便捷的到達(dá)目的地。 然而,在實(shí)際的項(xiàng)目開發(fā)中,尤其是在基于 Spring Boot 框架的應(yīng)用里,直接調(diào)用相關(guān)互聯(lián)網(wǎng)服務(wù)的路徑規(guī)劃接口往往面臨著諸多挑戰(zhàn)。接口的調(diào)用涉及到復(fù)雜的參數(shù)配置、身份認(rèn)證以及數(shù)據(jù)格式的處理,這使得開發(fā)人員需要花費(fèi)大量的時(shí)間和精力去研究和理解接口文檔,編寫繁瑣的代碼來實(shí)現(xiàn)與服務(wù)接口的交互。對(duì)于一些對(duì)地理信息系統(tǒng)不太熟悉的開發(fā)人員來說,這無疑增加了項(xiàng)目的開發(fā)難度和周期。
在這樣的背景下,UniHttp 應(yīng)運(yùn)而生。UniHttp 是一款優(yōu)秀的 HTTP 客戶端工具,它以其簡潔易用的 API 設(shè)計(jì)和強(qiáng)大的功能特性,為開發(fā)者們提供了一種更加高效、便捷的方式來處理 HTTP 請求。在 Spring Boot 項(xiàng)目中引入 UniHttp,可以極大地簡化與路徑規(guī)劃接口的調(diào)用過程。通過使用 UniHttp,開發(fā)人員可以輕松地構(gòu)建符合要求的 HTTP 請求,無需再糾結(jié)于底層的連接管理、請求頭設(shè)置以及參數(shù)編碼等細(xì)節(jié)問題。UniHttp 提供了直觀的接口,讓開發(fā)者能夠以一種聲明式的方式快速生成請求,同時(shí)它還具備良好的錯(cuò)誤處理機(jī)制,能夠及時(shí)捕獲并反饋接口調(diào)用過程中出現(xiàn)的問題,方便開發(fā)人員進(jìn)行調(diào)試和排查。
在本次技術(shù)博客中,我們將深入探討如何在 Spring Boot 項(xiàng)目中利用 UniHttp 來簡化天地圖路徑規(guī)劃的調(diào)用實(shí)踐。從項(xiàng)目的初始搭建,到 UniHttp 的集成配置,再到具體的天地圖路徑規(guī)劃接口調(diào)用代碼示例,以及對(duì)調(diào)用結(jié)果的解析和處理,我們都將進(jìn)行詳細(xì)的講解和分析。希望通過本次分享,能夠?yàn)閺V大開發(fā)人員提供一種更加高效、可靠的天地圖路徑規(guī)劃調(diào)用解決方案,讓大家在項(xiàng)目開發(fā)中能夠更加輕松地應(yīng)對(duì)地理信息相關(guān)的功能需求,提升項(xiàng)目的開發(fā)效率和質(zhì)量,為推動(dòng)地理信息系統(tǒng)技術(shù)在更多領(lǐng)域的應(yīng)用貢獻(xiàn)一份力量。
一、天地圖路徑規(guī)劃簡介
天地圖作為一款在線的免費(fèi)地圖服務(wù)方,上面有很多的資源可以使用。如果是在線應(yīng)用,大家可以直接使用來輔助自己的業(yè)務(wù)系統(tǒng),提高產(chǎn)品研發(fā)的效率,降低空間技術(shù)開發(fā)的難度。比如本文提到的路徑規(guī)劃的服務(wù)。當(dāng)然,基于在線模式的路徑規(guī)劃服務(wù),有常見的百度、高德、騰訊地圖等,還有我們的天地圖,這里的地圖數(shù)據(jù)是符合相關(guān)標(biāo)準(zhǔn)的,是規(guī)范的地圖。因此大家可以放心使用,當(dāng)然為了保證一些服務(wù)的可用,在調(diào)用相關(guān)的接口之前,需要進(jìn)行開發(fā)者認(rèn)證,其實(shí)也很簡單,只要到官方網(wǎng)站上進(jìn)行注冊即可,在之前的博文中有一定講解,在此不贅述。
1、天地圖相關(guān)服務(wù)
天地圖的API主要包含以下四類,如下圖所示:
天地圖的API服務(wù)主要包含四大類 :1、地圖API,2、Web端開發(fā),3、WEB服務(wù)API,4、數(shù)據(jù)API。 其中地圖API主要是提供相關(guān)的底圖服務(wù),比如矢量底圖、影像底圖和它對(duì)應(yīng)的注記地圖。Web端API主要是提供前端的接口支持,提供Javascript3.0和4.0的相關(guān)操作接口。Web服務(wù)API主要是提供服務(wù)接口,不僅可以直接為前端請求,也可以為后臺(tái)服務(wù)提供服務(wù),可以無縫對(duì)接Java、Python、C#等多種語言。最后的數(shù)據(jù)API用得比較少,這里的服務(wù)暫時(shí)訪問不了。之前咨詢了官方技術(shù)人員,大家需要的可以自行去數(shù)據(jù)資源中下載即可。
2、天地圖路徑規(guī)劃接口
首先不得不吐槽一下天地圖的一些錯(cuò)誤,在接口的說明上沒有維護(hù)好元數(shù)據(jù)。比如下圖中的公交規(guī)劃和駕車規(guī)劃,雖然是兩個(gè)接口,但是關(guān)于接口的說明卻不明確。
上圖是公交規(guī)劃的接口簡介。下圖是實(shí)際的駕車規(guī)劃接口:
小瑕疵,還是期望有相關(guān)人員及時(shí)更新,畢竟是一個(gè)面向大眾的互聯(lián)網(wǎng)應(yīng)用。下面以駕車路徑規(guī)劃為例,重點(diǎn)說說在天地圖中的接口請求參數(shù)以及響應(yīng)參數(shù)信息,這里幫大家整理好了,當(dāng)然也可以到天地圖的官網(wǎng)中查看相關(guān)說明。
駕車服務(wù)簡介:
駕車服務(wù)API是一類簡單的HTTP/HTTPS接口,根據(jù)輸入起點(diǎn)、終點(diǎn)和途經(jīng)點(diǎn)規(guī)劃查詢駕車路線。根據(jù)輸入的起點(diǎn)、終點(diǎn)和途徑點(diǎn)規(guī)劃查詢駕車路線。除了輸入起始點(diǎn),天地圖還有一個(gè)非常實(shí)用的功能,就是添加途經(jīng)點(diǎn),它可以輔助我們進(jìn)行更復(fù)雜的規(guī)劃。
參數(shù) | 參數(shù)說明 | 參數(shù)類型 | 返回條件 | 備注 |
orig | string | 起點(diǎn)經(jīng)緯度 | 是 | -180,-90,180,90。 |
dest | string | 終點(diǎn)經(jīng)緯度 | 是 | -180,-90,180,90。 |
mid | string | 途徑點(diǎn)經(jīng)緯度字符串 | 否 | 途徑點(diǎn)字符串格式:116.35506,39.92277;116.35506,39.92277兩個(gè)坐標(biāo)之間以分號(hào)隔開,坐標(biāo)xy之間用逗號(hào)隔開(都是半角)。 |
style | string | 導(dǎo)航路線類型 | 默認(rèn)0 (0:最快路線,1:最短路線,2:避開高速,3:步行) | 0-3。 |
以下是服務(wù)請求示例:
根據(jù)起點(diǎn)、終點(diǎn)經(jīng)緯度字符串查詢導(dǎo)航信息:http://api.tianditu.gov.cn/drive?postStr={"orig":"116.35506,39.92277","dest":"116.39751,39.90854","style":"0"}&type=search&tk=您的密鑰 加入途徑點(diǎn)的導(dǎo)航查詢:http://api.tianditu.gov.cn/drive?postStr={"orig":"116.35506,39.92277","dest":"116.39751,39.90854","mid":"116.36506,39.91277;116.37506,39.92077","style":"0"}&type=search&tk=您的密鑰
接下來是響應(yīng)參數(shù),這里也要提一下,天地圖的響應(yīng)參數(shù)格式xml,沒錯(cuò),它不是采用json的格式。這里也可以請官方的人士調(diào)整一下,畢竟目前很多接口的響應(yīng)格式都是用的json。xml用的還是少了些。相應(yīng)參數(shù)如下:
<?xml version="1.0" encoding="UTF-8" ?> <result orig='起點(diǎn)經(jīng)緯度' mid='途徑點(diǎn)信息' dest='終點(diǎn)經(jīng)緯度'> <parameters> <orig>起點(diǎn)加密經(jīng)緯度</orig> <dest>終點(diǎn)加密經(jīng)緯度</dest> <mid>途徑點(diǎn)加密經(jīng)緯度集合</mid> <key>經(jīng)緯度加密的 key 值</key> <width>地圖寬度</width> <height>地圖高度</height> <style>導(dǎo)航路線類型</style> <version>版本控制</version> <sort>排序方式</sort> </parameters> <routes count='分段總數(shù)' time='查詢時(shí)間'> <item id='0'> <strguide>每段線路文字描述</strguide> <signage>“路牌”引導(dǎo)提示/高速路收費(fèi)站出口信息</signage> <streetName>當(dāng)前路段名稱</streetName> <nextStreetName>下一段道路名稱</nextStreetName> <tollStatus>道路收費(fèi)信息(0=免費(fèi)路段,1=收費(fèi)路段,2=部分收費(fèi)路段)</tollStatus> <turnlatlon>轉(zhuǎn)折點(diǎn)經(jīng)緯度</turnlatlon> </item> <item id='1'> .... </item> ....其他分段線路信息 </routes> <simple> <item id='0'> <strguide>每段線路文字描述</strguide> <streetNames>當(dāng)前行駛路段名稱(含多個(gè)路段)</streetNames> <lastStreetName>最后一段道路名稱</lastStreetName> <linkStreetName>合并段之間銜接的道路名稱</linkStreetName> <signage>“路牌”引導(dǎo)提示/高速路收費(fèi)站出口信息</signage> <tollStatus>道路收費(fèi)信息(0=免費(fèi)路段,1=收費(fèi)路段,2=部分收費(fèi)路段)</tollStatus> <turnlatlon>轉(zhuǎn)折點(diǎn)經(jīng)緯度</turnlatlon> <streetLatLon>線路經(jīng)緯度</streetLatLon> <streetDistance>行駛總距離(單位:米)</streetDistance> <segmentNumber>合并后的號(hào)段,對(duì)應(yīng)詳細(xì)描述中的號(hào)段</segmentNumber> </item> <item id='1'> .... </item> ....其他分段線路信息 </simple> <distance>全長(單位:公里)</distance> <duration>行駛總時(shí)間(單位:秒)</duration> <routelatlon>線路經(jīng)緯度字符串</routelatlon> <mapinfo> <center>全部結(jié)果同時(shí)顯示的適宜中心經(jīng)緯度</center> <scale>全部結(jié)果同時(shí)顯示的適宜縮放比例</scale> </mapinfo> </result>
以上就是天地圖的駕車規(guī)劃接口詳情介紹,希望大家可以熟悉接口的入?yún)⒑晚憫?yīng)參數(shù)。在后續(xù)的接口調(diào)用介紹中會(huì)使用到。
二、UniHttp簡介
從企業(yè)級(jí)項(xiàng)目來說,傳統(tǒng)的接口訪問我們會(huì)使用編程式Http客戶端比如HttpClient、Okhttp去直接對(duì)接第三方Http接口, 那么項(xiàng)目一定充斥著大量的對(duì)接邏輯和代碼。本節(jié)將重點(diǎn)講解Unihttp的相關(guān)知識(shí),可以通過uniHttp來簡化http接口的調(diào)用。
1、UniHttp是什么?
UniHttp是一個(gè)聲明式的Http請求對(duì)接框架,能以極快的方式完成對(duì)一個(gè)第三方Http接口的對(duì)接和使用,只要配置一下即可重復(fù)使用, 不需要開發(fā)者去關(guān)注如何發(fā)送一個(gè)請求,如何去傳遞Http請求參數(shù),以及如何對(duì)請求結(jié)果進(jìn)行處理和反序列化,這些框架都幫你一一實(shí)現(xiàn) 就像配置 Spring的Controller
那樣簡單,只不過相當(dāng)于是反向配置而已。該框架更注重于如何保持高內(nèi)聚和可讀性高的代碼情況下與快速第三方渠道接口進(jìn)行對(duì)接和集合, 而非像傳統(tǒng)編程式的Http請求客戶端(比如HttpClient、Okhttp)那樣專注于如何去發(fā)送和響應(yīng)一個(gè)Http請求,二者并不沖突只是注重點(diǎn)不一樣,UniHttp 目前底層也是用的Okhttp去發(fā)送請求。 與其說的是對(duì)接的Http接口,不如說是對(duì)接的第三方渠道,UniHttp可支持自定義接口渠道方HttpAPI注解以及一些自定義的對(duì)接和交互行為 ,為此擴(kuò)展了發(fā)送和響應(yīng)和反序列化一個(gè)Http請求接口的各種生命周期鉤子需要開發(fā)者去自定義實(shí)現(xiàn)。
這里只對(duì)其做一個(gè)簡單介紹,關(guān)于其強(qiáng)大的方法,在后續(xù)的內(nèi)容中結(jié)合相關(guān)案例進(jìn)行介紹。
2、UniHttp能做什么?
首先來看一下UniHttp的官方API文檔,如下所示:
官方api手冊的地址是:UniHttp文檔。如何在Java環(huán)境中集成上述組件有詳細(xì)的說明。在Springboot中引入U(xiǎn)niHttp的Maven聲明如下所示,這里我們使用的版本是0.0.8:
<!-- 增加uniapi-http add by 夜郎king in 2025.02.14 begin --> <dependency> <groupId>io.github.burukeyou</groupId> <artifactId>uniapi-http</artifactId> <version>0.0.8</version> </dependency> <!-- 增加uniapi-http add by 夜郎king in 2025.02.14 end -->
三、UniHttp調(diào)用天地圖接口
1、請求接口的定義
在SpringBoot中定義相關(guān)接口的代理類,這個(gè)比較簡單,直接創(chuàng)建一個(gè)接口即可,為了演示方便,這里定義了天地圖中的兩個(gè)地址,一個(gè)是地理名稱檢索以及駕車路徑規(guī)劃調(diào)用。具體Java接口方法如下:
package com.yelang.project.thridinterface; import com.burukeyou.uniapi.http.annotation.HttpApi; import com.burukeyou.uniapi.http.annotation.param.QueryPar; import com.burukeyou.uniapi.http.annotation.request.GetHttpInterface; import com.burukeyou.uniapi.http.core.response.HttpResponse; @HttpApi(url = "http://api.tianditu.gov.cn/") public interface ITdtOptionService { @GetHttpInterface("geocoder") HttpResponse<String> getGeocoder(@QueryPar("ds") String ds,@QueryPar("tk") String tk); @GetHttpInterface("drive") HttpResponse<String> drivePlan(@QueryPar("postStr") String postStr,@QueryPar("type") String type,@QueryPar("tk") String tk); }
2、實(shí)際調(diào)用
為了演示方便,這里以Junit為例,重點(diǎn)講解如何在SprintBoot環(huán)境中進(jìn)行集成和調(diào)用。代碼如下(請注意,下面代碼中的key需要大家到天地圖中去申請才能看到結(jié)果):
package com.yelang.project.unihttp; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import com.burukeyou.uniapi.annotation.UniAPIScan; import com.burukeyou.uniapi.http.core.response.HttpResponse; import com.yelang.project.thridinterface.ITdtOptionService; @SpringBootTest @RunWith(SpringRunner.class) @UniAPIScan("com.yelang.project.thridinterface") // 指定@HttpApi接口所在的包路徑 public class TdtUniHttpCase { //服務(wù)端訪問key //private static final String TDT_BROWSE_KEY = "xxx"; private static final String TDT_SERVER_KEY = "xxx"; @Autowired private ITdtOptionService tdtOptService; @Test public void testGeocoder() { String target = "北京市延慶區(qū)延慶鎮(zhèn)蓮花池村前街50夕陽紅養(yǎng)老院"; String keyWord = "%7B'keyWord':'" + target + "'%7D" ; HttpResponse<String> resp = tdtOptService.getGeocoder(keyWord, TDT_SERVER_KEY); System.out.println(resp.getBodyResult()); } @Test public void testDrivePlan() { String origInfo = "113.216171,28.190967";//黃花國際機(jī)場 String destInfo = "112.957124,28.198626";//橘子洲景區(qū) // style 默認(rèn)0 (0:最快路線,1:最短路線,2:避開高速,3:步行) // 這里選擇避開高速 String postStr = "%7B'orig':'" + origInfo + "','dest':'" + destInfo + "','style':'2'%7D" ; HttpResponse<String> resp = tdtOptService.drivePlan(postStr,"search",TDT_SERVER_KEY); System.out.println(resp.getBodyResult()); } }
在第二個(gè)駕車的規(guī)劃中,在參數(shù)中需要傳的經(jīng)緯度位置,而日常生活中,我們通常拿到的都是地址信息,因此還需要一個(gè)根據(jù)中文名稱找它的對(duì)應(yīng)經(jīng)緯度位置的過程。當(dāng)然我們也可以直接調(diào)用天地圖的服務(wù)來實(shí)現(xiàn)。這里假設(shè)已經(jīng)成功的獲取起始點(diǎn)和目標(biāo)點(diǎn)的經(jīng)緯度坐標(biāo)。
3、相應(yīng)結(jié)果展示
上面的起始點(diǎn)和目標(biāo)點(diǎn)分別是:長沙黃花機(jī)場和橘子洲風(fēng)景區(qū)。將兩者作為導(dǎo)航的起始點(diǎn)輸入,默認(rèn)選用避開高速的方式(最小成本的模式),最后得到的響應(yīng)結(jié)果如下:
我們將得到的響應(yīng)結(jié)果格式化之后可以看到以下的信息:
基本上可以跟導(dǎo)航軟件上實(shí)現(xiàn)的結(jié)果是一致的,由此可以得到具體路徑規(guī)劃信息。 通過這個(gè)實(shí)驗(yàn)表明,通過天地圖的駕車路徑規(guī)劃服務(wù)可以得到滿足我們?nèi)粘J褂玫囊恍┙涌凇:罄m(xù)大家可以基于這種方法進(jìn)行業(yè)務(wù)開發(fā)。當(dāng)然,前提是一定要去注冊天地圖的開發(fā)者才可以調(diào)用相關(guān)服務(wù)。
四、總結(jié)
以上就是本文的主要內(nèi)容,在本次技術(shù)博客中,我們將深入探討如何在 Spring Boot 項(xiàng)目中利用 UniHttp 來簡化天地圖路徑規(guī)劃的調(diào)用實(shí)踐。從項(xiàng)目的初始搭建,到 UniHttp 的集成配置,再到具體的天地圖路徑規(guī)劃接口調(diào)用代碼示例,以及對(duì)調(diào)用結(jié)果的解析和處理,我們都將進(jìn)行詳細(xì)的講解和分析。希望通過本次分享,能夠?yàn)閺V大開發(fā)人員提供一種更加高效、可靠的天地圖路徑規(guī)劃調(diào)用解決方案,讓大家在項(xiàng)目開發(fā)中能夠更加輕松地應(yīng)對(duì)地理信息相關(guān)的功能需求,提升項(xiàng)目的開發(fā)效率和質(zhì)量,為推動(dòng)地理信息系統(tǒng)技術(shù)在更多領(lǐng)域的應(yīng)用貢獻(xiàn)一份力量。行文倉促,難免有許多不足之處,如有不足,在此懇請各位專家博主在評(píng)論區(qū)不吝留言指出,不勝感激。
參考內(nèi)容:
到此這篇關(guān)于在SpringBoot中使用UniHttp簡化天地圖路徑規(guī)劃調(diào)用實(shí)踐的文章就介紹到這了,更多相關(guān)SpringBoot UniHttp天地圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
idea項(xiàng)目結(jié)構(gòu)中不顯示out文件夾的解決
本文通過圖片的方式詳細(xì)解釋操作步驟,使讀者能夠更直觀更方便地理解和執(zhí)行操作,同時(shí),文章末尾祝福讀者步步高升,一帆風(fēng)順,展現(xiàn)了作者的人情味和親和力,整體來說,這是一篇簡單易懂、實(shí)用性強(qiáng)的操作指南2024-10-10Java隨機(jī)值設(shè)置(java.util.Random類或Math.random方法)
在編程中有時(shí)我們需要生成一些隨機(jī)的字符串作為授權(quán)碼、驗(yàn)證碼等,以確保數(shù)據(jù)的安全性和唯一性,這篇文章主要給大家介紹了關(guān)于Java隨機(jī)值設(shè)置的相關(guān)資料,主要用的是java.util.Random類或Math.random()方法,需要的朋友可以參考下2024-08-08Springboot web項(xiàng)目打包實(shí)現(xiàn)過程解析
這篇文章主要介紹了Springboot web項(xiàng)目打包實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08