<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qileilove

    blog已經轉移至github,大家請訪問 http://qaseven.github.io/

    通過配置實現多種需求下的地圖展示

    1.背景
      對于一般性的地圖顯示需求,我們只需要知道地圖的一個固定URL,然后知道要顯示的范圍和要顯示的級別以及每個級別的scale等即可。
      但是如果我們遇到下面幾種情況時,又該如何。
      (1)需要顯示的圖層的不同級別來自于不同的服務器(URL不同):如前幾個級別由一個固定URL提供,后幾個級別由另外一個URL提供。
      (2)需要同時疊加幾張圖層:如需要疊加地形圖和注記圖,且圖層的顯示有層級之分。
      (3)需要同時疊加幾張圖層,并且每個圖層初始顯示級別不一樣。
      (4)需要同時疊加幾張圖層,圖層的URL的請求方式均有不同:如其中一個圖層由AGS提供,一個圖層是天地圖服務提供,還有一個圖層是當地城管局提供,最后還有一個圖層是由本地未發布的緩存瓦片提供。
      諸如類似于以上的地圖顯示需求還有很多,如果我們單純的對每一種情況進行一個代碼上的分支當然也是能解決的。但是這并不是最好的一種解決方法,每次新的需求提出時,都需要對代碼修改,這不符合設計模式中的開放封閉原則。雖然我們可以用簡單工廠等模式來努力改善這種情況,不過如果有更好的方式,不需要修改任何代碼,不需要用設計模式,就能解決以上的問題是否更好?
      下面我將給出一種通過數據庫配置來實現上面所有問題的解決方案。此方案在多個項目中已經開始使用。
      2.配置(表)的設計
      2.1原理
      首先我們必須對以上多種地圖顯示的需求進行一個分析,提出他們的共同點。
      (1)對圖層開始顯示的級別有需求(startLevel)。
      (2)多張圖層疊加,并且圖層疊加有從上自下的順序(layerDisplayOrder)。
      (3)圖層可能的URL不同(ServiceURL)
      (4)每個圖層的URL格式可以不一樣,比如URL可能天地圖的WMTS格式,可能是AGS發布的請求方式(level\row\col),也有可能是Geoserver發布的WMS格式。并且有的服務提供商還需要token字段來判斷是否有權限得到服務,或者不同的服務商提供的WMTS格式中對col和row以及level的表述字段名稱不一樣(通過這個分析,可以提煉出Xfield、Yfield、LevelFieldName、Token字段來對不同的需求進行配置)。
      (5)所有的圖層,如果要疊加,需要用同一個空間參考,同一個瓦片大小,同一個地圖起始原點,以及同一套地圖比例尺。
      (6)變化的只是URL,其核心瓦片行列號和地圖級別是每種瓦片請求URL均需要的。
      2.2設計
      2.2.1圖層列表(tcMaplayerList)的設計
      首先我給出圖層列表設計的截圖:
      (1)每一個圖層均有一個圖層名
      (2)每一個圖層均有自己的圖層類型,比如AGS類型的、WMTS類型的等。這是為了程序中對不同的類型的URL進行解析。
      (3)每一個圖層有其自己的顯示順序,為了正確的疊加圖層之用。
      (4)每一個圖層也有自己開始顯示的級別。如有的圖層想第一級別開始顯示,有的圖層希望地圖放大到第二級別時才開始顯示。
      2.2.2圖層詳細內容列表(tcgismapservicedetail)的設計
      同樣,這里先給出表的截圖:
      (1)ItemID為每個記錄的主碼。
      (2)layerName與tcMaplayerList中的圖層名是對應的。
      (3)圖層級別表示的是該圖層在此級別時的信息。
      (4)圖層在該級別的URL有一個固定的部分,比如WMTS請求中,變化的只是行列號,而前面的部分均是不定的。
      (5)Token、XFieldName、YFieldName、LevelFieldName均是為擴展之用,當URL需要給行列號以及級別一個固定的名稱時等,則配置。否則不用。
      3.工作流程
      3.1流程圖
      3.2流程詳解
      3.2.1得到需要顯示的圖層列表
      在顯示地圖之前,需要先向后臺發出請求,此請求的參數主要是layerType,后臺根據layerType將tcMapLayerList表中符合需求的內容讀出返回。
      3.2.2 解析當前地圖級別下的各個圖層信息,并順序顯示
      在解析了需要顯示的圖層列表后,每個圖層均會給后臺發出自己的信息,信息中包括了此時地圖的級別,以及需要得到的瓦片行列號和自己的圖層名。
      但是此時的地圖級別并不是圖層發給后臺的級別參數,真是的地圖級別是:
      factLayerLevel=layerLevel+startLayerLevel。
      根據factlayerLevel和layerName,在tcgismapservicedetail中找到對應的信息,如果有信息,則表示該圖層在此真實級別下是需要顯示的,然后根據該圖層的layerType將此時的URL拼接出來,下載瓦片然后返回此瓦片。
      如果沒有查到數據則不顯示此地圖級別下的該圖層。
      4.成果展示
      4.1測繪局地圖+本地瓦片
      4.2 天地圖地形圖層+天地圖注記圖層+Geoserver發布的行政區劃圖層
      4.3測繪局提供的管線WMTS圖層+本地AGS發布的地形圖層
      5.總結
      通過此配置基本可以實現項目中遇到的絕大部分地圖需求。改進后,雖然不再需要對各種需求進行大規模的代碼編寫,但是針對不同的瓦片類型的URL獲取依然是要走分支的,這里可以通過策略模式來讓代碼更加規范。
      斷了一個多月沒寫博,WebGIS的原理系列會繼續寫下去的,希望大家持續關注。

    posted on 2014-11-24 10:00 順其自然EVO 閱讀(185) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄

    <2014年11月>
    2627282930311
    2345678
    9101112131415
    16171819202122
    23242526272829
    30123456

    導航

    統計

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 日韩精品内射视频免费观看| 久久成人18免费网站| 性短视频在线观看免费不卡流畅| 日日噜噜噜噜夜夜爽亚洲精品| 国产99久久亚洲综合精品| 在线看片人成视频免费无遮挡| 亚洲乱码无限2021芒果| 青青青国产在线观看免费 | 亚洲精品无码久久久影院相关影片| 国产精品亚洲精品日韩电影| 国产一区二区三区免费看| 亚洲AV一区二区三区四区| 国产成人免费一区二区三区| 农村寡妇一级毛片免费看视频| 亚洲成aⅴ人片久青草影院| 国产黄色免费观看| 亚洲成色在线综合网站| 3d动漫精品啪啪一区二区免费| 亚洲一卡2卡3卡4卡国产网站 | 亚洲熟妇色自偷自拍另类| 成人在线免费看片| 亚洲gay片在线gv网站| 又色又污又黄无遮挡的免费视| 美女露隐私全部免费直播| 亚洲日本va在线视频观看| 最近2019年免费中文字幕高清| 亚洲精品国产精品国自产网站 | 大地影院MV在线观看视频免费| 亚洲国产精品一区二区成人片国内| 久久午夜伦鲁片免费无码| 亚洲人6666成人观看| 亚洲Av无码乱码在线znlu| 在线观看特色大片免费网站| 亚洲伦理一二三四| 亚洲日韩在线观看| 7m凹凸精品分类大全免费| 青草久久精品亚洲综合专区| 亚洲色婷婷六月亚洲婷婷6月| 四虎1515hh永久久免费| 免费无遮挡无遮羞在线看| 亚洲黄色中文字幕|