使用GeoJSON資料結合D3.js工具開發

使用GeoJSON資料結合D3.js工具開發

 

由於具有空間資訊的統計資料日益增加,繪製此類資料的需求也增加,故在本範例中,我們將預設使用
自行上傳之自有多邊形坐標統計資料,搭配統計地圖的面量圖,並配合客製化的面量圖顏色設定、統計
資料欄位設定等參數來建立功能選單介面。

此外,近年來第三方工具的開發亦十分成熟,故在本範例中,同時將示範將第三方工具繪製好的統計圖
表,套疊於互動式圖台。您可以直接將本範例複製至您的網站伺服器,再修改使用的統計資料項目或統
計地圖/圖表類型即可快速建立一個頁面。

 

資料匯入部分:

使用者自行上傳之統計資料,需為GeoJSON格式。為了方便使用者將手邊資料轉換為可上傳之格式,
本範例提供轉檔程式(ExcelToText_Statistics.exe),讓使用者將統計區、行政區、機構別(XY點位)以及自
有多邊形(Polygon Multipolygon)的資料,依照特定格式整理成excel檔案(.xls.xlsx),進行轉檔。
其自有多邊形(Polygon Multipolygon坐標資料)之格式定義說明如下:  
        

     

1. 資料檔案須包含一個EXCEL檔以及文字檔,分別記載統計相關資料與多邊形的座標資訊。

2. EXCEL資料檔案包含兩個必要頁籤及一個非必要頁籤,依序命名為:「stat_data」、「field_info」及
properties_data」,代表統計資料、欄位說明及資料描述。

3. field_info」頁籤欄位包含:「f_id(欄位代碼)」、「f_name(欄位名稱)」及「unit(單位)」,往  下則
依照原始統計資料的內容,依序填寫該資料的各個統計欄位資訊。

4. stat_data」頁籤包含的欄位為:「code(多邊形代碼)」、「name」、「time(資料時間)」及
field_info」頁籤所提及的欄位,欄位名稱需為英文小寫否則程式無法判斷,而欄位順序則無限制。

5. 若為多時期之統計資料,可重複填寫相同的多邊形代碼、名稱及註記內容,接著在「time」欄位中輸
入不同時間以作為不同時期的區隔。

6. 針對多邊形的描述,可記載於「propertices_data」裡,頁籤內之必填欄位為「code」或「name」,以此
來與「stat_data」關聯,其他欄位則為對資料的額外描述性說明,其
欄位名稱需為英文小寫否則程式無法
判斷,而欄位順序則無限制。

7. 記錄座標的文字檔命名為:「coordinate.txt」,須包含「code」、「name」及「coordinate」,「code
」或「name」用來與「stat_data」關聯,「coordinate」的文字記載方式依循WKT格式,可分析的資料類
型包含polygonmultipolygon



版型設定部分:

所有進階範例的版型皆以CSS文件(sample.css)進行設定,其詳細說明可參考進階範例「自應用資料庫繪
製地圖及圖表」
中的使用資料服務平台統計資料。使用者可透過修改此檔案來更改範例 版型中各個區
塊的 樣式設定。



網頁設計部分:

本範例呈現左側資料設定區域與右側結果展示區域。所有可供網頁使用者進行操作的選單,都以下拉選單
的方式於左側呈現,例如在統計參數設定中選擇分級法時,您可自行選擇想要之分級方
法及分級數等項目,僅須確認選項的
value值必須填入正確之數值即可。

而在統計資料設定部分中,此範例之資料來源為匯入自有統計資料之GeoJSON檔案,因此其相關之統計
時間與統計欄位皆需設定,繪製之統計分級符號圖僅可設定單一欄位進行繪製,請確認統計欄為屬於上一
步驟之資料表,並將選項的
value值填入正確的欄位代碼。

<td class="items_content">自有多邊形資料:</td>

       <td><ahref="https://segisapi.moi.gov.tw/statapi/sample/threepackage.json"target="_blank">自有多邊形資料.json </a>
        </
td>

        <td class="items_content">主題選擇:</td>

         <td>

         <select id="sTable" class="items_selectOption" disabled>

        < option value="https://segisapi.moi.gov.tw/statapi/sample/threepackage.json">水庫資料統計</option></select>

        </td>

         <td class="items_content">統計時間:</td>         

         <td>

                  <select id="sTime" class="items_selectOption"disabled>

                             <option value="104Y">104</option>        

                  </select>

         </td>

       </tr>

       <tr>

          <td class="items_content" valign="top">使用統計欄位:</td>   

          <td>

                  <select id="sField" size="1" >

                             <option value="DesignedCapacity">設計總容量</option>    

                             <option value="DesignedEffectiveCapacity">設計有效容量</option>    

                             <option value="ReservoirSedimentationVolume">淤積量</option>    

                             <option value="CurruntCapacity">目前總容量</option>    

                             <option value="CurruntEffectiveCapacity" >目前有效容量</option>    

                      </select

     </td>

程式設計部分:

當網頁使用者點擊「繪製統計地圖」按鈕時,程式端即進入function drawStatMap( )內進行一系列的動作,
包含從網頁介面取得各種資料設定、繪圖參數設定等等,再將所有設定套入統計地
 圖物件設定內容後進
行統計地圖繪製作業,最後將互動式介面輸出至網頁的展示區域內,並寫出
 所需的統計資訊。

function drawStatMap() {       //統計地圖繪製

      setStatData(myMap.getStatData());          //設定統計資料

      var mapOpts = myMap.getMapOptions();     //取得統計地圖參數設定

      mapOpts.pSymbol. classifyMethod= document.getElementById("pClassify").value;            //重新設定分級方式

         mapOpts.pSymbol. classes =parseInt(document.getElementById("pClassesCount").value);     //重新設定分級數

         if (document.getElementById("pClassify").value == ClassifyMethod.USER_DEFINED){

            if(document.getElementById("pClassesCount_Self").value == "") {

                    alert("自訂區間必須填入值");

                            return;

            } else {

                    mapOpts.pSymbol.userLevels = document.getElementById("pClassesCount_Self").value.split(",");

            }

   }

 div_mask (true);

      document.getElementById("mapView").style.display ="";

      document.getElementById("chartView").style.display ="none";

         mapChoropleth.classifyMethod = document.getElementById("pClassify").value //設定分級方法

         mapChoropleth.classes = parseInt(document.getElementById("pClassesCount").value);

         mapChoropleth.color = {

                 maxColor: "#EA4A1E",

                 minColor: "#F9D6CC",

             };            

          var color = document.getElementById("fillColor").value;

             if (color.trim() != '')

                 mapChoropleth.color = color.split(',');     //設定符號填色

          mapOpts.exportImage = true;

          mapOpts.pChoropleth = mapChoropleth;  // mapChoropleth 的值給mapOpts.pChoropleth

          myMap.setStatData(dataOwn);                //統計地圖參數設定

          myMap.setMapKind(MapKind.CHOROPLETH);

          myMap.setMapOptions(mapOpts);

          myMap.drawMap(function (result) {               //繪製統計地圖

          if (result.status === ServiceStatus.OK)

                     putInfomation(result);          //寫出統計資訊及圖例資訊

             div_mask(false);                //結束遮罩

             });

         }

  由於網路上開源的第三方套件的種類繁多,在資料格式上會因為需要的資料種類或形式有所不同,故
  用者可利用GeoJSON檔調整成套件需要的格式,關於本範例針對套件資料的格式轉換可於下載程式
  碼中取得,轉換方式於此不多加說明。
  當
網頁使用者點擊「繪製統計圖表」按鈕時,同樣程式即進入function drawStatChart( )內執行利
  用change Three,取得第三方套件的繪製成果,並將成果輸出至展示區域內。

function drawStatChart() {     

      changeThree('geojson_2');      //載入第三方套件

      document.getElementById("chartViewContainer").style.display = '';

      }

    function changeThree(src) {

   document.getElementById("chartView").innerHTML = '<iframe frameborder="0" id="three1" src="http://segisapi.moi.gov.tw/STAT_API_SAMPLE/' + src + '.html" width="100%" height="100%"></iframe>'}           //設定第三方套件之來源

 

 

回到上方