Changes between Version 5 and Version 6 of oid/WorkLog/08-09-19


Ignore:
Timestamp:
Sep 19, 2008, 2:55:27 PM (16 years ago)
Author:
jazz
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • oid/WorkLog/08-09-19

    v5 v6  
    1414== 解析網站原始碼 ==
    1515
    16  * 參考 http://deepsea.biodiv.tw/locamapd.asp
     16 * 參考 http://deepsea.biodiv.tw/locamapd.asp (PART 1)
    1717{{{
    1818#!java
    19  function load() {
    20    PassValue();
    21    if (GBrowserIsCompatible()) {
     19  function load() {
     20    PassValue();                                             // 解析 URL 中帶的參數
     21    if (GBrowserIsCompatible()) {
    2222      var map = new GMap2(document.getElementById("map"));  // 取得 DOM 中,名稱為 map 的元件
    2323      map.addControl(new GLargeMapControl());               // 加入左上角比例尺規控制列
     
    2525      map.setCenter(new GLatLng(23.8,121), 7);              // 設定預設經緯度北緯 23.8, 東經 121, 預設比例尺 100 公里(7)
    2626      map.setMapType(G_SATELLITE_MAP);                      // 設定預設底圖為"衛星"
    27    }
     27    }
    2828}}}
    2929 * 我們把 function load() 裡面的程式加進 HTML 範例中, 就可以得到[http://trac.nchc.org.tw/googlemap1.html 第二個成果]囉 :)[[BR]]
     
    3333      map.addControl(new GScaleControl());                  // 加入左下角比例尺狀態列
    3434}}}
    35  * 繼續解析 http://deepsea.biodiv.tw/locamapd.asp
     35 * 繼續解析 http://deepsea.biodiv.tw/locamapd.asp (PART 2)
    3636{{{
    3737#!java
    38  var request = GXmlHttp.create();                           // 產生一個非同步的 AJAX XMLHttp 物件
    39  if (queryPair[0]=='R1') {
    40    var GetDataXml="getdeepstaxml.asp?" + queryPair[0] + "=" + valuePair[0] + "&" + queryPair[1] + "=" + valuePair[1];
    41  }
    42  else {
    43   var GetDataXml="getdeepstaxml.asp";                      // 預設因為 queryPair[0] 是空的, 所以資料來源來自 getdeepstaxml.asp
    44  }
    45 request.open("GET",GetDataXml, true);                      // 用 XMLHttp 物件去開啟 http://deepsea.biodiv.tw/getdeepstaxml.asp
     38  var request = GXmlHttp.create();                          // 產生一個非同步的 AJAX XMLHttp 物件 (Jazz: 好簡單的一行 AJAX 啊!!)
     39  if (queryPair[0]=='R1') {                                 // 這段是用在對應"物種統計"與"科別統計"的 URL 解析上
     40    var GetDataXml="getdeepstaxml.asp?" + queryPair[0] + "=" + valuePair[0] + "&" + queryPair[1] + "=" + valuePair[1];
     41  }
     42  else {
     43    var GetDataXml="getdeepstaxml.asp";                     // 預設因為 queryPair[0] 是空的, 所以資料來源來自 getdeepstaxml.asp
     44  }
     45  request.open("GET",GetDataXml, true);                     // 用 XMLHttp 物件去開啟 http://deepsea.biodiv.tw/getdeepstaxml.asp
    4646}}}
    4747 * 我們首先來看 http://deepsea.biodiv.tw/getdeepstaxml.asp 所回傳的 XML 資料
     48{{{
     49這是一筆 XML 紀錄
     50<marker lat1="24.8078" lng1="122.04" lat2="24.86533" lng2="122.04067" id="CD121" depth="471-531 m"/>
     51依格式看來 (lat1, lng1) 是起點, (lat2, lng2) 是終點, id 是測站代號, depth 是魚網打撈的水深範圍
     52}}}
    4853[[Image(biodiv_xml.jpg)]]
     54 * 繼續解析 http://deepsea.biodiv.tw/locamapd.asp (PART 3)
    4955{{{
    50 
    51 }}}
    52  *
    53 {{{
    54 request.onreadystatechange = function() {
    55   if (request.readyState == 4) {
    56     var xmlDoc = request.responseXML;
    57     var markers = xmlDoc.documentElement.getElementsByTagName("marker");
    58     for (var i = 0; i < markers.length; i++) {
    59       var points2 = [];
    60       points2.push(new GLatLng(parseFloat(markers[i].getAttribute("lat1")),parseFloat(markers[i].getAttribute("lng1"))))
    61       points2.push(new GLatLng(parseFloat(markers[i].getAttribute("lat2")),parseFloat(markers[i].getAttribute("lng2"))))
    62       map.addOverlay(new GPolyline(points2,'#FF0000',2,1));
    63       var lat=(parseFloat(markers[i].getAttribute("lat1"))+parseFloat(markers[i].getAttribute("lat2")))/2
    64       var lng=(parseFloat(markers[i].getAttribute("lng1"))+parseFloat(markers[i].getAttribute("lng2")))/2
    65 
    66       var point = new GLatLng(lat,lng
    67                              );
    68       var id=markers[i].getAttribute("id")                       
    69       var depth=markers[i].getAttribute("depth")                       
    70       var marker = createMarkerWithLnk(point,id,icon,depth);
    71       map.addOverlay(marker);
     56#!java
     57  request.onreadystatechange = function() {                // 定義 XMLHttp 有狀態改變的事件處理函數 callback function
     58    if (request.readyState == 4) {                         // XMLHttp 的狀態是 Ready (4) 繼續處理 Server 傳回的 XML 資料
     59      var xmlDoc = request.responseXML;                    // xmlDoc = 回傳的 XML 資料
     60      var markers = xmlDoc.documentElement.getElementsByTagName("marker"); // 取出名稱為 marker 的 xml 元件, 結果是陣列
     61      for (var i = 0; i < markers.length; i++) {
     62        var points2 = [];                                  // 宣告一個空的陣列 point2 來存起始與結束座標點
     63        // 把 lat1 跟 lng1 塞進起始座標點 GLatLng 物件
     64        points2.push(new GLatLng(parseFloat(markers[i].getAttribute("lat1")),parseFloat(markers[i].getAttribute("lng1"))))
     65        // 把 lat2 跟 lng2 塞進起始座標點 GLatLng 物件
     66        points2.push(new GLatLng(parseFloat(markers[i].getAttribute("lat2")),parseFloat(markers[i].getAttribute("lng2"))))
     67        // 用 point2 產生 GPolyline 物件,畫從 point2[2] 到 point2[1] 的線條
     68        // - 參考 http://code.google.com/apis/maps/documentation/reference.html#GPolyline
     69        // - GPolyline(座標點, 顏色, 線條粗細(pixel), 透明度(0: 反鋸齒, 1: 半透明))
     70        // 然後用 addOverlay 函數把線條疊到地圖上
     71        map.addOverlay(new GPolyline(points2,'#FF0000',2,1));
     72        // 計算起始與結束的中心位置座標點
     73        var lat=(parseFloat(markers[i].getAttribute("lat1"))+parseFloat(markers[i].getAttribute("lat2")))/2
     74        var lng=(parseFloat(markers[i].getAttribute("lng1"))+parseFloat(markers[i].getAttribute("lng2")))/2
     75        // 產生中點 GLatLng 座標物件
     76        var point = new GLatLng(lat,lng);
     77        // 取得 XML 資料中的測站名稱(id)與打撈深度(depth)
     78        var id=markers[i].getAttribute("id")                       
     79        var depth=markers[i].getAttribute("depth")
     80        // 呼叫自訂的 createMarkerWithLnk() 來產生一個具有連結的 Marker 物件
     81        // createMarkerWithLnk(中點座標位置,測站代號,自訂圖示,測站打撈深度)
     82        var marker = createMarkerWithLnk(point,id,icon,depth);
     83        // 把 Marker 物件貼上地圖
     84        map.addOverlay(marker);
     85      }
    7286    }
    7387  }
    74 }
    75 request.send(null);   
     88  request.send(null);                                      // 送出 XMLHttp 物件的要求
    7689}
    7790}}}
     91 * 繼續解析 http://deepsea.biodiv.tw/locamapd.asp (PART 4) - 自訂的 createMarkerWithLnk() 函數
     92{{{
     93  function createMarkerWithLnk(point,id,icon,depth) {
     94    var urlstr= id + " Depth:" + depth;
     95    var url="species.asp?id=" + id;
     96    var marker = new GMarker(point,{icon:icon, clickable:true,title:urlstr});
     97    GEvent.addListener(marker, "click", function() {location.href=url});
     98    return marker;
     99  }
     100}}}