一、地圖介紹
1、使用地圖的APP
- 百度地圖:路徑導航、周邊搜索,生活中必備的工具。
- 小豬巴士:班車定制的APP。
- 神州租車:租車、訂車的一款APP
- 酷米客實時公交:查詢公交線路、指定線路公交位置。
- Waze 社交導航:Waze可以讓司機報告實時的交通狀況,例如:交通事故、天氣甚至是警車的蹤跡。Google當年以9.66億美元的價格收購了這個應用。
因此可以說地圖是我們生活中的一部分,而使用地圖的主要功能包括:用戶位置展示、定位服務、數據服務、出行服務、軌跡服務、導航服務等等具體參考實際地圖。
當前主流地圖如:
1、Google地圖
2、百度地圖
3、高德地圖
4、搜狗地圖
地圖的功能大致相當,但細節上可能有些差異;由於國能的原因Google業務是用不了的,因此在國能只能選擇百度地圖或高德地圖或其他地圖,具體選擇看業務需求及個人喜好;國外用Google地圖就搞定了,如果沒有限制一個地圖那是最好的,可現實還要面對;下面就基於這個問題提出個人解決解決方案:
2、多地圖的分層結構設計
3、設計說明
-
1、地圖選擇:國內選擇一種地圖,如百度地圖(后續都以百度地圖說明),國外用Google(國內是無法直接訪問的,開發測試時需要開VPN或其他專線等,有消息稱后續Google會逐步進入國內,那是后話),多地圖時需要在項目中導入兩種地圖;導入時如果支持pod建議使用這種方式。
-
2、地圖接口層設計說明:
1)APP具體選用哪種地圖可以通過編譯宏來解決,一般APP國內一個版本,國外一個版本,編譯時通過宏的不同值決定選擇哪種地圖。2)封裝層設計為單例還是多實例取決於具體應用,如果一定會加載地圖,那么設計為單例可能會有優勢,原因是:地圖服務的啟動,地圖界面的展示,當前位置的定位等需要消耗一些流量(地圖是由圖片拼接的,圖片的流量、位置信息的流量等)及消耗大量的CPU、內存,通過測試地圖在加載時CPU會突然飆升,建議APP的首頁盡量不要直接使用地圖,如果使用會有1到3秒的卡頓;如果無論在什么情況都要使用地圖,那使用單例可能性能、體驗要好些;如果只是有些頁面點到菜使用時,那使用時在創建可能更好些。
-
3、封裝層提供的接口:
1)地圖試圖的獲取、地圖屬性配置、地圖的基本操作。
2)Mark標注的創建、清除。
3)划線、畫圖的封裝。
4)地圖按鈕的封裝:歸位、放大、縮小、指北針等。
5)地圖操作:點擊、選擇點等。
6)地圖工具方法:截圖、計算經緯度距離、坐標轉換等。 -
4、位置服務的管理,地址的解析。
如下圖:
優點
- 1、屏蔽地圖功使用者需要學習地圖相關內容,降低門檻,如不需要了解是否允許定位的配置、如何創建地圖、如何添加標注、划線、畫圖、POI等等,這些底層封裝了;使用者只需要使用相關接口即可。
- 2、便於問題的統一修改,一個問題只要在底層修改了,使用點均不需要修改。
- 3、代碼的封裝,避免冗余代碼:我們知道地圖有很多的代理方法,每個頁面使用都需要創建一套,封裝后則避免了該問題。
- 4、避免了多地圖導致的代碼復雜,因為每個地圖要寫一套業務邏輯。
- 5、避免地圖更換對業務層的影響。
缺點
- 1、如果同時導入兩個地圖會使編譯后的安裝包增大;編譯時是將使用到的內容編譯到可以執行文件中,以Google為例,編譯后的安裝包添加Google地圖和不添加相差大約2M左右(較真的同學可以花時間在驗證下,也要看具體項目使用接口的多少);解決方法是:可以用個編譯宏屏蔽,編譯國內版本時指定國內的地圖;編譯國外版本時編譯Google地圖。
- 2、地圖單例,會導致前一個頁面添加的標注在其他頁面也顯示,解決方法:頁面在viewWillDisappear 時清理掉添加的所有附屬物。
擴展說明
- 1、無論是IOS還是Android版本在使用SDK的原生接口時,有時也可以考慮使用地圖提供的服務接口(API接口),如經緯度的地址反解析,原生接口更易失敗,效果也不是很理想,經驗證API接口效果要好很多。
- 2、以前百度地圖如2.4之前的版本是不支持標注的聚合,目前版本已經支持了。
- 3、行程數據繪制時數據很多會導致很卡,一般每隔5S一個數據,4個小時的數據還可以接受,太多有些會導致崩潰。
- 4、IOS位置服務定位的地理坐標,畫到地圖上時需要進行火星坐標轉換,否則有幾百米的偏差。
二、地圖我們能做的
-
1、標注的使用
-
2、標注的使用
-
3、行程軌跡的
-
4、行程的回放、快進、后退(當前百度好像支持了)
-
5、多信息在標注的使用
-
6、用戶位置的發送
-
7、地圖控件的封裝:歸位、放大、縮小
-
8、簡單的地圖view、及一些基本屬性的設置
三、我們現狀
我們互生的代碼中的Map中的代碼基本比較傳統的寫法,需要使用地圖的頁面,導入地圖的庫、添加地圖視圖、添加地圖的代理等;這中方式最主要的問題有一下及方面:
1、 有很多關於地圖的代碼分散到業務邏輯的中,冗余,重復的內容比較多。
2、出現問題不便於問題的統一修改。
3、每個人使用時需要學習地圖使用相關的一些API,封裝后的有部分人維護,這樣更加專業。
4、如果地圖切換要大量修改。
5、無法支撐多個地圖的應用。
6、統一管理位置服務,在APP耗電方面有些優勢。
四、優化點
1、將地圖封裝出一套API,屏蔽地圖的差異,業務層使用API接口。
2、封裝層根據需要可以封裝幾套地圖,一般是國內一個、國外一個。
3、地理位置統一管理,其他需要位置信息,調用接口獲取即可。
Good luck!