ArcGIS API For Javascript之動態圖層

1.引言

      在ArcGIS 10.1版本之後,ArcGIS提供了一種新的功能:動態圖層。準確的說,動態圖層並不是一種新的地圖服務,它更像是地圖服務(MapServer)的一種擴展。
      動態圖層主要特點:

  • 改變地圖服務的現有圖層
  • 動態圖層適用於海量圖層的情況
  • 不需要將shp文件發佈爲服務,服務器可以直接讀取shp文件在前端顯示

2.調用動態圖層

      在前面已經說過動態圖層並不是一種新的服務類型,而是地圖服務的一種擴展,因此我們不需要發佈服務,只需要對地圖服務添加動態圖層功能即可。啓用地圖服務的步驟爲:

  • 給相應的地圖服務啓用動態工作空間
  • 選擇服務器相應的硬盤地址並賦予其id
  • 將相應位置註冊到ArcGIS Server服務器(保證ArcGIS Server可以訪問數據)
  • 在Web端進行調用

2.1.啓用動態圖層

在本次實例中我們用到的地圖服務爲:http://localhost:6080/arcgis/rest/services/Test/MyService/MapServer,如果不知道該服務怎麼發佈,請看:發佈動態地圖服務

  • 我們打開Manager->登錄,找到該服務,點擊功能,選擇允許每次請求修改圖層順序和符號->添加

這裏寫圖片描述

  • 硬盤上的數據

這裏寫圖片描述

注:D:\myshp文件夾下面有一個shp文件:lunkuoxian.shp

  • 因此我們選擇工作空間類型爲:shpfile文件夾,工作空間id在此處取名爲my,硬盤路徑:D:\myshp

這裏寫圖片描述

  • 點擊確定,重新啓動服務

這裏寫圖片描述

這裏寫圖片描述

  • 註冊文件夾到服務器

點擊站點->數據存儲->註冊文件夾(因爲我們是文件夾,所以是註冊文件夾,如果是數據庫,那麼就要註冊數據庫)

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

  • 在Services Directory 查看動態圖層是否啓用

在瀏覽器輸入:http://localhost:6080/arcgis/rest/services進入Test文件夾,找到我們的地圖服務MyService,點進去,在最下發發現:

這裏寫圖片描述

注意動態圖層的地址爲:http://localhost:6080/arcgis/rest/services/Test/MyService/MapServer/dynamicLayer

2.2.Web端調用

2.2.1 代碼實現

  • 首先我們加載地圖
require(["esri/map",
            "dojo/dom",
            "dojo/on",
            "esri/layers/ArcGISDynamicMapServiceLayer",
            "esri/layers/FeatureLayer",
            "esri/layers/TableDataSource",
            "esri/layers/LayerDataSource",
            "esri/renderers/SimpleRenderer",
            "esri/symbols/SimpleMarkerSymbol",
            "esri/symbols/SimpleLineSymbol",
            "dojo/domReady!"], function (
                Map,dom,on, ArcGISDynamicMapServiceLayer, FeatureLayer, TableDataSource, LayerDataSource, SimpleRenderer, SimpleMarkerSymbol,SimpleLineSymbol) {
            var map = new Map("mapDiv");
            var layer1 = new ArcGISDynamicMapServiceLayer("http://localhost:6080/arcgis/rest/services//Test/MyService/MapServer");
            map.addLayer(layer1);
 });
  • 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
  • 添加一個按鈕(用於添加動態圖層)
<button id="btn">添加動態圖層</button>
  • 1
  • 1
  • 給按鈕添加事件
on(dom.byId("btn"),"click",function(e){
                //定義一個數據源
                var dataSource = new TableDataSource();
                //此處爲我們設置的命名空間
                dataSource.workspaceId = "my";
                //命名空間下面的shp
                dataSource.dataSourceName = "lunkuoxian.shp";
                //定義一個圖層數據源
                var layerSource = new LayerDataSource();
                //給圖層數據源賦值
                layerSource.dataSource = dataSource;
                //定義一個要素圖層:注意鏈接爲動態圖層的地址
                var layer2 = new FeatureLayer("http://localhost:6080/arcgis/rest/services/Test/MyService/MapServer/dynamicLayer", {
                    mode: FeatureLayer.MODE_ONDEMAND,
                    outFields: ["*"],
                    source: layerSource
                });
                //定義線符號
                var lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.STYLE_DASH, new dojo.Color([255, 0, 0]), 3);
                //定義渲染器
                var renderer = new esri.renderer.SimpleRenderer(lineSymbol);
                //定義渲染器
                layer2.setRenderer(renderer);
                layer2.refresh();
                map.addLayer(layer2);
    })
  • 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
  • 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

2.2.2 完整代碼

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></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 type="text/javascript">
        require(["esri/map",
            "dojo/dom",
            "dojo/on",
            "esri/layers/ArcGISDynamicMapServiceLayer",
            "esri/layers/FeatureLayer",
            "esri/layers/TableDataSource",
            "esri/layers/LayerDataSource",
            "esri/renderers/SimpleRenderer",
            "esri/symbols/SimpleLineSymbol",
            "dojo/domReady!"], function (
                Map,dom,on, ArcGISDynamicMapServiceLayer, FeatureLayer, TableDataSource, LayerDataSource, SimpleRenderer,SimpleLineSymbol) {
            var map = new Map("mapDiv");
            var layer1 = new ArcGISDynamicMapServiceLayer("http://localhost:6080/arcgis/rest/services//Test/MyService/MapServer");
            map.addLayer(layer1);

            on(dom.byId("btn"),"click",function(e){
                //定義一個數據源
                var dataSource = new TableDataSource();
                //此處爲我們設置的命名空間
                dataSource.workspaceId = "my";
                //命名空間下面的shp
                dataSource.dataSourceName = "lunkuoxian.shp";
                //定義一個圖層數據源
                var layerSource = new LayerDataSource();
                //給圖層數據源賦值
                layerSource.dataSource = dataSource;
                //定義一個要素圖層:注意鏈接爲動態圖層的地址
                var layer2 = new FeatureLayer("http://localhost:6080/arcgis/rest/services/Test/MyService/MapServer/dynamicLayer", {
                    mode: FeatureLayer.MODE_ONDEMAND,
                    outFields: ["*"],
                    source: layerSource
                });
                //定義線符號
                var lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.STYLE_DASH, new dojo.Color([255, 0, 0]), 3);
                //定義渲染器
                var renderer = new esri.renderer.SimpleRenderer(lineSymbol);
                //定義渲染器
                layer2.setRenderer(renderer);
                layer2.refresh();
                map.addLayer(layer2);
            })

        });
    </script>
</head>

<body>
<div id="mapDiv" style="height:600px;"></div>
<button id="btn">添加動態圖層</button>
</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
  • 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

運行結果之前:

這裏寫圖片描述

運行結果之後:

這裏寫圖片描述

3.動態圖層的屬性查詢

     在真實需求中,我們不僅僅是將shp在地圖中顯示那麼簡單,我們往往要查詢該圖層的屬性信息,我們在前面代碼的基礎上添加上屬性查詢。

3.1方法1(通過click直接獲取)

3.1.1代碼實現

  • 給要素圖層添加點擊事件
layer2.on("click", function(evt) {
                    //得到點擊的graphics
                    var graphic=evt.graphic;
                    //得到該屬性信息
                    var attributes=graphic.attributes;
                    //得到該屬性信息轉換成字符串
                    var result=jsonUtil.stringify(attributes)
                    //將結果彈出一下
                    alert(result);
                    //獲得要素圖層的主鍵名稱

})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

3.1.2全部代碼

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></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 type="text/javascript">
        require(["esri/map",
            "dojo/dom",
            "dojo/on",
            "esri/layers/ArcGISDynamicMapServiceLayer",
            "esri/layers/FeatureLayer",
            "esri/layers/TableDataSource",
            "esri/layers/LayerDataSource",
            "esri/renderers/SimpleRenderer",
            "esri/symbols/SimpleLineSymbol","dojo/json",
            "dojo/domReady!"], function (
                Map,dom,on, ArcGISDynamicMapServiceLayer, FeatureLayer, TableDataSource, LayerDataSource, SimpleRenderer,SimpleLineSymbol,jsonUtil) {
            var map = new Map("mapDiv");
            var layer1 = new ArcGISDynamicMapServiceLayer("http://localhost:6080/arcgis/rest/services//Test/MyService/MapServer");
            map.addLayer(layer1);

            on(dom.byId("btn"),"click",function(e){
                //定義一個數據源
                var dataSource = new TableDataSource();
                //此處爲我們設置的命名空間
                dataSource.workspaceId = "my";
                //命名空間下面的shp
                dataSource.dataSourceName = "lunkuoxian.shp";
                //定義一個圖層數據源
                var layerSource = new LayerDataSource();
                //給圖層數據源賦值
                layerSource.dataSource = dataSource;
                //定義一個要素圖層:注意鏈接爲動態圖層的地址
                var layer2 = new FeatureLayer("http://localhost:6080/arcgis/rest/services/Test/MyService/MapServer/dynamicLayer", {
                    mode: FeatureLayer.MODE_ONDEMAND,
                    outFields: ["*"],
                    source: layerSource
                });
                //定義線符號
                var lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.STYLE_DASH, new dojo.Color([255, 0, 0]), 3);
                //定義渲染器
                var renderer = new esri.renderer.SimpleRenderer(lineSymbol);
                //定義渲染器
                layer2.setRenderer(renderer);
                layer2.refresh();
                map.addLayer(layer2);
                layer2.on("click", function(evt) {
                    //得到點擊的graphics
                    var graphic=evt.graphic;
                    //得到該屬性信息
                    var attributes=graphic.attributes;
                    //得到該屬性信息轉換成字符串
                    var result=jsonUtil.stringify(attributes)
                    //將結果彈出一下
                    alert(result);
                    //獲得要素圖層的主鍵名稱

                })
            })

        });
    </script>
</head>

<body>
<div id="mapDiv" style="height:600px;"></div>
<button id="btn">添加動態圖層</button>
</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
  • 72
  • 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
  • 72

運行結果:

這裏寫圖片描述

3.2通過查詢獲得屬性

3.2.1代碼實現

  • 定義一個按鈕(用戶獲得屬性)
<button id="attr">用戶彈出屬性</button>
  • 1
  • 1
  • 給相應的按鈕綁定事件
on(dom.byId("attr"),"click",function(){
                    //得到要素圖層的主鍵屬性
                    var idProperty = layer2.objectIdField;
                    //定義查詢參數
                    var query = new Query();
                    //是否返回幾何形狀
                    query.returnGeometry = false;
                    //圖層的主鍵名稱(根據自己要求修改)
                    query.objectIds = [247];
                    //查詢條件1=1意思是:只根據主鍵查詢,忽略where子句
                    query.where = "1=1";
                    //進行查詢
                    layer2.selectFeatures(query, FeatureLayer.SELECTION_NEW,function(result){
                        //因爲我們根據主鍵查詢,一定只有一個元素
                        var graphic=result[0];
                        //獲得屬性
                        var attributes=graphic.attributes;
                        //得到該屬性信息轉換成字符串
                        var result=jsonUtil.stringify(attributes)
                        //將結果彈出一下
                        alert(result);
                    });

                })
  • 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

3.2.2全部代碼

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></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 type="text/javascript">
        require(["esri/map",
            "dojo/dom",
            "dojo/on",
            "esri/layers/ArcGISDynamicMapServiceLayer",
            "esri/layers/FeatureLayer",
            "esri/layers/TableDataSource",
            "esri/layers/LayerDataSource",
            "esri/renderers/SimpleRenderer",
            "esri/symbols/SimpleLineSymbol","dojo/json","esri/tasks/query",
            "dojo/domReady!"], function (
                Map,dom,on, ArcGISDynamicMapServiceLayer, FeatureLayer, TableDataSource, LayerDataSource, SimpleRenderer,SimpleLineSymbol,jsonUtil,Query) {
            var map = new Map("mapDiv");
            var layer1 = new ArcGISDynamicMapServiceLayer("http://localhost:6080/arcgis/rest/services//Test/MyService/MapServer");
            map.addLayer(layer1);

            on(dom.byId("btn"),"click",function(e){
                //定義一個數據源
                var dataSource = new TableDataSource();
                //此處爲我們設置的命名空間
                dataSource.workspaceId = "my";
                //命名空間下面的shp
                dataSource.dataSourceName = "lunkuoxian.shp";
                //定義一個圖層數據源
                var layerSource = new LayerDataSource();
                //給圖層數據源賦值
                layerSource.dataSource = dataSource;
                //定義一個要素圖層:注意鏈接爲動態圖層的地址
                var layer2 = new FeatureLayer("http://localhost:6080/arcgis/rest/services/Test/MyService/MapServer/dynamicLayer", {
                    mode: FeatureLayer.MODE_ONDEMAND,
                    outFields: ["*"],
                    source: layerSource
                });
                //定義線符號
                var lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.STYLE_DASH, new dojo.Color([255, 0, 0]), 3);
                //定義渲染器
                var renderer = new esri.renderer.SimpleRenderer(lineSymbol);
                //定義渲染器
                layer2.setRenderer(renderer);
                layer2.refresh();
                map.addLayer(layer2);
                on(dom.byId("attr"),"click",function(){
                    //得到要素圖層的主鍵屬性
                    var idProperty = layer2.objectIdField;
                    //定義查詢參數
                    var query = new Query();
                    //是否返回幾何形狀
                    query.returnGeometry = false;
                    //圖層的主鍵名稱(根據自己要求修改)
                    query.objectIds = [247];
                    //查詢條件1=1意思是:只根據主鍵查詢,忽略where子句
                    query.where = "1=1";
                    //進行查詢
                    layer2.selectFeatures(query, FeatureLayer.SELECTION_NEW,function(result){
                        //因爲我們根據主鍵查詢,一定只有一個元素
                        var graphic=result[0];
                        //獲得屬性
                        var attributes=graphic.attributes;
                        //得到該屬性信息轉換成字符串
                        var result=jsonUtil.stringify(attributes)
                        //將結果彈出一下
                        alert(result);
                    });

                })

            })

        });
    </script>
</head>

<body>
<div id="mapDiv" style="height:600px;"></div>
<button id="btn">添加動態圖層</button>
<button id="attr">用戶彈出屬性</button>
</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
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 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
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86

4.補充

4.1 啓用文件地理數據庫三點不同

  • 文件的目錄

這裏寫圖片描述

  • 命名空間配置

這裏寫圖片描述

  • 註冊文件夾配置

這裏寫圖片描述

  • 代碼調用差別

這裏寫圖片描述

注意:忽略了要素集的存在,即調用是lunkuoxian,而不是vector.lunkuoxian,調用的時候後面沒有*.shp



(function () { ('pre.prettyprint code').each(function () {
var lines = (this).text().split(\n).length;var numbering = $('
    ').addClass('pre-numbering').hide();
    (this).addClass(hasnumbering).parent().append( numbering);
    for (i = 1; i <= lines; i++) {
    numbering.append( ('
  • ').text(i));
    };
    $numbering.fadeIn(1700);
    });
    });

    發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章