google-code-prettify

星期一, 2月 09, 2015

[ArcGIS Server API for JavaScript] 地圖中加入地圖瀏覽工具 navigation tools


繼上次案件 [ArcGIS Server API for JavaScript] 地圖中加入鷹眼圖 Overview 後,接下來的案件是 地圖瀏覽工具 navigation tools

口白:
流動的水沒有形狀,漂流的風找不到蹤跡,任何案件的 Coding 都取決於心
唯一看透真相的是,外表看似卜朧共,智慧卻低於常人的 名卜朧共 刻爛
(謎之音:把 Code 刻到爛簡稱刻爛)
Music:
#表升半音 []表高八度
4 3 2 6 4 2 3 #6 6 5 4 5 4 5 6 4 3 2 5 4 3 4 2 6 4 5 [2] [1] #6 6 5 6
4 3 2 6 4 2 3 #6 6 5 4 5 4 5 6 4 3 2 4 3 2 4 2 6 4 5 [2] #6 6 5 6
口白:
刻爛:真相只有一個!

延續了前篇 [ArcGIS Server API for JavaScript] 地圖中加入鷹眼圖 Overview
這次是在這篇的基礎上加入了,地圖瀏覽工具 navigation tools

Html:
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no">
    <link href="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css" rel="stylesheet" type="text/css"></link>
    <script src="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js" type="text/javascript">
    </script>
    <title>Map navigation tools</title>
    <link rel="stylesheet" href="http://js.arcgis.com/3.12/dijit/themes/claro/claro.css">
    <link rel="stylesheet" href="http://js.arcgis.com/3.12/esri/css/esri.css">    
    <script src="http://js.arcgis.com/3.12/"></script>
  </head>
  <body class="claro" expr:class='&quot;loading&quot; + data:blog.mobileClass' onload='prettyPrint();'>
    <!-- MenuBar div#navMenu -->
    <div data-dojo-type="dijit/MenuBar" id="navMenu">
      <div data-dojo-type="dijit/PopupMenuBarItem">
        <span>地圖</span>
        <div data-dojo-type="dijit/DropDownMenu" id="mapMenu">
          <div data-dojo-type="dijit/MenuItem" data-dojo-props="onClick:function(){alert('地圖操作')}">地圖操作</div>
        </div>
      </div>
    </div>
    <!-- MenuBar div#navMenu -->

    <div id="navToolbar" data-dojo-type="dijit/Toolbar" class="NavToolBar">
      <div data-dojo-type="dijit/form/Button" id="zoomin"  data-dojo-props="iconClass:'zoominIcon'">Zoom In</div>
      <div data-dojo-type="dijit/form/Button" id="zoomout" data-dojo-props="iconClass:'zoomoutIcon'">Zoom Out</div>
      <div data-dojo-type="dijit/form/Button" id="zoomfullext" data-dojo-props="iconClass:'zoomfullextIcon'">Full Extent</div>
      <div data-dojo-type="dijit/form/Button" id="zoomprev" data-dojo-props="iconClass:'zoomprevIcon'">Prev Extent</div>
      <div data-dojo-type="dijit/form/Button" id="zoomnext" data-dojo-props="iconClass:'zoomnextIcon'">Next Extent</div>
      <div data-dojo-type="dijit/form/Button" id="pan" data-dojo-props="iconClass:'panIcon'">Pan</div>
      <div data-dojo-type="dijit/form/Button" id="deactivate" data-dojo-props="iconClass:'deactivateIcon'">Deactivate</div>
    </div>

    <div id="mapDiv" 
         data-dojo-type="dijit/layout/ContentPane" 
         data-dojo-props="region:'center'" 
         style="padding:0">
    </div>

  </body>
</html>
說明:
1. 引用 CSS:claro.css、esri.css 引用參考位置如下:
   <link rel="stylesheet" href="http://js.arcgis.com/3.12/dijit/themes/claro/claro.css">
   <link rel="stylesheet" href="http://js.arcgis.com/3.12/esri/css/esri.css">  為了中文化排版被擠壓 修改 CSS

2. 引用 Javascript 需插入  <script src="http://js.arcgis.com/3.12/"></script> 其中已包含了Dojo框架囉

3. <body> 標籤中 加入 class 樣式定義為 "claro" 如: <body class="claro">

4. 加入 div 區塊 當作 MenuBar,如:<div data-dojo-type="dijit/MenuBar" id="navMenu"></div>

5. 加入 div 區塊 當作 PopupMenuBarItem,將該物件放在 MenuBar Div 區塊內 如:
   <div data-dojo-type="dijit/PopupMenuBarItem">
   </div>
   給該選單名稱,則是在 PopupMenuBarItem div 區塊 內加入 <span>地圖</span> 來定義
   加入 div 區塊 當作 DropDownMenu,將該物件放在 PopupMenuBarItem Div 區塊內 如:
   <div data-dojo-type="dijit/DropDownMenu" id="mapMenu">
   </div>
   加入 div 區塊 當作 MenuItem,將該物件放在 DropDownMenu Div 區塊內 如:
   <div data-dojo-type="dijit/MenuItem" data-dojo-props="onClick:function(){alert('地圖操作')}">地圖操作</div>

6. 加入 div 區塊 當作 dijit/Toolbar 容器,並將 dijit/form/Button 物件放在 navToolbar Div 區塊內 如:
   <div id="navToolbar" data-dojo-type="dijit/Toolbar" class="NavToolBar">
     <div data-dojo-type="dijit/form/Button" id="zoomin"  data-dojo-props="iconClass:'zoominIcon'">Zoom In</div>
   ...略....
   </div>

7. 加入 div 區塊 當作地圖區塊,如:<div id="mapDiv"></div>

CSS:
.esriScalebarLabel.esriScalebarLineLabel.esriScalebarSecondNumber {
  font-size: 11px;
  position: absolute;
  width: 50%;
  text-align: center;
  color: #666666;
  font: Verdana;
  font-weight: bolder;
  height: 5px;
  top: -1px;
}
html, body, #mapDiv {
  padding: 0;
  margin: 0;
  height: 100%;
}
.zoominIcon 
{
  background-image: url(http://developers.arcgis.com/javascript/samples/toolbar_navigation/images/nav_zoomin.png);
  width: 16px;
  height: 16px;
}

.zoomoutIcon 
{
  background-image: url(http://developers.arcgis.com/javascript/samples/toolbar_navigation/images/nav_zoomout.png);
  width: 16px;
  height: 16px;
}

.zoomfullextIcon 
{
  background-image: url(http://developers.arcgis.com/javascript/samples/toolbar_navigation/images/nav_fullextent.png);
  width: 16px;
  height: 16px;
}

.zoomprevIcon 
{
  background-image: url(http://developers.arcgis.com/javascript/samples/toolbar_navigation/images/nav_previous.png);
  width: 16px;
  height: 16px;
}

.zoomnextIcon 
{ 
  background-image: url(http://developers.arcgis.com/javascript/samples/toolbar_navigation/images/nav_next.png);
  width: 16px;
  height: 16px;
}

.panIcon 
{
  background-image: url(http://developers.arcgis.com/javascript/samples/toolbar_navigation/images/nav_pan.png);
  width: 16px;
  height: 16px;
}

.deactivateIcon 
{
  background-image: url(http://developers.arcgis.com/javascript/samples/toolbar_navigation/images/nav_decline.png);
  width: 16px;
  height: 16px;
}
.NavToolBar 
{
  width: 120px; position: absolute; z-index: 999; height: auto; top: 60px; right: 50px;
}
說明:
1. 定義 mapDiv 區塊的 CSS 樣式
2. 中文化 排版被擠壓 .esriScalebarLabel.esriScalebarLineLabel.esriScalebarSecondNumber 調整width 改成 50%
3. 定義 zoominIcon、zoomoutIcon、zoomfullextIcon、zoomprevIcon、zoomnextIcon、panIcon、deactivateIcon、NavToolBar 樣式,其中包含工具圖示

JavaScript:
var map;
require([
  "esri/map",
  "dojo/parser",

  // Modules referenced by the parser
  "dijit/DropDownMenu",
  "dijit/MenuBar",
  "dijit/MenuBarItem",
  "dijit/MenuItem",
  "dijit/PopupMenuBarItem",

  "esri/dijit/OverviewMap", // 加入 Overview Package 
  "esri/dijit/Scalebar",    // 加入 Scalebar Package 

  // navigation ToolBar 會使用到的模組 
  // "dojo/parser", navigation ToolBar 會使用到的模組 也會使用到前面已經宣告過就不重覆載入
  "esri/toolbars/navigation",
  "dojo/on",
  "dijit/registry",
  "dijit/Toolbar",              // 因為本身並沒有針對對應物件操作,故不設定 載入對應 變數
  "dijit/form/Button",          // 因為本身並沒有針對對應物件操作,故不設定 載入對應 變數
  // navigation ToolBar 會使用到的模組 

  "dojo/domReady!"
], function (
  Map,
  parser,

  DropDownMenu,
  MenuBar,
  MenuBarItem,
  MenuItem,
  PopupMenuBarItem,

  OverviewMap,   // 加入 OverviewMap 承接 對應 "esri/dijit/OverviewMap" OverviewMap Package  變數
  Scalebar,      // 加入 Scalebar 承接 對應 "esri/dijit/Scalebar" Scalebar Package  變數

  // navigation ToolBar 會使用到的模組 對應變數
  // parser,, navigation ToolBar 會使用到的模組 也會使用到,前面已經宣告過就不重覆載入
  Navigation,
  on,        
  registry        
  // navigation ToolBar 會使用到的模組 對應變數 

  )
{
  parser.parse();

  var navToolbar;

  // 中文化 S
  esri.bundle.widgets.scalebar = { ft: "英呎", km: "公里", mi: "英里", m: "公尺" }; // 目前無作用
  window.esri.dijit.Scalebar.prototype.localStrings.km = '公里';
  window.esri.dijit.Scalebar.prototype.localStrings.m = '公尺';
  window.esri.dijit.Scalebar.prototype.localStrings.mi = '英里';
  window.esri.dijit.Scalebar.prototype.localStrings.ft = '英呎';
  /*
  esri.css 
  修改 .esriScalebarLabel.esriScalebarLineLabel.esriScalebarSecondNumber 
  width:10% 改 width:50%
  */
  //console.log(esri.bundle.widgets.scalebar);
  // 中文化 E

  map = new Map("mapDiv",
    {
      center: [121, 23.5],
      zoom: 8,
      basemap: "streets"
    });

  // 加入 OverviewMap 地圖上顯示鷹眼 開始
  var overviewMapDijit = new OverviewMap({
    map: map,
    attachTo: "bottom-right",
    visible: true
  });
  overviewMapDijit.startup();
  // 加入 OverviewMap 地圖上顯示鷹眼 結束

  // 加入 scalebar 地圖上顯示比例尺 開始
  var scalebar = new Scalebar({
    map: map,
    // "dual" displays both miles and kilmometers
    // "english" is the default, which displays miles
    // use "metric" for kilometers
    scalebarUnit: "dual"
  });
  scalebar.hide();
  scalebar.show();
  // 加入 scalebar 地圖上顯示比例尺 結束

  navToolbar = new Navigation(map);
  on(navToolbar, "onExtentHistoryChange", extentHistoryChangeHandler);

  registry.byId("zoomin").on("click", function () {
    navToolbar.activate(Navigation.ZOOM_IN);
  });

  registry.byId("zoomout").on("click", function () {
    navToolbar.activate(Navigation.ZOOM_OUT);
  });

  registry.byId("zoomfullext").on("click", function () {
    navToolbar.zoomToFullExtent();
  });

  registry.byId("zoomprev").on("click", function () {
    navToolbar.zoomToPrevExtent();
  });

  registry.byId("zoomnext").on("click", function () {
    navToolbar.zoomToNextExtent();
  });

  registry.byId("pan").on("click", function () {
    navToolbar.activate(Navigation.PAN);
  });

  registry.byId("deactivate").on("click", function () {
    navToolbar.deactivate();
  });

  function extentHistoryChangeHandler () {
    registry.byId("zoomprev").disabled = navToolbar.isFirstExtent();
    registry.byId("zoomnext").disabled = navToolbar.isLastExtent();
  }

});
說明:
1. 定義 弱型別的變數 map
   .require 是 Dojo 方法,利用該方法,
   載入 esri/map、dojo/parser、dijit/DropDownMenu、MenuBar、MenuBarItem、MenuItem、PopupMenuBarItem、esri/dijit/Scalebar、dojo/domReady! 
   Navigation 瀏覽工具 需用到的模組 esri/toolbars/navigation,dojo/on,dijit/registry,
   Navigation 瀏覽工具 也需要 dojo/parser (載入模組不需重複載入)
   而 dijit/Toolbar,dijit/form/Button,因為本身並沒有針對對應物件操作,故不設定 載入對應 變數
   根據 Dojo API 參考文件來說,
   載入模組後,需用一個 變數來接收該模組,以便於操作 
   例如 function(Map) {}  用一個 拋棄式的函數,
   裡面定義變數: Map、parser、DropDownMenu、MenuBar、MenuBarItem、MenuItem、PopupMenuBarItem、Scalebar,
   Navigation 定義對應變數: Navigation、on、registry。

2. function(Map...略...) {}  用一個 拋棄式的函數 裡面定義 map 變數,
   透過傳入的 Map 類別可以 宣告成一個 esri/map 的物件,其他載入的亦同方式
   parser.parse() 主要是將 dom 轉換成 dijit 物件或是 widget
   (new Map 宣告方法 就要查 https://developers.arcgis.com/javascript/jsapi/map-amd.html )
   定義 弱型別的變數 overviewMapDijit  並將他 建立成 esri/dijit/OverviewMap 物件
   (new overviewMapDijit 宣告方法 就要查 https://developers.arcgis.com/javascript/jsapi/overviewmap-amd.html" )
   widget overviewmap 範例 
   定義 弱型別的變數 scalebar 並將他 建立成 esri/dijit/Scalebar 物件
   (new Scalebar 宣告方法 就要查 https://developers.arcgis.com/javascript/jsapi/scalebar-amd.html )
   widget scalebar 範例 
   定義 弱型別的變數 navToolbar  並將他 建立成 esri/toolbars/navigation 模組 Navigation 物件
   (new navToolbar 宣告方法 就要查 https://developers.arcgis.com/javascript/jsapi/navigation-amd.html )
   widget navToolbar 範例 
   on 是 Dojo 模組 dojo/on 的事件監測方法,利用該方法,捕捉操作事件
   (on 宣告方法 就要查 http://dojotoolkit.org/api/?qs=1.10/dojo/on )
   target 的 DOM 是 navToolbar,type 用來偵聽或擴展事件類型 onExtentHistoryChange,listener 發生事件所呼叫的函數 extentHistoryChangeHandler
   函數 extentHistoryChangeHandler 內,註冊防呆機制,確保在第一筆與最後一筆時不作動!
   registry 是 Dojo 模組 dijit/registry 的事件註冊方法,利用該方法,擴展操作事件
   (registry 宣告方法 就要查 registry  宣告方法 就要查 http://dojotoolkit.org/api/?qs=1.10/http://dojotoolkit.org/api/?qs=1.10/dijit/registry
JSBin Demo(http://goo.gl/QKMFWR)

參考文獻︰
navToolbar
widget navToolbar 範例
on
registry

星期四, 2月 05, 2015

[ArcGIS Server API for JavaScript] 地圖中加入鷹眼圖 Overview


上萹介紹了 [ArcGIS Server API for JavaScript] 地圖中加入比例尺 Scalebar 與中文化,接下來介紹鷹眼圖 overviewMap 吧,

口白:
流動的水沒有形狀,漂流的風找不到蹤跡,任何案件的 Coding 都取決於心
唯一看透真相的是,外表看是卜朧共,智慧卻低於常人的 名卜朧共 刻爛
(謎之音:把 Code 刻到爛簡稱刻爛)
Music:
#表升半音 []表高八度
4 3 2 6 4 2 3 #6 6 5 4 5 4 5 6 4 3 2 5 4 3 4 2 6 4 5 [2] [1] #6 6 5 6
4 3 2 6 4 2 3 #6 6 5 4 5 4 5 6 4 3 2 4 3 2 4 2 6 4 5 [2] #6 6 5 6
口白:
刻爛:真相只有一個!

延續了前篇 [ArcGIS Server API for JavaScript] 地圖中加入比例尺 Scalebar 與中文化 ,
這次是在這篇的基礎上加入了 Overview

Html:
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no">
    <link href="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css" rel="stylesheet" type="text/css"></link>
    <script src="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js" type="text/javascript">
    </script>
    <title>Map with Overview</title>
    <link rel="stylesheet" href="http://js.arcgis.com/3.12/dijit/themes/claro/claro.css">
    <link rel="stylesheet" href="http://js.arcgis.com/3.12/esri/css/esri.css">    
    <script src="http://js.arcgis.com/3.12/"></script>
  </head>
  <body class="claro" expr:class='&quot;loading&quot; + data:blog.mobileClass' onload='prettyPrint();'>
    <!-- MenuBar div#navMenu -->
    <div data-dojo-type="dijit/MenuBar" id="navMenu">
      <div data-dojo-type="dijit/PopupMenuBarItem">
        <span>地圖</span>
        <div data-dojo-type="dijit/DropDownMenu" id="mapMenu">
          <div data-dojo-type="dijit/MenuItem" data-dojo-props="onClick:function(){alert('地圖操作')}">地圖操作</div>
        </div>
      </div>
    </div>
    <!-- MenuBar div#navMenu -->

    <div data-dojo-type="dijit/layout/BorderContainer" 
         data-dojo-props="design:'headline', gutters:false" 
         style="width: 100%; height: 97%; margin:0; ">

      <div id="mapDiv" 
           data-dojo-type="dijit/layout/ContentPane" 
           data-dojo-props="region:'center'" 
           style="padding:0">
      </div>
    </div>
  </body>
</html>
說明:
1. 引用 CSS:claro.css、esri.css 引用參考位置如下:
   <link rel="stylesheet" href="http://js.arcgis.com/3.12/dijit/themes/claro/claro.css">
   <link rel="stylesheet" href="http://js.arcgis.com/3.12/esri/css/esri.css">  為了中文化排版被擠壓 修改 CSS

2. 引用 Javascript 需插入  <script src="http://js.arcgis.com/3.12/"></script> 其中已包含了Dojo框架囉

3. <body> 標籤中 加入 class 樣式定義為 "claro" 如: <body class="claro">

4. 加入 div 區塊 當作 MenuBar,如:<div data-dojo-type="dijit/MenuBar" id="navMenu"></div>

5. 加入 div 區塊 當作 PopupMenuBarItem,將該物件放在 MenuBar Div 區塊內 如:
   <div data-dojo-type="dijit/PopupMenuBarItem">
   </div>
   給該選單名稱,則是在 PopupMenuBarItem div 區塊 內加入 <span>地圖</span> 來定義
   加入 div 區塊 當作 DropDownMenu,將該物件放在 PopupMenuBarItem Div 區塊內 如:
   <div data-dojo-type="dijit/DropDownMenu" id="mapMenu">
   </div>
   加入 div 區塊 當作 MenuItem,將該物件放在 DropDownMenu Div 區塊內 如:
   <div data-dojo-type="dijit/MenuItem" data-dojo-props="onClick:function(){alert('地圖操作')}">地圖操作</div>

6. 加入 div 區塊 當作地圖區塊,如:<div id="mapDiv"></div>
      

CSS:
.esriScalebarLabel.esriScalebarLineLabel.esriScalebarSecondNumber {
  font-size: 11px;
  position: absolute;
  width: 50%;
  text-align: center;
  color: #666666;
  font: Verdana;
  font-weight: bolder;
  height: 5px;
  top: -1px;
}
html, body, #mapDiv {
  padding: 0;
  margin: 0;
  height: 100%;
}
      
說明:
1. 定義 mapDiv 區塊的 CSS 樣式
2. 中文化 排版被擠壓 .esriScalebarLabel.esriScalebarLineLabel.esriScalebarSecondNumber 調整width 改成 50%
      

JavaScript:
var map;
require([
  "esri/map",
  "dojo/parser",

  // Modules referenced by the parser
  "dijit/DropDownMenu",
  "dijit/MenuBar",
  "dijit/MenuBarItem",
  "dijit/MenuItem",
  "dijit/PopupMenuBarItem",

  "esri/dijit/OverviewMap", // 加入 Overview Package 
  "esri/dijit/Scalebar",    // 加入 Scalebar Package 

  "dojo/domReady!"
], function (
  Map,
  parser,

  DropDownMenu,
  MenuBar,
  MenuBarItem,
  MenuItem,
  PopupMenuBarItem,

  OverviewMap,  // 加入 OverviewMap 承接 對應 "esri/dijit/OverviewMap" OverviewMap Package  變數
  Scalebar      // 加入 Scalebar 承接 對應 "esri/dijit/Scalebar" Scalebar Package  變數

  )
{
  parser.parse();

  // 中文化 S
  //console.log(esri.bundle.widgets.scalebar);
  esri.bundle.widgets.scalebar = { ft: "英呎", km: "公里", mi: "英里", m: "公尺" }; // 目前無作用
  window.esri.dijit.Scalebar.prototype.localStrings.km = '公里';
  window.esri.dijit.Scalebar.prototype.localStrings.m = '公尺';
  window.esri.dijit.Scalebar.prototype.localStrings.mi = '英里';
  window.esri.dijit.Scalebar.prototype.localStrings.ft = '英呎';
  //console.log(domStyle.getComputedStyle(dojo.query('.esriScalebarLabel.esriScalebarLineLabel.esriScalebarSecondNumber')).width);
  //domStyle.set(dojo.query('.esriScalebarLabel.esriScalebarLineLabel.esriScalebarSecondNumber'), "width", "50%");
  /*
  esri.css 
  修改 .esriScalebarLabel.esriScalebarLineLabel.esriScalebarSecondNumber 
  width:10% 改 width:50%
  */
  //console.log(esri.bundle.widgets.scalebar);
  // 中文化 E

  map = new Map("mapDiv",
    {
      center: [121, 23.5],
      zoom: 8,
      basemap: "streets"
    });

  // 加入 OverviewMap 地圖上顯示鷹眼 開始
  var overviewMapDijit = new OverviewMap({
    map: map,
    attachTo: "bottom-right",
    visible: true
  });
  overviewMapDijit.startup();
  // 加入 OverviewMap 地圖上顯示鷹眼 結束

  // 加入 scalebar 地圖上顯示比例尺 開始
  var scalebar = new Scalebar({
    map: map,
    // "dual" displays both miles and kilmometers
    // "english" is the default, which displays miles
    // use "metric" for kilometers
    scalebarUnit: "dual"
  });
  scalebar.hide();
  scalebar.show();
  // 加入 scalebar 地圖上顯示比例尺 結束

});
說明:
1. 定義 弱型別的變數 map
   .require 是 Dojo 方法,利用該方法,
   載入 esri/map、dojo/parser、dijit/DropDownMenu、MenuBar、MenuBarItem、MenuItem、PopupMenuBarItem、esri/dijit/Scalebar、dojo/domReady! 
   根據 Dojo API 參考文件來說,
   / 之前的叫 The main packages of the Dojo Toolkit,
   / 之後的叫 Common modules and packages of the Dojo Toolkit,
   那就叫它為「模組」
   載入模組後,需用一個 變數來接收該模組,以便於操作 
   例如 function(Map) {}  用一個 拋棄式的函數,
   裡面定義變數: Map、parser、DropDownMenu、MenuBar、MenuBarItem、MenuItem、PopupMenuBarItem、Scalebar,
   該變數就被設成相對印的類別。

2. function(Map...略...) {}  用一個 拋棄式的函數 裡面定義 map 變數,
   透過傳入的 Map 類別可以 宣告成一個 esri/map 的物件,其他載入的亦同方式
   parser.parse() 主要是將 dom 轉換成 dijit 物件或是 widget
   (new Map 宣告方法 就要查 https://developers.arcgis.com/javascript/jsapi/map-amd.html )
   定義 弱型別的變數 overviewMapDijit  並將他 建立成 esri/dijit/OverviewMap 物件
   (new overview  宣告方法 就要查 https://developers.arcgis.com/javascript/jsapi/overviewmap-amd.html" )
   widget overviewmap 範例 )
new OverviewMap(params, srcNodeRef) 

   其中 params 包含的屬性有 attachTo、baseLayer、map、visible 先來間單說明一下,
   attachTo 是 Overview DOM 物件顯示位置設定 "top-right","bottom-right","bottom-left","top-left" 預設值為 "top-right",
   baseLayer 是 Overview DOM 物件顯示參考圖層設定,
   我們可以從一個 Map 物件中定義某一特定圖層作為 Overview 基本顯示圖層。
   map 是 Overview DOM 物件顯示參考 Map 設定。
   visible 屬性可以定義 Overview DOM 物件顯示與否。

   定義 弱型別的變數 scalebar 並將他 建立成 esri/dijit/Scalebar 物件
   (new Scalebar 宣告方法 就要查 https://developers.arcgis.com/javascript/jsapi/scalebar-amd.html )
   widget scalebar 範例 
JSBin Demo(http://goo.gl/WbXNXd)

參考文獻︰
overview
widget overviewmap 範例

星期一, 2月 02, 2015

[ArcGIS Server API for JavaScript] 地圖中加入比例尺 Scalebar 與中文化


上萹介紹了 ArcGIS Server for Javascript API Dojo 框架,接下來再回到 ESRI js 框架吧,

口白:
流動的水沒有形狀,漂流的風找不到蹤跡,任何案件的 Coding 都取決於心
唯一看透真相的是,外表看是卜朧共,智慧卻低於常人的 名卜朧共 刻爛
(謎之音:把 Code 刻到爛簡稱刻爛)

延續了前篇 [ArcGIS Server API for JavaScript] 利用 Dojo 框架建立功能選單 MenuBar ,
這次是在這篇的基礎上加入了 Scalebar

Html:
<!DOCTYPE html>
  <html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no">
    <link href="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css" rel="stylesheet" type="text/css"></link>
    <script src="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js" type="text/javascript">
    </script>
    <title>Map with MenuBar And scalebar</title>
    <link rel="stylesheet" href="http://js.arcgis.com/3.12/dijit/themes/claro/claro.css">
    <link rel="stylesheet" href="http://js.arcgis.com/3.12/esri/css/esri.css">
    <!--<link href="../../Content/esri.css" rel="stylesheet" />-->
    <script src="http://js.arcgis.com/3.12/"></script>
  </head>
  <body class="claro" expr:class='&quot;loading&quot; + data:blog.mobileClass' onload='prettyPrint();'>
    <!-- MenuBar div#navMenu -->
    <div data-dojo-type="dijit/MenuBar" id="navMenu">
      <div data-dojo-type="dijit/PopupMenuBarItem">
        <span>地圖</span>
        <div data-dojo-type="dijit/DropDownMenu" id="mapMenu">
          <div data-dojo-type="dijit/MenuItem" data-dojo-props="onClick:function(){alert('地圖操作')}">地圖操作</div>
        </div>
      </div>
    </div>
    <!-- MenuBar div#navMenu -->

    <div id="mapDiv"></div>
  </body>
</html>
      
說明:
1. 引用 CSS:claro.css、esri.css 引用參考位置如下:
   <link rel="stylesheet" href="http://js.arcgis.com/3.12/dijit/themes/claro/claro.css">
   <link rel="stylesheet" href="http://js.arcgis.com/3.12/esri/css/esri.css">  為了中文化排版被擠壓 修改 CSS

2. 引用 Javascript 需插入  <script src="http://js.arcgis.com/3.12/"></script> 其中已包含了Dojo框架囉

3. <body> 標籤中 加入 class 樣式定義為 "claro" 如: <body class="claro">

4. 加入 div 區塊 當作 MenuBar,如:<div data-dojo-type="dijit/MenuBar" id="navMenu"></div>

5. 加入 div 區塊 當作 PopupMenuBarItem,將該物件放在 MenuBar Div 區塊內 如:
   <div data-dojo-type="dijit/PopupMenuBarItem">
   </div>
   給該選單名稱,則是在 PopupMenuBarItem div 區塊 內加入 <span>地圖</span> 來定義
   加入 div 區塊 當作 DropDownMenu,將該物件放在 PopupMenuBarItem Div 區塊內 如:
   <div data-dojo-type="dijit/DropDownMenu" id="mapMenu">
   </div>
   加入 div 區塊 當作 MenuItem,將該物件放在 DropDownMenu Div 區塊內 如:
   <div data-dojo-type="dijit/MenuItem" data-dojo-props="onClick:function(){alert('地圖操作')}">地圖操作</div>

6. 加入 div 區塊 當作地圖區塊,如:<div id="mapDiv"></div>
      

CSS:
.esriScalebarLabel.esriScalebarLineLabel.esriScalebarSecondNumber {
  font-size: 11px;
  position: absolute;
  width: 50%;
  text-align: center;
  color: #666666;
  font: Verdana;
  font-weight: bolder;
  height: 5px;
  top: -1px;
}
html, body, #mapDiv {
  padding: 0;
  margin: 0;
  height: 100%;
}
      
說明:
1. 定義 mapDiv 區塊的 CSS 樣式
2. 中文化 排版被擠壓 .esriScalebarLabel.esriScalebarLineLabel.esriScalebarSecondNumber 調整width 改成 50%
      

JavaScript:
var map;
require([
  "esri/map",
  "dojo/parser",

  // Modules referenced by the parser
  "dijit/DropDownMenu",
  "dijit/MenuBar",
  "dijit/MenuBarItem",
  "dijit/MenuItem",
  "dijit/PopupMenuBarItem",

  "esri/dijit/Scalebar", // 加入 Scalebar Package 

  "dojo/domReady!"
], function (
  Map,
  parser,

  DropDownMenu,
  MenuBar,
  MenuBarItem,
  MenuItem,
  PopupMenuBarItem,

  Scalebar // 加入 Scalebar 承接 對應 "esri/dijit/Scalebar" Scalebar Package  變數

  )
{
  parser.parse();

  // 中文化 S
  esri.bundle.widgets.scalebar = { ft: "英呎", km: "公里", mi: "英里", m: "公尺" }; // 目前無作用
  window.esri.dijit.Scalebar.prototype.localStrings.km = '公里';
  window.esri.dijit.Scalebar.prototype.localStrings.m = '公尺';
  window.esri.dijit.Scalebar.prototype.localStrings.mi = '英里';
  window.esri.dijit.Scalebar.prototype.localStrings.ft = '英呎';

  /*
  esri.css 
  修改 .esriScalebarLabel.esriScalebarLineLabel.esriScalebarSecondNumber 
  width:10% 改 width:50%
  */

  // 中文化 E

  map = new Map("mapDiv",
    {
      center: [121, 23],
      zoom: 8,
      basemap: "streets"
    });

  // 加入 scalebar 地圖上顯示比例尺 開始
  var scalebar = new Scalebar({
    map: map,
    // "dual" displays both miles and kilmometers
    // "english" is the default, which displays miles
    // use "metric" for kilometers
    scalebarUnit: "dual"
  });
  // 加入 scalebar 地圖上顯示比例尺 結束

});

      
說明:
1. 定義 弱型別的變數 map
   .require 是 Dojo 方法,利用該方法,
   載入 esri/map、dojo/parser、dijit/DropDownMenu、MenuBar、MenuBarItem、MenuItem、PopupMenuBarItem、esri/dijit/Scalebar、dojo/domReady! 
   根據 Dojo API 參考文件來說,
   / 之前的叫 The main packages of the Dojo Toolkit,
   / 之後的叫 Common modules and packages of the Dojo Toolkit,
   那就叫它為「模組」
   載入模組後,需用一個 變數來接收該模組,以便於操作 
   例如 function(Map) {}  用一個 拋棄式的函數,
   裡面定義變數: Map、parser、DropDownMenu、MenuBar、MenuBarItem、MenuItem、PopupMenuBarItem、Scalebar,
   該變數就被設成相對印的類別。

2. function(Map...略...) {}  用一個 拋棄式的函數 裡面定義 map 變數,
   透過傳入的 Map 類別可以 宣告成一個 esri/map 的物件,其他載入的亦同方式
   parser.parse() 主要是將 dom 轉換成 dijit 物件或是 widget
   (new Map 宣告方法 就要查 https://developers.arcgis.com/javascript/jsapi/map-amd.html )
   定義 弱型別的變數 scalebar 並將他 建立成 esri/dijit/Scalebar 物件
   (new Scalebar 宣告方法 就要查 https://developers.arcgis.com/javascript/jsapi/scalebar-amd.html )
   widget scalebar 範例 

3. 比例尺 Scalebar 與中文化,
   ESRI 對於繁體中文的中文化 是乎並沒有完成,甚至於簡體中文都只有翻了一部分,
   ESRI 語言支援部份可以從他的 API SDK 中找到,
    路徑是放在 arcgis_js_api\library\3.10\3.10\js\esri\nls\ 的 jsapi_*.js 中去定義的,
    層試著把 dojo 語系定義上去,但沒什麼差別,又懶的全部幫它翻譯,
    (搶救貧窮大作戰裡面的某位炸物大師曾經說過,給客人吃的都是些家常菜,還敢收錢!都不覺得可恥!)
    (反觀現在的便當!有些菜色都爛爛的!一個還要收好幾十塊!吃肉燥飯還覺得有特色一點說)
   生在這樣最糟糕的年代,也是最好的年代,只好自力救濟了!就逼著它顯示繁體中文吧!
   正常來說 是把 esri.bundle.widgets.scalebar  屬性裡的物件,
   置換成 { ft: "英呎", km: "公里", mi: "英里", m: "公尺" } 就完成了,
   但無作用(code沒寫完吧,因該是抱持著先求有再求好的 Coding 精神)
   因此我們改用另一個方式,
   正所謂兩軍交戰,我們為了不要造成傷亡我們可以先勸降
   勸降不成,我們可以逼他降
   逼降不成,我們可以打到他降
   (沒記錯是源自於康熙王朝,當時是要打台灣,康熙爺爺當時怎麼說的我就忘了)
   直接把 window.esri.dijit.Scalebar.prototype.localStrings 底下 km、m、ft、mi 的屬性改掉
   如:window.esri.dijit.Scalebar.prototype.localStrings.km = '公里';

      
JSBin Demo(http://goo.gl/lKrSva)

參考文獻︰
Scalebar
Scalebar Sample

[ArcGIS Server API for JavaScript] 利用 Dojo 框架建立功能選單 MenuBar


話說 ArcGIS Server for Javascript API ,主要包含了兩個部份,
其一是 ESRI 為了 ArcGIS Server 開發,Client 端瀏覽器操作的 API;
另一個部份是利用整合了 Dojo 框架,針對使用者操作界面的 API,既然是使用者操作界面的部份,則表示不一定要用它來開發,但是既然都內建了就用用吧!

口白:
流動的水沒有形狀,漂流的風找不到蹤跡,任何案件的 Coding 都取決於心
唯一看透真相的是,外表看是卜朧共,智慧卻低於常人的 名卜朧共 刻爛
(謎之音:把 Code 刻到爛簡稱刻爛)

延續了前篇 [ArcGIS Server API for JavaScript] 小刀牛試 Hello Map! ,
這次是在這篇的基礎上加入了 MenuBar

Html:
<!DOCTYPE html>
  <html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no">
    <link href="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css" rel="stylesheet" type="text/css"></link>
    <script src="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js" type="text/javascript">
    </script>
    <title>MenuBar</title>
    <link rel="stylesheet" href="http://js.arcgis.com/3.12/dijit/themes/claro/claro.css">
    <link rel="stylesheet" href="http://js.arcgis.com/3.12/esri/css/esri.css">
    <script src="http://js.arcgis.com/3.12/"></script>
  </head>
  <body class="claro" expr:class='&quot;loading&quot; + data:blog.mobileClass' onload='prettyPrint();'>
    <!-- MenuBar div#navMenu -->
    <div data-dojo-type="dijit/MenuBar" id="navMenu">
      <div data-dojo-type="dijit/PopupMenuBarItem">
        <span>地圖</span>
        <div data-dojo-type="dijit/DropDownMenu" id="mapMenu">
          <div data-dojo-type="dijit/MenuItem" data-dojo-props="onClick:function(){alert('地圖操作')}">地圖操作</div>
        </div>
      </div>
    </div>
    <!-- MenuBar div#navMenu -->
    <div id="mapDiv"></div>
  </body>
</html>
      
說明:
1. 引用 CSS:claro.css、esri.css 引用參考位置如下:
   <link rel="stylesheet" href="http://js.arcgis.com/3.12/dijit/themes/claro/claro.css">
   <link rel="stylesheet" href="http://js.arcgis.com/3.12/esri/css/esri.css">

2. 引用 Javascript 需插入  <script src="http://js.arcgis.com/3.12/"></script> 其中已包含了Dojo框架囉

3. <body> 標籤中 加入 class 樣式定義為 "claro" 如: <body class="claro">

4. 加入 div 區塊 當作 MenuBar,如:<div data-dojo-type="dijit/MenuBar" id="navMenu"></div>

5. 加入 div 區塊 當作 PopupMenuBarItem,將該物件放在 MenuBar Div 區塊內 如:
   <div data-dojo-type="dijit/PopupMenuBarItem">
   </div>
   給該選單名稱,則是在 PopupMenuBarItem div 區塊 內加入 <span>地圖</span> 來定義
   加入 div 區塊 當作 DropDownMenu,將該物件放在 PopupMenuBarItem Div 區塊內 如:
   <div data-dojo-type="dijit/DropDownMenu" id="mapMenu">
   </div>
   加入 div 區塊 當作 MenuItem,將該物件放在 DropDownMenu Div 區塊內 如:
   <div data-dojo-type="dijit/MenuItem" data-dojo-props="onClick:function(){alert('地圖操作')}">地圖操作</div>

6. 加入 div 區塊 當作地圖區塊,如:<div id="mapDiv"></div>
      

CSS:
      html, body, #map {
        height: 100%; width: 100%; margin: 0; padding: 0;
      }

說明:
 1. 定義 html、body、map 區塊的 CSS 樣式

JavaScript:
var map;
require([
  "esri/map",
  "dojo/parser",

  // Modules referenced by the parser
  "dijit/DropDownMenu",
  "dijit/MenuBar",
  "dijit/MenuBarItem",
  "dijit/MenuItem",
  "dijit/PopupMenuBarItem",

  "dojo/domReady!"
  ], function (
  Map,
  parser,

  DropDownMenu,
  MenuBar,
  MenuBarItem,
  MenuItem,
  PopupMenuBarItem

  ){
  parser.parse();

  map = new Map("mapDiv",
    {
      center: [121, 23.5],
      zoom: 8,
      basemap: "streets"
    });
});
      
說明:
1. 定義 弱型別的變數 map
   .require 是 Dojo 方法,利用該方法,
   載入 esri/map、dojo/parser、dijit/DropDownMenu、MenuBar、MenuBarItem、MenuItem、PopupMenuBarItem、dojo/domReady! 
   根據 Dojo API 參考文件來說,
   / 之前的叫 The main packages of the Dojo Toolkit,
   / 之後的叫 Common modules and packages of the Dojo Toolkit,
   那就叫它為「模組」
   載入模組後,需用一個 變數來接收該模組,以便於操作 
   例如 function(Map) {}  用一個 拋棄式的函數,
   裡面定義變數: Map、parser、DropDownMenu、MenuBar、MenuBarItem、MenuItem、PopupMenuBarItem,
   該變數就被設成相對印的類別,
2. function(Map...略...) {}  用一個 拋棄式的函數 裡面定義 map 變數,
   透過傳入的 Map 類別可以 宣告成一個 esri/map 的物件,其他載入的亦同方式
   parser.parse() 主要是將 dom 轉換成 dijit 物件或是 widget
   (new Map 宣告方法 就要查 https://developers.arcgis.com/javascript/jsapi/map-amd.html
JSBin Demo(http://goo.gl/o7C704)

參考文獻︰
 Dojo Sample
 dojo Document(version 1.10):dijit/Menu  、dijit/Menu reference documentation
 dojo Document(version 1.10):dijit/MenuBar  、dijit/MenuBar reference documentation
 dojo Document(version 1.10):dijit/MenuBarItem  、dijit/MenuBarItem reference documentation
 dojo Document(version 1.10):dijit/MenuItem  、dijit/MenuItem reference documentation
 dojo Document(version 1.10):dijit/MenuSeparator  、dijit/MenuSeparator reference documentation

星期二, 1月 27, 2015

[ArcGIS Server API for JavaScript] 利用 Label Layer 改變圖層 Label 的顯示


話說 ArcGIS Server for Javascript 怎麼改變圖層 Label 文字的顯示?

口白:
主要是跟 ArcGIS Server for Javascript API 所發生的糾葛?
卜朧共生命中對 GIS Coding 命運的糾結?
或是一場命中註定的糾纏?
結果如何?讓我們看下去....

Html:
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no">
    <title></title>
    <link rel="stylesheet" href="http://js.arcgis.com/3.12/esri/css/esri.css">
    <script src="http://js.arcgis.com/3.12/"></script>
  </head>
  <body>
    <div id="map"></div>
  </body>
</html>
說明:
 1. 引用 CSS 需插入  
    <link rel="stylesheet" href="http://js.arcgis.com/3.12/dijit/themes/claro/claro.css">
    <link rel="stylesheet" href="http://js.arcgis.com/3.12/esri/css/esri.css">

 2. 引用 Javascript 需插入  <script src="http://js.arcgis.com/3.12/"></script> 其中已包含了Dojo框架囉

 3. <body> 標籤中 加入 class 樣式定義為 "claro" 如: <body class="claro">

 4. 加入 div 區塊 當作地圖區塊 ,如:<div id="map"></div>


CSS:
      html, body, #map {
        height: 100%; width: 100%; margin: 0; padding: 0;
      }

說明:
 1. 定義 html、body、map 區塊的 CSS 樣式

JavaScript:
      var map;
      require([
        "esri/map",
        "esri/geometry/Extent",
        "esri/layers/FeatureLayer",
        "esri/symbols/SimpleLineSymbol",
        "esri/symbols/SimpleFillSymbol",
        "esri/symbols/TextSymbol",
        "esri/renderers/SimpleRenderer",
        "esri/layers/LabelLayer",
        "esri/Color",
        "dojo/domReady!"
      ], function(
        Map, Extent, FeatureLayer,
        SimpleLineSymbol, SimpleFillSymbol, TextSymbol, SimpleRenderer,
        LabelLayer,
        Color
      ) {
        // load the map centered on the United States
        var bbox = new Extent({"xmin": -1940058, "ymin": -814715, "xmax": 1683105, "ymax": 1446096, "spatialReference": {"wkid": 102003}});
        map = new Map("map", {
          extent: bbox
        });

        /**/
        var labelField = "STATE_NAME" ;

        // create a renderer for the states layer to override default symbology
        var statesColor = new Color("#666");
        // 定義線段樣式 "solid"
        //var statesLine = new SimpleLineSymbol("solid", statesColor, 1.5);
        // 定義線段樣式 esri.symbol.SimpleLineSymbol.STYLE_NULL 不顯示
        var statesLine = new SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_NULL, statesColor, null );
        var statesSymbol = new SimpleFillSymbol("solid", statesLine, null);
        var statesRenderer = new SimpleRenderer(statesSymbol);
        // create a feature layer to show country boundaries
        var statesUrl = "http://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3";
        var states = new FeatureLayer(statesUrl, {
          id: "states",
          outFields: [labelField]
        });
        states.setRenderer(statesRenderer);
        map.addLayer(states);

        // create a text symbol to define the style of labels
        var statesLabel = new TextSymbol().setColor(statesColor);
        statesLabel.font.setSize("14pt");
        statesLabel.font.setFamily("arial");
        var statesLabelRenderer = new SimpleRenderer(statesLabel);
        var labels = new LabelLayer({ id: "labels" });
        // tell the label layer to label the countries feature layer
        // using the field named "admin"
        labels.addFeatureLayer(states, statesLabelRenderer, "{" + labelField + "}");
        // add the label layer to the map
        map.addLayer(labels);
    
        /*
        var labelField1 = "OTHER";

        // create a renderer for the states layer to override default symbology
        var statesColor1 = new Color("#000");
        var statesLine1 = new SimpleLineSymbol("solid", statesColor1, 1.5);
        var statesSymbol1 = new SimpleFillSymbol("solid", statesLine1, null);
        var statesRenderer1 = new SimpleRenderer(statesSymbol1);
        // create a feature layer to show country boundaries
        var statesUrl1 = "http://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3";
        var states1 = new FeatureLayer(statesUrl1, {
          id: "states"
          ,
          outFields: [labelField1]
        });
        states1.setRenderer(statesRenderer1);
        map.addLayer(states1);

        // create a text symbol to define the style of labels
        var statesLabel1 = new TextSymbol().setColor(statesColor1);
        statesLabel1.font.setSize("12pt");
        statesLabel1.font.setFamily("arial");
        var statesLabelRenderer1 = new SimpleRenderer(statesLabel1);
        var labels1 = new LabelLayer({ id: "labels1" });
        // tell the label layer to label the countries feature layer
        // using the field named "admin"
        //labels1.addFeatureLayer(states1, statesLabelRenderer1, "{" + labelField1 + "}");
        labels.addFeatureLayer(states1, statesLabelRenderer1, "{" + labelField1 + "}");
        // add the label layer to the map
        map.addLayer(labels);
        */
      });

說明:
 1. 定義 弱型別的變數 map
     require 是 Dojo 方法,利用該方法 載入'esri/map', 'esri/geometry/Extent', 'esri/layers/FeatureLayer', 'esri/symbols/SimpleLineSymbol', 'esri/symbols/SimpleFillSymbol', 'esri/symbols/TextSymbol', 'esri/renderers/SimpleRenderer', 'esri/layers/LabelLayer', 'esri/Color', 'dojo/domReady!'

 2. 載入模組後,需用定義對應的變數來接收該模組,
     Map, Extent, FeatureLayer, SimpleLineSymbol, SimpleFillSymbol, 
     TextSymbol, SimpleRenderer,LabelLayer,Color

 3. function(Map...略...) {...略...}  用一個 拋棄式的函數 裡面定義 map 變數,
     透過傳入的 Map 類別可以 宣告成一個 esri/map 的物件
     (new Map 宣告方法 就要查 https://developers.arcgis.com/javascript/jsapi/map-amd.htmlnew Map(divId, options?)  第一個參數是 divId ,
     所以要對應 html 中 要顯示地圖 的 div ID(<div id="map"..略...),
     第二個參數是個 Object ,範例中所定義的屬性有 extent,
     extent:源自於 Extent(http://goo.gl/HEZmf8) 類別,
     所以我們定義一個弱型別的變數 bbox 來接 Extent(http://goo.gl/HEZmf8) 類別物件。

 4. 定義弱型別變數 labelField ,並定義它屬性為 STATE_NAME,這是我們預設要顯示的 Label 文字欄位。

 5. 透過傳入的 Color 類別,宣告成一個 esri/Color 的物件
     (new Color 宣告方法 就要查 https://developers.arcgis.com/javascript/jsapi/color-amd.html),
     利用所定義弱型別變數 statesColor 承接,目的是定義顯示線條、文字顏色。

 6. 透過傳入的 SimpleLineSymbol 類別,宣告成一個 esri/symbols/SimpleLineSymbol 的物件
     (new SimpleLineSymbol 宣告方法 就要查 https://developers.arcgis.com/javascript/jsapi/simplelinesymbol-amd.html),
     利用所定義弱型別變數 statesLine 承接,目的是定義簡單線條符號(顏色、粗細、樣式)

 7. 透過傳入的 SimpleFillSymbol 類別,宣告成一個 esri/symbols/SimpleFillSymbol 的物件
     (new SimpleFillSymbol 宣告方法 就要查 https://developers.arcgis.com/javascript/jsapi/simplelinesymbol-amd.html),
     利用所定義弱型別變數 statesSymbol 承接,目的是定義填充線條(顏色、粗細、樣式)

 8. 透過傳入的 SimpleRenderer 類別,宣告成一個 esri/renderers/SimpleRenderer 的物件
     (new SimpleRenderer 宣告方法 就要查 https://developers.arcgis.com/javascript/jsapi/simplerenderer-amd.html),
     利用所定義弱型別變數 statesRenderer 承接,目的是定義顯示物件

 9. 定義弱型別變數 statesUrl,
     屬性值:http://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3 ,
     定義為 ArcGIS Server Rest 服務位址

10. 透過傳入的 FeatureLayer 類別,宣告成一個 esri/layers/FeatureLayer 的物件
     (new FeatureLayer 宣告方法 就要查 https://developers.arcgis.com/javascript/jsapi/featurelayer-amd.html),
      利用所定義弱型別變數 states 承接。
      利用 states.setRenderer(statesRenderer)函數,來設定 FeatureLayer 的樣式。

11. 將 states 的 FeatureLayer ,透過 map.addLayer(states)  函數,把圖層加到 map。

12. 透過傳入的 TextSymbol 類別,宣告成一個 esri/symbols/TextSymbol 的物件
     (new TextSymbol 宣告方法 就要查 https://developers.arcgis.com/javascript/jsapi/textsymbol-amd.html),
      利用所定義弱型別變數 statesLabel 承接。
      利用 statesLabel.font.setSize("14pt") 函數,來設定字型的大小,
      利用 statesLabel.font.setFamily("arial") 函數,來設定字型集。

13. 透過傳入的 SimpleRenderer 類別,宣告成一個 esri/renderers/SimpleRenderer 的物件(同 8.),
     利用所定義弱型別變數 statesLabelRenderer 承接,目的是定義顯示 Label 物件

14. 透過傳入的 LabelLayer 類別,宣告成一個 esri/layers/FeatureLayer 的物件
     (new LabelLayer 宣告方法 就要查 https://developers.arcgis.com/javascript/jsapi/labellayer-amd.html),
      利用所定義弱型別變數 labels 承接。
      利用 labels.addFeatureLayer() 函數,來添加參考其標記要素層。

15. 將 labels 的 LabelLayer ,透過 map.addLayer(labels)  函數,把圖層加到 map。

console: ( 打開 debug 模式,來修改 label吧 )
// 將顯示的 Label 欄位改為 OTHER
map._layers.labels._featureLayerInfos[0].LabelExpressionInfo='{OTHER}';
map._layers.states._outFields[0]='OTHER';
map._layers.states.displayField='OTHER';
map.getLayer('states').refresh();

// 將顯示的 Label 欄位改為 STATE_NAME
map._layers.labels._featureLayerInfos[0].LabelExpressionInfo='{STATE_NAME}';
map._layers.states._outFields[0]='STATE_NAME';
map._layers.states.displayField='STATE_NAME';
map.getLayer('states').refresh();

JSBin Demo(http://goo.gl/nU8WeM)
參考文獻︰: ArcGIS API for JavaScript Sandbox 、label layer

星期五, 1月 16, 2015

[DotNet] Convert between SqlGeometry and DbGeometry

 要怎麼轉呢?跟神魔一樣有自動轉珠讓他自己轉轉轉就太好了...(期待)

SqlGeometry DbGeometry 兩者的差異在哪裡?
命名空間: Microsoft.SqlServer.Types 之下的類別 SqlGeometry
而 DbGeometry 則有兩個命名空間
命名空間1:System.Data.Spatial 之下的類別 DbGeometry
命名空間2:System.Data.Entity.Spatial  之下的類別 DbGeometry
不管事哪個命名空間 都有要用的 FromBinary(Byte[]) 、AsBinary 方法!
(擇一使用,看哪個比較適合)



//Convert from SqlGeometry to DbGeometry
SqlGeometry sqlGeo = ...
DbGeometry dbGeo = DbGeometry.FromBinary(sqlGeo.STAsBinary().Buffer);

上面的作法是把 SqlGeometrySTAsBinary() 方法,轉成開放式地理空間協會 (Open Geospatial Consortium,OGC) 已知的二進位 (well-known binary,WKB) 結果。
再利用 命名空間: System 之下的類別 Buffer 轉成陣列(是這樣說嗎?)
透過 DbGeometry 類別  FromBinary 方法再把它轉成 DbGeometry 物件
//Convert from DBGeometry to SqlGeometry
SqlGeometry sqlGeo2 = SqlGeometry.STGeomFromWKB(new SqlBytes(dbGeo.AsBinary()), 0);
上面的作法是把 DbGeometry 用 AsBinary 方法,轉成 Binary 結果。
再利用 命名空間: System.Data.SqlTypes 之下的類別 SqlBytes 轉成 WKB
透過 SqlGeometry  類別  STGeomFromWKB 方法再把它轉成 SqlGeometry  物件


星期三, 1月 14, 2015

[ArcGIS Server API for JavaScript] 套疊 WMS



話說 WMS 要怎麼樣 "套"誤(怎麼老是想用套,框架工具才會是套用,圖層是用疊的)   "疊"上去呢?
ArcGIS Server API for JavaScript 參考 Sample Code:WMS - resource info (http://goo.gl/lbMdfN) 教的程式吧!
照著Sample Code 教學 刻一次吧!

Html:
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <!--The viewport meta tag is used to improve the presentation and behavior of the samples
      on iOS devices-->
    <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no">
    <title>Map with WMS</title>

    <link rel="stylesheet" href="http://js.arcgis.com/3.12/dijit/themes/claro/claro.css">
    <link rel="stylesheet" href="http://js.arcgis.com/3.12/esri/css/esri.css">
    <script src="http://js.arcgis.com/3.12/"></script>
  </head>
  <body class="claro">
    <div id="content"
         data-dojo-type="dijit.layout.BorderContainer"
         data-dojo-props="design:'headline', gutters:true"
        style="width: 100%; height: 100%; margin: 0;">
      <div id="details"
           data-dojo-type="dijit.layout.ContentPane"
           data-dojo-props="region:'left', splitter:true"
           style="overflow:auto; width:200px;">
      </div>
      <div id="map"
           data-dojo-type="dijit.layout.ContentPane"
           data-dojo-props="region:'center'"
           style="overflow:hidden;">
      </div>
    </div>
  </body>
</html>

說明:
1. 引用 CSS 需插入  
    <link rel="stylesheet" href="http://js.arcgis.com/3.12/dijit/themes/claro/claro.css">
    <link rel="stylesheet" href="http://js.arcgis.com/3.12/esri/css/esri.css">
2. 引用 Javascript 需插入  <script src="http://js.arcgis.com/3.12/"></script> 其中已包含了Dojo框架囉
3. <body> 標籤中 加入 class 樣式定義為 "claro" 如: <body class="claro">
4. 加入 div 區塊 當作地圖區塊 ,如:<div id="map"></div>,
    並且定義:data-dojo-type="dijit.layout.ContentPane"、data-dojo-props="region:'center'";
    data-dojo-type、data-dojo-props這兩個是什麼東西呢?(沒有人會回答我吧!出來Code!遲早要還的!)
    這兩個就把它當成是Dojo 物件 自訂的屬性來看吧!
    根據百度(http://goo.gl/W53NWQ) 找到的說法:data-dojo-props 用來設置 dojo widget 的屬性,
    data-dojo-type 用來設置 dojo widget 的類型
    根據 Dojo 文件(http://goo.gl/Bs2n0I) 說的,dijit/layout/ContentPane 是一個最基本的設計磚塊(是哪招?這年頭要越獄就怕的就是遇到磚...還是把網頁當成蓋房子嗎?難怪叫道場)

CSS:
    html, body, #mapDiv {
      padding: 0;
      margin: 0;
      height: 100%;
    }
說明:
1. 定義 map 區塊的 CSS 樣式

JavaScript:
    var map;
    require([
      'esri/map', 'esri/layers/WMSLayer', 'esri/layers/WMSLayerInfo', 'esri/geometry/Extent',
      'dojo/_base/array', 'dojo/dom', 'dojo/dom-construct', 'dojo/parser',
      'dijit/layout/BorderContainer', 'dijit/layout/ContentPane', 'dojo/domReady!'
    ], function(Map, WMSLayer, WMSLayerInfo, Extent, array, dom, domConst, parser) {
      parser.parse();

      map = new Map('map', {
        basemap: 'streets',
        center: [-96, 37],
        zoom: 4
      });

      var layer1 = new WMSLayerInfo({
        name: '1',
        title: 'Rivers'
      });
      var layer2 = new WMSLayerInfo({
        name: '2',
        title: 'Cities'
      });
      var resourceInfo = {
        extent: new Extent(-126.40869140625, 31.025390625, -109.66552734375, 41.5283203125, {
          wkid: 4326
        }),
        layerInfos: [layer1, layer2]
      };
      var wmsLayer = new WMSLayer('http://sampleserver1.arcgisonline.com/ArcGIS/services/Specialty/ESRI_StatesCitiesRivers_USA/MapServer/WMSServer', {
        resourceInfo: resourceInfo,
        visibleLayers: ['1', '2']
      });
      map.addLayers([wmsLayer]);

      var details = dom.byId('details');
      domConst.place('<b>Layers</b>:', details);
      var ul = domConst.create('ul', null, details);
      array.forEach(wmsLayer.layerInfos, function(layerInfo) {
        domConst.create('li', { innerHTML: layerInfo.title }, ul);
      });
      domConst.place('<b>WMS Version</b>:' + wmsLayer.version + '<br />', details);
    });
說明:
1. 定義 弱型別的變數 map
    require 是 Dojo 方法,利用該方法 載入'esri/map', 'esri/layers/WMSLayer', 'esri/layers/WMSLayerInfo', 'esri/geometry/Extent', 'dojo/_base/array', 'dojo/dom', 'dojo/dom-construct', 'dojo/parser', 'dijit/layout/BorderContainer', 'dijit/layout/ContentPane', 'dojo/domReady!'

2. 載入模組後,需用定義對應的變數來接收該模組,
    Map, WMSLayer, WMSLayerInfo, Extent, array, dom, domConst, parser

3. function(Map) {}  用一個 拋棄式的函數 裡面定義 map 變數,
    透過傳入的 Map 類別可以 宣告成一個 esri/map 的物件
    (new Map 宣告方法 就要查 https://developers.arcgis.com/javascript/jsapi/map-amd.htmlnew Map(divId, options?)  第一個參數是 divId ,
    所以要對應 html 中 要顯示地圖 的 div ID(<div id="map"..略),
    第二個參數是個 Object ,範例中所定義的屬性有 basemap、center、zoom,
    basemap(我稱它叫基本底圖) 它有的選項︰ "streets" , "satellite" , "hybrid", "topo", "gray", "dark-gray", "oceans", "national-geographic", "terrain" 和 "osm";
    center(預設地圖顯示中心點位置):它是一個矩陣,例如: [-96, 37];
    zoom(初始地圖顯示範圍層級):它是一個整數,例如:zoom: 4

4. 定義了兩個 WMSLayerInfo 變數 ,並定義它為 WMSLayerInfo(http://goo.gl/NOnzHh) 物件,
    new WMSLayerInfo(layer) 參數是個 Object ,範例中所定義的屬性有 name 、title
    name (Layer 名稱,要對應WMS名稱或者index);
    title (Layer 標題,可以自行定義)

5. 定義 Object 變數 resourceInfo,目的是之後宣告 wmsLayer 變數時 Option 屬性 Object 會使用到
    其中有兩個屬性 extent、layerInfos,
    而 extent屬性 需定義一個 extent(http://goo.gl/HEZmf8) 物件,
    並定義 座標參考 spatialreference 物件 [標準:spatialreference(http://goo.gl/qgM3sy) ],
    而 layerInfos屬性 需是要給一個 WMSLayerInfo 矩陣,

6. 定義 WMSLayer(http://goo.gl/Rup72F) 變數 wmsLayer,
    new WMSLayer(url, options?) ,其中有兩個屬性 url(WMS 網址) 、options(Object 屬性參數)
    Option 屬性 又是一個 Object ,裡面則用到了兩個屬性 resourceInfo、visibleLayers ,
    resourceInfo 屬性,則是承接 之前所定義的 Object 變數 resourceInfo,
    visibleLayers 屬性,則是定義一個矩陣,矩陣內容釋放要顯示的圖層 name ,例如:['1', '2']
    (這樣寫我以後看的懂嗎?)

7. 把圖層加入 map 語法:map.addLayers([wmsLayer])

8. 之後的程式碼一句話帶過吧!只是為了顯示圖層 title 與 wms 版本

JSBin Demo(http://goo.gl/QQs9oZ)
JSBin Demo(http://goo.gl/Il7MdM) 介接國土測繪中心通用版電子地圖WMS EMAP

另外一種方式 Custom layer - WMS ,改天再來實作吧!