- 引言
- 調用動态地圖服務
- 需求
- 1根據需求隐藏服務中的某一個圖層
- 11代碼解釋
- 2通過屬性查詢地圖服務中的資訊
- 21代碼實作
- 22代碼解釋
- 3通過空間查詢地圖服務中的資訊
- 31代碼實作
- 32代碼解釋
- 4補充
- 1根據需求隐藏服務中的某一個圖層
1.引言
在本篇部落格中主要記錄一下在ArcGIS API如何調用自己釋出的動态地圖服務,利用動态地圖服務我們可以完成哪一些需求等等。
注:(如何利用ArcGIS Server釋出動态地圖服務請看部落格ArcGIS Server釋出動态地圖服務),
2.調用動态地圖服務
在ArcGIS API 中給我們提供了一個類叫做
ArcGISDynamicMapServiceLayer
利用這個類,我們可以獲得釋出的地圖服務。調用動态地圖服務一般隻需要兩步:
- 通過地圖服務的URL建立一個
對象ArcGISDynamicMapServiceLayer
- 将動态地圖服務的對象添加到地圖容器中
代碼如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello World</title>
<link rel="stylesheet" type="text/css" href="http://localhost/arcgis_js_api/library/3.17/3.17/dijit/themes/tundra/tundra.css"/>
<link rel="stylesheet" type="text/css" href="http://localhost/arcgis_js_api/library/3.17/3.17/esri/css/esri.css" />
<script type="text/javascript" src="http://localhost/arcgis_js_api/library/3.17/3.17/init.js"></script>
<script>
require(["esri/map","esri/layers/ArcGISDynamicMapServiceLayer",
"dojo/domReady!"],
function(Map,ArcGISDynamicMapServiceLayer){
var map = new Map("mapDiv");
//利用url建立一個動态地圖服務對象
var layer=new ArcGISDynamicMapServiceLayer("http://localhost:6080/arcgis/rest/services/Test/MyServer/MapServer");
//将地圖服務對象添加到地圖容器中
map.addLayer(layer);
})
</script>
</head>
<body class="tundra">
<div id="mapDiv" style="width:900px; height:600px; border:1px solid #000;"></div>
</body>
</html>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
點選運作,運作之後如圖所示:
注:
- 在ArcGIS API中與ArcMap不同的是:一個服務圖層相當于一組圖層的集合(即多個圖層)。
3.需求
在真實開發過程中,動态地圖服務可以幫助我們完成很多的功能需求,例如:
- 根據需求隐藏服務中的某一個圖層(動态地圖服務可以實作,但是切片地圖服務就不能實作)
- 通過屬性查詢地圖服務中的資訊
- 通過空間查詢地圖服務中的資訊(包括點查詢,線查詢,面查詢等等)
3.1.根據需求隐藏服務中的某一個圖層
我們釋出的地圖服務中有四個圖層
在本需求中。我們主要是給頁面添加一個按鈕,然後将地圖服務中的road2隐藏
代碼為:
require(["esri/map","dojo/dom","dojo/on","esri/layers/ArcGISDynamicMapServiceLayer",
"dojo/domReady!"],
function(Map,dom,on,ArcGISDynamicMapServiceLayer){
var map = new Map("mapDiv");
var layer=new ArcGISDynamicMapServiceLayer("http://localhost:6080/arcgis/rest/services/Test/MyServer/MapServer");
map.addLayer(layer);
//給id為btn的按鈕綁定click事件
on(dom.byId("btn"),"click",function()
{
layer.setVisibleLayers([,,]);
})
})
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
3.1.1代碼解釋:
- 此代碼功能的實作非常簡單,隻利用了
方法,告訴服務,我要顯示圖層編号為setVisibleLayers
的圖層。1,2,3
- 在
中加載了一個新的子產品require
子產品,此子產品給我們提供了一個方法dojo/dom
,我們可以通過id獲得dom對象,類似于dom.byId(id)
方法。document.getElementById()
- 在
中加載了一個新的子產品require
子產品,在dojo中dojo/on
是用來綁定事件的,on
的第一個參數是給哪一個對象綁定事件,第二個參數是事件的類型,第三個是參數是回調函數。on(target,type,listener)
3.2.通過屬性查詢地圖服務中的資訊
在開發過程中,經常有這樣的需求:
- 根據屬性查詢出我們想要的要素圖形,然後将該圖形高亮(在本事例中查詢教學樓的資訊,例如根據教學樓的名稱将該樓層成高亮)
教學樓圖層的屬性表資訊:
在實作這個功能的時候我們分幾步開始考慮:
- 在網頁上建立一個文本框
- 将文本框中的教學樓名稱擷取,并建立屬性查詢對象
- 将查詢到的樓層資訊(幾何資訊)擷取,利用
高亮顯示graphics
3.2.1.代碼實作
- 建立一個文本框
Name:<input class="nm" type="text">
<input type="button" value="查詢">
- 1
- 2
- 1
- 2
- 将文本框中的教學樓名稱擷取,并建立屬性查詢對象
query("#btn").on("click",function(){
//獲得教學樓的名稱
var name=query(".nm")[].value;
//執行個體化查詢參數
var findParams = new esri.tasks.FindParameters();
findParams.returnGeometry = true;
findParams.layerIds = [];
findParams.searchFields = ["name"];
findParams.searchText = name;
//執行個體化查詢對象
var FindTask = new esri.tasks.FindTask("http://localhost:6080/arcgis/rest/services/Test/MyServer/MapServer");
//進行查詢
FindTask.execute(findParams,ShowFindResult)
})
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 将查詢到的樓層資訊(幾何資訊)擷取,利用
高亮顯示graphics
function showFindResult(queryResult)
{
if (queryResult.length == ) {
alert("沒有該元素");
return;
}
for (var i = ; i < queryResult.length; i++) {
//獲得該圖形的形狀
var graphic = queryResult[i].feature;
var geometry = graphic.geometry;
//定義高亮圖形的符号
//1.定義面的邊界線符号
var outline= new SimpleLineSymbol(SimpleLineSymbol.STYLE_DASHDOT,new Color([, , ]), );
//2.定義面符号
var PolygonSymbol = new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID, outline,new Color([, , , ]));
//建立用戶端圖形
var graphic = new Graphic(geometry, PolygonSymbol);
//将用戶端圖形添加到map中
map.graphics.add(graphic);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
-
檢視結果
屬性查詢前:
屬性查詢後:
完整代碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello World</title>
<link rel="stylesheet" type="text/css" href="http://localhost/arcgis_js_api/library/3.17/3.17/dijit/themes/tundra/tundra.css"/>
<link rel="stylesheet" type="text/css" href="http://localhost/arcgis_js_api/library/3.17/3.17/esri/css/esri.css" />
<script type="text/javascript" src="http://localhost/arcgis_js_api/library/3.17/3.17/init.js"></script>
<script>
require(["esri/map","dojo/query","dojo/on",
"esri/layers/ArcGISDynamicMapServiceLayer",
"esri/tasks/FindTask",
"esri/tasks/FindParameters",
"esri/symbols/SimpleLineSymbol",
"esri/symbols/SimpleFillSymbol",
"esri/Color",
"esri/graphic",
"dojo/domReady!"],
function(Map,query,on,ArcGISDynamicMapServiceLayer,FindTask,FindParameters,SimpleLineSymbol,SimpleFillSymbol,Color,Graphic){
var map = new Map("mapDiv");
var layer=new ArcGISDynamicMapServiceLayer("http://localhost:6080/arcgis/rest/services/Test/MyServer/MapServer");
map.addLayer(layer);
query("#btn").on("click",function(){
//獲得教學樓的名稱
var name=query(".nm")[].value;
//執行個體化查詢參數
var findParams = new FindParameters();
findParams.returnGeometry = true;
findParams.layerIds = [];
findParams.searchFields = ["name"];
findParams.searchText = name;
//執行個體化查詢對象
var findTask = new FindTask("http://localhost:6080/arcgis/rest/services/Test/MyServer/MapServer");
//進行查詢
findTask.execute(findParams,showFindResult)
});
function showFindResult(queryResult)
{
if (queryResult.length == ) {
alert("沒有該元素");
return;
}
for (var i = ; i < queryResult.length; i++) {
//獲得該圖形的形狀
var feature= queryResult[i].feature;
var geometry = feature.geometry;
//定義高亮圖形的符号
//1.定義面的邊界線符号
var outline= new SimpleLineSymbol(SimpleLineSymbol.STYLE_DASHDOT,new Color([, , ]), );
//2.定義面符号
var PolygonSymbol = new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID, outline,new Color([, , , ]));
//建立用戶端圖形
var graphic = new Graphic(geometry, PolygonSymbol);
//将用戶端圖形添加到map中
map.graphics.add(graphic);
}
}
})
</script>
</head>
<body class="tundra">
<div id="mapDiv" style="width:900px; height:580px; border:1px solid #000;"></div>
Name:<input class="nm" type="text">
<input id="btn" type="button" value="查詢">
</body>
</html>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
3.2.2代碼解釋
-
是Esri提供的一個屬性查詢的類,他所對應的參數為:FindTask
,FindParameters
隻能用于屬性查詢,不能用于空間查詢FindTask
-
類中有一個方法叫做FindTask
,execute
的第一個參數是屬性查詢的參數,第二個參數是一個回調函數(即是一個異步函數),當伺服器傳回資料時,此函數才會被觸發。execute
-
是dojo/query
提供的一個DOM選擇器,他的功能非常強大,與dojo
中的JQuery
符一樣強大,可以根據id選擇$
,也可以根據類名選擇query("#id")
,query(".classname")
方法還有很多強大的地方,具體可以參考官方文檔query
-
是dojo提供給我們第二種綁定事件的方式。query("#btn").on()
-
esri提供給我們使用的用戶端圖層,利用graphic
,我們可以完成很多操作,graphic
具體的使用,将在graphic
工具時說明。Draw
3.3通過空間查詢地圖服務中的資訊
相信大家都遇到過這種問題,當我點選地圖時,将我點選的圖形進行高亮顯示,此時就用到了空間查詢。為了實作該功能我們可以分為以下幾步:
- 因為要點選地圖,是以首先我們給地圖綁定點選事件
- 獲得點選的地圖坐标(點坐标),并建立空間查詢參數對象
- 将教學樓與點相交的樓層查詢出來,然後利用
進行高亮顯示graphic
注:此事例查詢是教學樓圖層
3.3.1代碼實作
- 給地圖綁定點選事件
map.on("click",mapClick);
- 1
- 1
- 獲得點選的地圖坐标(點坐标),并建立空間查詢參數對象
function mapClick(e){
//獲得使用者點選的地圖坐标
var point=e.mapPoint;
//執行個體化查詢參數
query=new Query();
query.geometry = point;
query.outFields = ["*"];
query.outSpatialReference = map.spatialReference;
query.spatialRelationship = Query.SPATIAL_REL_INTERSECTS;
query.returnGeometry = true;
//執行個體化查詢對象
var queryTask = new QueryTask("http://localhost:6080/arcgis/rest/services/Test/MyServer/MapServer/3");
//進行查詢
queryTask.execute(query,showFindResult)
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 将教學樓與點相交的樓層查詢出來,然後利用
進行高亮顯示graphic
function showFindResult(queryResult)
{
if (queryResult.features == ) {
alert("沒有該元素");
return;
}
for (var i = ; i < queryResult.features.length; i++) {
//獲得該圖形的形狀
var feature = queryResult.features[i];
var geometry = feature.geometry;
//定義高亮圖形的符号
//1.定義面的邊界線符号
var outline= new SimpleLineSymbol(SimpleLineSymbol.STYLE_DASHDOT,new Color([, , ]), );
//2.定義面符号
var PolygonSymbol = new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID, outline,new Color([, , , ]));
//建立用戶端圖形
var graphic = new Graphic(geometry, PolygonSymbol);
//将用戶端圖形添加到map中
map.graphics.add(graphic);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
-
檢視結果
滑鼠點選前:
滑鼠點選後:
- 完整代碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello World</title>
<link rel="stylesheet" type="text/css" href="http://localhost/arcgis_js_api/library/3.17/3.17/dijit/themes/tundra/tundra.css"/>
<link rel="stylesheet" type="text/css" href="http://localhost/arcgis_js_api/library/3.17/3.17/esri/css/esri.css" />
<script type="text/javascript" src="http://localhost/arcgis_js_api/library/3.17/3.17/init.js"></script>
<script>
require(["esri/map","dojo/query","dojo/on",
"esri/layers/ArcGISDynamicMapServiceLayer",
"esri/tasks/QueryTask",
"esri/tasks/query",
"esri/symbols/SimpleLineSymbol",
"esri/symbols/SimpleFillSymbol",
"esri/Color",
"esri/graphic",
"dojo/domReady!"],
function(Map,query,on,ArcGISDynamicMapServiceLayer,QueryTask,Query,SimpleLineSymbol,SimpleFillSymbol,Color,Graphic){
var map = new Map("mapDiv");
var layer=new ArcGISDynamicMapServiceLayer("http://localhost:6080/arcgis/rest/services/Test/MyServer/MapServer");
map.addLayer(layer);
map.on("click",mapClick);
function mapClick(e){
//獲得使用者點選的地圖坐标
var point=e.mapPoint;
//執行個體化查詢參數
query=new Query();
query.geometry = point;
query.outFields = ["*"];
query.outSpatialReference = map.spatialReference;
query.spatialRelationship = Query.SPATIAL_REL_INTERSECTS;
query.returnGeometry = true;
//執行個體化查詢對象
var queryTask = new QueryTask("http://localhost:6080/arcgis/rest/services/Test/MyServer/MapServer/3");
//進行查詢
queryTask.execute(query,showFindResult)
}
function showFindResult(queryResult)
{
if (queryResult.features == ) {
alert("沒有該元素");
return;
}
for (var i = ; i < queryResult.features.length; i++) {
//獲得該圖形的形狀
var feature = queryResult.features[i];
var geometry = feature.geometry;
//定義高亮圖形的符号
//1.定義面的邊界線符号
var outline= new SimpleLineSymbol(SimpleLineSymbol.STYLE_DASHDOT,new Color([, , ]), );
//2.定義面符号
var PolygonSymbol = new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID, outline,new Color([, , , ]));
//建立用戶端圖形
var graphic = new Graphic(geometry, PolygonSymbol);
//将用戶端圖形添加到map中
map.graphics.add(graphic);
}
}
})
</script>
</head>
<body class="tundra">
<div id="mapDiv" style="width:900px; height:580px; border:1px solid #000;"></div>
</body>
</html>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
3.3.2代碼解釋
-
是esri提供給我們的一個工具類,可用于屬性查詢,也可用于空間查詢,QueryTask
隻能作用于地圖服務的某一個圖層,而不能作用于一整個地圖服務(QueryTask
類可作用于一整個地圖服務)IdentifyTask
-
類是Query
參數類,用于設定空間查詢的參數。QueryTask
-
類中有一個方法叫做QueryTask
,execute
的第一個參數是查詢的參數,第二個參數是一個回調函數(即是一個異步函數),當伺服器傳回資料時,此函數才會被觸發execute
3.4補充
綁定事件之後,在某些情況下也解除事件的綁定,下面提供幾種方法解除事件綁定
- 直接通過事件句柄解除(dojo新版本)
//綁定事件
var handle=map.on("click",mapClick);
//解除事件
handle.remove();
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
- 通過老版本的方法解除
//綁定事件
var handle=map.on("click",mapClick);
//解除事件
dojo.disconnect(handle)
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
(function () {('pre.prettyprint code').each(function () {
var lines = (this).text().split(′\n′).length;var numbering = $('
').addClass('pre-numbering').hide();
(this).addClass(′has−numbering′).parent().append( numbering);
for (i = 1; i <= lines; i++) {
numbering.append( ('
-
').text(i));
};
$numbering.fadeIn(1700);
});
});