背景
在公司商家參謀項目的開發(fā)過程中,場景是根據(jù)選取的活動城市選項,展示對應(yīng)的簡易行政區(qū)地圖孝凌。
大概有700+城市离钝。如果把所有的城市文件都下載下來打包到項目中票编,會導(dǎo)致項目體積過大(幾百兆),并且以后可能會頻繁增加活動城市卵渴。所以想通過某些服務(wù)按需引用對應(yīng)城市的地圖數(shù)據(jù)慧域。
先是對比了幾款圖表繪制工具,Echarts浪读,D3都可以根據(jù)地圖邊界數(shù)據(jù)繪制地圖昔榴,并且提供了豐富的交互與細(xì)節(jié)的處理。但是都需要從第三方獲取地圖邊界數(shù)據(jù)碘橘,因為它們是圖表繪制互订,不提供獲取地圖邊界數(shù)據(jù)的服務(wù)。
然后看有沒有現(xiàn)成的地圖服務(wù)可以直接獲取地圖數(shù)據(jù)蛹屿,就調(diào)研了百度地圖和高德地圖屁奏。
一.高德地圖 DistrictExplorer
這里需要用到插件geo/DistrictExplorer,查看DistrictExplorer所有屬性和方法
用Echarts和geo數(shù)據(jù)繪制地圖错负,因為有定制化浮層與自定義樣式坟瓢,所以配合Echart可以更加高效地達(dá)到想要的效果勇边。
但是公司只和百度地圖有合作,如果使用個人開發(fā)者權(quán)限可能會涉及到法律問題折联。?
而且個人開發(fā)者每天的行政區(qū)查詢?nèi)张漕~最高只有3w上限粒褒,而項目需求預(yù)估每天PV有5w+,所以只有成為企業(yè)認(rèn)證開發(fā)者才能獲取更高上限诚镰。
二. 百度地圖 Boundary
在百度地圖中沒有找到和高德地圖DistrictExplorer類似的工具奕坟,但找到最接近的Boundary類,可以返回一個行政區(qū)域的邊界清笨。?
這個類通過調(diào)用自身的get方法月杉,參數(shù)是行政區(qū)域名和回調(diào)函數(shù)。獲取到非標(biāo)準(zhǔn)的邊界數(shù)據(jù)抠艾。
調(diào)用boundary實例的get方法苛萎,得到的rs.boundaries是一個非標(biāo)準(zhǔn)的geo數(shù)據(jù)字符串,二維坐標(biāo)點(diǎn)之間用分號分隔检号。
可得到這樣可以繪制外邊界的數(shù)據(jù)
如果想用Boundary提供的數(shù)據(jù)源繪制含有子級行政區(qū)域的地圖腌歉,可以通過遍歷其子級行政區(qū)域的名字,循環(huán)調(diào)用get方法得到所有的子級行政區(qū)的數(shù)據(jù)齐苛,再把所有數(shù)據(jù)進(jìn)行改造翘盖,拼接成標(biāo)準(zhǔn)的geo數(shù)據(jù),提供給Echarts直接使用凹蜂。
但是這樣的缺點(diǎn)也是很明顯的馍驯,請求次數(shù)多,增加服務(wù)壓力炊甲,另外還需要拼接數(shù)據(jù)泥彤。
另外本次需求的城市并不是真正的城市,而是把所需要的地級市卿啡,縣級市和縣打平構(gòu)成了抽象概念的”活動城市“吟吝,數(shù)據(jù)中也只有“城市“名和業(yè)務(wù)ID,如果直接使用“城市”名作為Boundary的get方法的參數(shù)颈娜,得到的行政區(qū)域邊界數(shù)據(jù)可能與預(yù)期不符剑逃。
所以最后的解決方案是通過阿里云的一個可以下載geojson的工具,將全國所有級別的包含直接子級行政區(qū)域邊界數(shù)據(jù)拉到我們自己的庫官辽,提供自己的服務(wù)蛹磺。通過映射表將“活動城市“和真實數(shù)據(jù)對應(yīng)上。
最好的解決方案其實是利用高德地圖拉取數(shù)據(jù)同仆,通過定時任務(wù)定時拉取數(shù)據(jù)更新本地服務(wù)中靜態(tài)數(shù)據(jù)萤捆,如此既可以避免了高德每天限制的問題,又可以利用高德強(qiáng)大的數(shù)據(jù)源提供數(shù)據(jù)服務(wù)。