話說 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.html )
new 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();
參考文獻︰: ArcGIS API for JavaScript Sandbox 、label layer
沒有留言 :
張貼留言