地圖實現原理[轉]


 

轉載地址:http://psy-yd.iteye.com/blog/807486

ps:文章將地圖實現的原理分析的很到位,推薦學習!

一、創建一個地圖 
  瓦片:地圖組成部分,一個地圖信息有多個瓦片拼接而成。 
  Level :地圖顯示級別 

二、原理

  根據地圖基本信息來動態加載 img 集合,並把所有圖片拼接成一個完整的地圖信息。 
  定義個地圖可視化窗口,設置窗口的大小。 
  根據地圖的級別、地圖類型來加載對應的瓦片信息(即由一張完成的圖片切割而成的小圖片的集合),根據可視窗口的大小和定義的中心點來計算需要顯示哪些瓦片信息,對於超出可視區域的瓦片,不顯示。得到瓦片信息集合后,把瓦片信息按規則來拼接在一起,顯示成一張完成的圖片信息。 
  

------------------------------------------------

  博主經營一家發飾淘寶店,都是純手工制作哦,開業沖鑽,只為信譽!需要的親們可以光顧一下!謝謝大家的支持!
店名:
  小魚尼莫手工飾品店
經營:
  發飾、頭花、發夾、耳環等(手工制作)
網店:
  http://shop117066935.taobao.com/

  ---------------------------------------------------------------------

繼續正題... 

  


三、地圖移動 
  在地圖移動過程中,記錄地圖中心點的位置改變。 
  移動結束后,根據中心點位置改變的大小來重新計算加載的瓦片信息;並調用地圖重繪方法來重新生成顯示的地圖信息。 

四、地圖縮放 
  根據地圖的縮放級別來重新計算加載的瓦片信息。並調用地圖重繪方法來重新顯示地圖信息。 
  原理:假設當前顯示的地圖 level=2 由 
         a b 
         c d 
  四張圖片按這樣的排列方式拼接而成。點擊放大后 level = 3 ,原理顯示圖片 a 的區域改變為: 
         a1 a2 
         a3 a4 
  四張圖片。其他三個區域改變方式相同。(這里的 a1 ~ a4 是由 level=3 的地圖圖片切割而來的),這樣就實現了地圖放大的效果。 
  
五、地圖 js 功能說明 
Map 功能 js 結構如下: 
  ..... 
  ...... 

功能說明: 
  1. Action 文件為控制層對象 這里實現對地圖中基本操作的控制,如:地圖的移動,縮放,地圖類型的轉換等。 
  2. Model 文件為模型定義對象,這里定義了地圖中所有使用模型的定義,如:坐標定義,點定義,矩形區域定義,地圖對象定義,標注定義,工具定義等。同時實現了對這些模型的基本操作方法。 
  3. Widget 文件界面生成對象,擴展工具定義,地圖基本方法定義和基本地圖工具定義。 
  4. Mapbuilder.js 地圖創建初始化 
  5. MapEvent.js 地圖事件定義 
  6. BaseAction.js 控制層對象 
  7. BaseModel.js 模型對象 
  8. BaseWidget.js 界面生成對象 
  9. Command.js 事件控制對象 
  10. Listener.js 抽象監聽對象 
  11. ListenerSupport.js 監聽對象 
  12. Prototype.js   js 庫 
  13. Util.js 常用操作方法定義

 
Js 功能說明: 
  Mapbuilder.js 地圖構建器:地圖構建器對象,對創建地圖進行初始化加載。 
  Include 方法:動態加載 js 文件,如果有新添加的 js 文件統一在此處加載。 
  MapBuilder 方法:地圖構建對象,通過創建一個 MapBuilder 對象來生成一個地圖 。其中有以下方法: 
  outputMap : 輸出地圖信息。 
  addTool : 增加擴展工具信息。 
  GetMap : 取得地圖對象。 
  
MapEvent.js 地圖事件定義:地圖自定義事件,可以加入實現特定功能的事件和方法。有以下定義方法: 
  MapEvent. getEventCoord :取得事件觸發的坐標。添加標注時通過該方法取得標注在地圖上的具體坐標。 
  MapEvent. addListener : 為對象添加監聽事件。 

Eg :為地圖添加右鍵單擊事件,定義事件常量 
  MapEvent.ONCONTEXTMENU = "event.oncontextmenu" ; 
  為地圖對象添加監聽事件 
  MapEvent.addListener(map, MapEvent.ONCONTEXTMENU , function (e) { 
      var coord = MapEvent.getEventCoord(e, map); 
      … 
  } ); 

  添加用戶自定義事件( MapPaneWidget.js 中 customEvent 方法 ) 
  if (eventName == MapEvent.ONCONTEXTMENU) { 
         mapDiv.oncontextmenu = this .model.events[MapEvent.ONCONTEXTMENU]; 
  }

GeoObject.js 地理信息定義:坐標定義,點定義和矩形區域定義。並實現了相應的操作方法。 
MapModel.js 地圖對象定義 
MapModel :地圖模型定義,定義地圖的縮放比例,中心區域坐標,地圖事件等。 
方法: 
addOverlay : 添加地圖標注信息,參數為地圖標注對象( marker )。在地圖上添加一個標注可以直接用以下方法實現: 
MapModel.addOverlay(new Marker(coord.getPoint(), Marker.LARGE)); 
           removeOverlay : 移除單個標注信息(移除指定的標注,參數為標注對象)。 
           clearOverlays : 清除地圖所有標注信息。 
MapType :地圖類型定義,我們自定義的地圖類型繼承該方法,並重寫 getSrc 方法來獲得正確的圖片路徑。如果要添加一個新的地圖類型,可以用以下方法實現: 
           function MapMapType() { 
          // 繼承 maptype 
          MapType.apply( this ); 
          // 重寫 getSrc 方法 
          this .getSrc = function (level, row, column) { 
         var url = "mapdemo\\images\\zoom" +level+ "\\" +level+ "_" +column+ "_" +row+ ".jpg" ; 
                  return url; 
          } 
            } 
  MapModel.mapTypes = new Array(); 
  MapModel.mapTypes.push( new MapMapType()); 
這里 new MapMapType() 為我們自定義的地圖類型。 

Zoom : 比例模型定義,定義了地圖當前等級,當前所有瓦片集合和邊緣瓦片數。 
Tile :瓦片定義,定義列,行和地圖縮放級別 
Overlay.js 地圖覆蓋物定義 
Overlay :地圖覆蓋物抽象類 ,定義覆蓋物區域范圍,坐標,顯示圖形,陰影圖形。 
Icon : 覆蓋物顯示圖標 
Marker : 標記定義(繼承 overlay )。定義了標記的基本信息,我們可以在起初添加新的屬性,並實現他的 get 和 set 方法。 
Marker.LARGE :定義標記顯示圖片和陰影圖片。 
ExttoolsWidget.js 擴展工具類 
SliderWidget :滑塊工具 參數: model ( MapModel 對象)。 
    定義滑塊工具和點擊放大 / 縮小時觸發事件 
sliderMDown :滑塊拖動 
    實現在地圖上按住鼠標左鍵可以拖動地圖。 
MarkerWidget : 標記定義 
    實現對標記信息的添加,對標記信息窗口的顯示和隱藏。 
    有以下方法: 
addMarker :在地圖上添加一個標記圖片和陰影圖片,並給該標記添加觸發事 件。我們可以對此方法進行改寫。 
    showInfoWindow : 顯示標記信息顯示窗口。可以對此方法進行改寫 
    hideInfoWindown :隱藏標記信息顯示窗口。 
MapTypeWidget :地圖類型定義。可以定義多個不同類型的地圖信息。 
  
MapPaneWidget.js 地圖面板控制,注冊了地圖的移動,縮放,類型改變和自定義方法事件。定義了地圖的輸出方法。 
Paint :地圖界面繪制方法。 
設置地圖容器的 style 屬性,屏蔽右鍵和全選功能,添加地圖移動工具欄,地圖類型切換欄和地圖 div 。 
propertyChange :監聽地圖觸發事件。 
實現了對地圖縮放( zoom ),移動( move ),用戶自定義事件( event.addlistener )和地圖類型變換( maptype )事件的控制。根據不同的事件名來進行對應的處理操作。 
customEvent :用戶自定義事件。 
可以在此處添加用戶自定義的事件。 
changeMaptype :地圖類型改變方法。 
方法先移除就的瓦片集合,然后根據新的地圖類型來重繪顯示的地圖。 paintMap ()地圖重繪方法。 
paintMap :地圖重繪方法。 
根據新的地圖 level ,和中心點位置。來取得所有要顯示的瓦片集合(即分割的小圖片),對新取得的集合循環輸出,在顯示的同時判斷該瓦片是否在舊的瓦片集合中存在,如果存在則不重新加載。 
mapMDown :地圖拖動方法。 
記錄地圖中心點的位移,拖動完成后重新輸出地圖。 
ToolsWidget.js   基本地圖工具,實現地圖的上,下,左,右移動和居中顯示。 
MapBuilder.js 地圖構建對象。 
加載地圖 js 腳本庫。實現地圖構建器,和地圖的輸出。 
Include :動態載入地圖 js 腳本庫文件,如果有新添加的 js 文件統一在此處加載。 
MapBuilder :地圖構建器,參數: container 為地圖容器。 
    定義地圖的基本信息,並為地圖添加相應的操作監聽事件。 
outputMap :地圖輸出。根據出入的中心點和地圖顯示 level 調用地圖的 print 方法來輸出地圖信息。 
addTool :添加地圖擴展工具,如滑塊工具和地圖類型變換工具。 
getMap :取得地圖對象。 
MapEvent.js 自定義事件控制 
getEventCoord :取得事件觸發的坐標點位置。 
addListener :添加用戶自定義事件監聽。 
MapEvent.CLICK :添加用戶自定義事件。 
    其他類功能說明,請參考對應的 api 文檔。 
    
地圖使用 
1.創建一個 jsp 或 html 頁面,在頁面添加地圖顯示 div 
< div align = "center" > 
    < div id = "newmap" style = "width:800px;height:400px; background :#F2F6FF" " ></ div > 
 </ div > 

2.導入初始化的 js 文件,樣式文件   
<!-- 加載樣式 --> 
    < link rel = "stylesheet" href = "webep/css/style.css" type = "text/css" >     
    <!-- 加載地圖生成 js 文件 --> 
    < script language = "JavaScript" src = "mapdemo/js/Util.js" ></ script > 
  < script language = "JavaScript" src = "mapdemo/js/map/MapBuilder.js" ></ script > 
  
3.自定義地圖類型,重寫 getsrc 方法,並把新的地圖類型添加到 MaoModel 的 mapTypes 中 
  // 定義自己的 map 類型 
  function MapMapType() { 
          // 繼承 maptype 
          MapType.apply( this ); 
          // 重寫 getSrc 方法 
          this .getSrc = function (level, row, column) { 
         var url = "mapdemo\\images\\zoom" +level+ "\\" +level+ "_" +column+ "_" +row+ ".jpg" ; 
                  return url; 
          } 
    } 
4.設置 MapModel 基本常量值 
    // 設置地圖顯示基本信息 
    /** 地圖坐標系范圍 */ 
    MapModel.bound = new Bound(-180e16, 180e16, -90e16, 90e16); 
    /** 第一個縮放等級的瓦片數 */ 
    MapModel.firstZoomTileNum = 1; 
    /** 每層縮放之間的比例參數 */ 
    MapModel.scalePara = 2; 
    /** 瓦片尺寸 */ 
    MapModel.tileSize = 256; 
    /** 最大縮放比例 */ 
  MapModel.maxZoomLevel = 4; 

5.定義地圖初始化對象,調用 outoutMap 方法輸出地圖,添加地圖縮放移動工具 
  // 初始化 mapbuilder 對象 
     var mymapbuilder = new MapBuilder($( "newmap" )); 
     // 輸出地圖信息 
  mymapbuilder.outputMap( new Point(10, -20), 3); 
  // 滑塊工具 
  mymapbuilder.addTool(MapBuilder.TOOL_SLIDERBAR); 
  
6.地圖類型切換工具   
  // 定義的第二個地圖類型 
    function MyType1() { 
    // 繼承 maptype 
    MapType.apply( this ); 
    
    // 添加地圖切換圖片 
    this .enablePic = imgBaseDir + "maptype_1b.gif" ; 
        this .disablePic = imgBaseDir + "maptype_1a.gif" ; 
        
    // 重寫 getSrc 方法 
    this .getSrc = function (level, row, column) { 
            var url = "mapdemo\\images\\zoom" +level+ "\\" +level+ "_" +row+ "_" +column+ ".jpg" ; 
           return url; 
        } 
    }   
  // 添加第二個地圖類型 
  MapModel.mapTypes.push( new MyType1());   
  // 地圖類型工具 
  mymapbuilder.addTool(MapBuilder.TOOL_MAPTYPE); 

7.添加 / 刪除標記 
添加標記: 
  // 添加一個標記 
  var newmark = new Marker( new Point(20,-20),Marker.LARGE); 
  newmark.setInfo( " 您添加了一個新的標記 " ); 
  map.addOverlay(newmark); 
刪除標記: 
  Map.removeOverlay(mark); // 刪除指定標記信息 

8.添加自定義方法 
在 ExtToolsWidget.js 中 addMarker 方法中,可以為標注添加自定義的事件

 

店名:
  小魚尼莫手工飾品店
經營:
  發飾、頭花、發夾、耳環等(手工制作)
網店:
  http://shop117066935.taobao.com/


免責聲明!

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



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