多地圖架構設計


一、地圖介紹

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!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM