天天看點

GIS開發離線地圖應用-初識gis

  最新公司需要做一個基于gis地圖的應用系統,由于之前公司項目中的電子地圖子產品都是我開發的,是以這個新系統也自然讓我先去了解如何開發,可以說做個簡單的調研。

        和之前的項目中開發的電子地圖子產品不同,這次是開發gis地圖,是要顯示真實的地理位置,能有gps定位功能的。而之前開發過的電子地圖功能,都隻是基于svg的矢量可配置地圖(之前采用batik開發過C/S版,用raphael開發過B/S版,都在項目中正常使用)。

        下面描述下我開始開發前做的準備和了解工作,希望對首次接觸并想要開發gis離線地圖應用的coder有幫助。

        (這裡隻提取和地圖相關的,其他業務需求就不描述了)          

        1. 支援離線使用

        2. 優先支援百度地圖,不行選擇google也可

        3. 支援地圖基本操作,放大、縮小、平移

        4. 支援車載裝置的GPS定位顯示在地圖上

        5. 支援在地圖上标注自定義的内容(圖示、文字)

        6. 支援自定義内容的操作,拖拽、右鍵顯示資訊和菜單

        7. 設計上支援以後替換不同地圖引擎,如從google換成高德,替換後盡量少做開發工作就能正常使用。

                各個地圖開發商都提供了自己的api供大家調用,以友善進行二次開發,如google、百度、高德等,這些api往往比較完善和成熟,可以充分滿足我們系統中的業務功能,但有幾個要求無法滿足:

        1)無法支援離線使用,很多api通過http請求去各個地圖開發商伺服器擷取資料,離線情況下有很多功能限制,其中最主要的GPS定位糾偏api就必須聯網。

        2)不易支援多個gis引擎,如果api進行開發,則肯定不相容其他廠商gis的api,如果通過設計上在每個api上封裝一層,則工作量太大。

        是以使用某個廠商的api進行開發的方案基本不可行。

         OpenLayers 是一個專為Web GIS 用戶端開發提供的JavaScript 類庫包,用于實作标準格式釋出的地圖資料通路。

               使用openlayer進行網頁上地圖的顯示和操作控制,而不去調用各個廠商的api,通過工具擷取google的離線地圖瓦片資料,存在自己的伺服器上,并可進行離線的開發和使用。

        這樣理論上隻要更換背景伺服器上的圖檔資料,做一些必要的配置,而不用改前台網頁顯示地圖的代碼,就可以支援不同廠商的地圖展示。

        顯然在顯示地圖方案上,是要選擇方案2才能滿足離線和支援多地圖引擎的要求。

        原本希望使用百度地圖,但是上網查了一圈,發現使用百度地圖進行離線開發,似乎不大可行。

        1) 百度官方的api中就不支援web開發離線地圖。這個正常,一般的都不支援web離線開發,手機的倒是都支援。

        2) 離線地圖的一個需要解決的問題,GPS糾偏,百度地圖的似乎不好處理,百度有自己的偏移加密。

        這裡順便引用下對坐标系的介紹:

       1.火星坐标系統 GCJ-02

        國家保密插件,也叫做加密插件或者加偏或者SM模組,其實就是對真實坐标系統進行人為的加偏處理,按照幾行代碼的算法,将真實的坐标加密成虛假的坐标,而這個加偏并不是線性的加偏,所               以各地的偏移情況都會有所不同。而加密後的坐标也常被人稱為火星坐标系統。

        目前使用火星坐标系的地圖商:

        騰訊搜搜地圖

        搜狐搜狗地圖

        阿裡雲地圖

        高德MapABC地圖

        靈圖51ditu地圖

  (重要)所有的電子地圖所有的導航裝置,都需要加入國家保密插件。第一步,地圖公司測繪地圖,測繪完成後,送到國家測繪局,将真實坐标的電子地圖,加密成 “火星坐标”,這樣的地圖才是可以出版和釋出的,然後才可以讓GPS公司處理。第二步,所有的GPS公司,隻要需要汽車導航的,需要用到導航電子地圖的, 統統需要在軟體中加入國家保密算法,将COM口讀出來的真實的坐标信号,加密轉換成國家要求的保密的坐标,這樣,GPS導航儀和導航電子地圖就可以完全匹 配,GPS也就可以正常工作。

    2.大地坐标系統 WGS-84 

      用來表述地球上點的位置的一種地區坐标系統。它采用一個十分近似于地球自然形狀的參考橢球作為描述和推算地面點位置和互相關系的基準面。一個大地坐标系統 必須明确定義其三個坐标軸的方向和其中心的位置。通常人們用旋轉橢球的短軸與某一規定的起始子午面分别平行幹地球某時刻的平均自轉軸和相應的真起始子午面 來确定坐标軸的方向。若使參考橢球中心與地球平均質心重合,則定義和建立了地心大地坐标系。它是航天與遠端武器和空間科學中各種定位測控測軌的依據。若橢 球表面與一個或幾個國家的局部大地水準面吻合最好,則建立了一個國家或區域的局部大地坐标系。大地坐标系中點的位置是以其大地坐标表示的,大地坐标均以橢 球面的法線來定義。其中,過某點的橢球面法線與橢球赤道面的交角為大地緯度;包含該法線和大地子午面與起始大地子午面的二面角為該點的大地經度;沿法線至 橢球面的距離為該點的大地高。大地緯度、大地經度和大地高分别用大寫英文字母B、L、H表示。

    3.百度坐标系統 BD-09

百度坐标對火星坐标系進行了一次加密,形成了百度坐标系. 目前使用百度坐标系的地圖商: 百度Baidu地圖 圖吧MapBar地圖

      可見百度地圖比較特殊,有着自己的二次加密。

假設以後車載裝置将GPS資訊實時推送給我們,如果直接将位置坐标輸入地圖中顯示,則會有偏移,這樣肯定無法滿足要求,是以糾偏一直是開發離線gis應用的難點。 對google離線地圖的糾偏,google由于離線開發者多,是以相應的方法也較多,糾偏問題應該能較好的解決,而且查到了别人所謂的糾偏算法,隻是沒有驗證。 百度地圖的糾偏相對複雜,一般人使用線上api可以直接調用糾偏接口,而離線則沒有很好的方式,其糾偏算法網絡上也沒有找到,一般百度地圖的糾偏資料庫也是收費的。 是以在糾偏問題上,百度地圖比較難解決,而google地圖相對較容易。

      總的來看,我應該會選擇開發google的離線地圖,風險相對小一點,web采用openlayers進行加載顯示,正式開發前的準備工作就差不多啦,接下來應該要弄個demo試一下,或者直接開幹!            

繼續閱讀