在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 請(qǐng)求。在 Spring Boot 項(xiàng)目中引入 UniHttp,可以極大地簡化與路徑規(guī)劃接口的調(diào)用過程。通過使用 UniHttp,開發(fā)人員可以輕松地構(gòu)建符合要求的 HTTP 請(qǐng)求,無需再糾結(jié)于底層的連接管理、請(qǐng)求頭設(shè)置以及參數(shù)編碼等細(xì)節(jié)問題。UniHttp 提供了直觀的接口,讓開發(fā)者能夠以一種聲明式的方式快速生成請(qǐng)求,同時(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ù)接口,不僅可以直接為前端請(qǐng)求,也可以為后臺(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)說說在天地圖中的接口請(qǐng)求參數(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ù)請(qǐng)求示例:
根據(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的格式。這里也可以請(qǐng)官方的人士調(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請(qǐng)求對(duì)接框架,能以極快的方式完成對(duì)一個(gè)第三方Http接口的對(duì)接和使用,只要配置一下即可重復(fù)使用, 不需要開發(fā)者去關(guān)注如何發(fā)送一個(gè)請(qǐng)求,如何去傳遞Http請(qǐng)求參數(shù),以及如何對(duì)請(qǐng)求結(jié)果進(jìn)行處理和反序列化,這些框架都幫你一一實(shí)現(xiàn) 就像配置 Spring的Controller 那樣簡單,只不過相當(dāng)于是反向配置而已。該框架更注重于如何保持高內(nèi)聚和可讀性高的代碼情況下與快速第三方渠道接口進(jìn)行對(duì)接和集合, 而非像傳統(tǒng)編程式的Http請(qǐng)求客戶端(比如HttpClient、Okhttp)那樣專注于如何去發(fā)送和響應(yīng)一個(gè)Http請(qǐng)求,二者并不沖突只是注重點(diǎn)不一樣,UniHttp 目前底層也是用的Okhttp去發(fā)送請(qǐng)求。 與其說的是對(duì)接的Http接口,不如說是對(duì)接的第三方渠道,UniHttp可支持自定義接口渠道方HttpAPI注解以及一些自定義的對(duì)接和交互行為 ,為此擴(kuò)展了發(fā)送和響應(yīng)和反序列化一個(gè)Http請(qǐng)求接口的各種生命周期鉤子需要開發(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、請(qǐng)求接口的定義
在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)用。代碼如下(請(qǐng)注意,下面代碼中的key需要大家到天地圖中去申請(qǐng)才能看到結(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褂玫囊恍┙涌?。后續(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)一份力量。行文倉促,難免有許多不足之處,如有不足,在此懇請(qǐng)各位專家博主在評(píng)論區(qū)不吝留言指出,不勝感激。
參考內(nèi)容:
到此這篇關(guān)于在SpringBoot中使用UniHttp簡化天地圖路徑規(guī)劃調(diào)用實(shí)踐的文章就介紹到這了,更多相關(guān)SpringBoot UniHttp天地圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
idea項(xiàng)目結(jié)構(gòu)中不顯示out文件夾的解決
本文通過圖片的方式詳細(xì)解釋操作步驟,使讀者能夠更直觀更方便地理解和執(zhí)行操作,同時(shí),文章末尾祝福讀者步步高升,一帆風(fēng)順,展現(xiàn)了作者的人情味和親和力,整體來說,這是一篇簡單易懂、實(shí)用性強(qiáng)的操作指南2024-10-10
Java隨機(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-08
Springboot web項(xiàng)目打包實(shí)現(xiàn)過程解析
這篇文章主要介紹了Springboot web項(xiàng)目打包實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08

