ArcGIS API for JavaScript学习笔记

1. ArcGIS pro包含了ArcMap功能。

2. 4.x和3.x版本区别

        项目中如果有三维相关希求,选择4.x版本;如果没有三维相关需求,选择3.x版本(二维操作更多)。

3.arcgis api本地部署

        https://blog.csdn.net/qq_36792085/article/details/87897245

4.本地运行(在nginx服务中):

 <html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no" />
    <title>ArcGIS API for JavaScript Tutorials: Display a map</title>

    <style>
      html,
      body,
      #viewDiv {
        padding: 0;
        margin: 0;
        height: 100%;
        width: 100%;
      }
    </style>

    <!-- <link rel="stylesheet" href="./4.2/main.css"> -->
    <!-- <script src="./4.2/init.js"></script> -->
    <link rel="stylesheet" href="http://localhost/arcgis_js_api/library/4.19/esri/css/main.css">
    <script src="http://localhost/arcgis_js_api/library/4.19/init.js"></script>

    <script>
      require(["esri/Map","esri/views/MapView"],function(Map,MapView){
        var map = new Map({
          basemap:'streets'
        });

        const view = new MapView({
          map:map,
          center:[114,22],
          zoom:8,
          container:'viewDiv'
        })

      })
    </script>

  </head>
  <body>
    <div id="viewDiv"></div>
  </body>
</html>

5.加载自定义底图(TileLayer, FeatureLayer, MapImageLayer, ImageryLayer)

1)公网上自定义底图地址:http://map.geoq.cn/arcgis/rest/services

2)   //1.MapServer结尾的是动态服务,如果没有切片,需要用MapImageLayer实例化,有切片用TileLayer实例化
        //2.如果是FeatureServer结尾的,用FeatureLayer类实例化
        //3.如果zoom和center没有生效,证明是自定义图层api用错了

3)代码:

<html>

<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no" />
  <title>添加服务图层</title>

  <style>
    html,
    body,
    #viewDiv {
      padding: 0;
      margin: 0;
      height: 100%;
      width: 100%;
    }
  </style>

  <link rel="stylesheet" href="http://localhost/4.19/esri/css/main.css">
  <script src="http://localhost/4.19/init.js"></script>

  <script>
    require(["esri/Map", "esri/views/MapView",
      "esri/layers/TileLayer", "esri/layers/FeatureLayer",
      "esri/layers/MapImageLayer", "esri/layers/ImageryLayer"
    ], function(Map, MapView, TileLayer, FeatureLayer, MapImageLayer, ImageryLayer) {
      var map = new Map({
        basemap: 'osm'
      });

      let layer01 = new TileLayer({
        url: "http://map.geoq.cn/arcgis/rest/services/ChinaOnlineStreetPurplishBlue/MapServer"
      });
      map.add(layer01, 0) //添加到底图上边,index越大越在顶层

      let layer02 = new ImageryLayer({
        url: "https://landsat2.arcgis.com/arcgis/rest/services/Landsat8_Views/ImageServer"
      });
      map.add(layer02, 1)

      let layer03 = new MapImageLayer({
        url: "https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer"
      });
      map.add(layer03, 2)

      let layer04 = new FeatureLayer({
        url: "https://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer/0"
      });
      map.add(layer04, 3)

      const view = new MapView({
        map: map,
        center: [-120, 30],
        zoom: 4,
        container: 'viewDiv'
      })

    })
  </script>
</head>

<body>
  <div id="viewDiv"></div>
</body>

</html>

6.实例化底图控件 

1)控件所在目录:esri/widgets

2)控件包含的有:Home、Legend、ScaleBar、Zoom

3)用法1:实例化、添加到view:

let homeWidget = new Home({
  view: view,
});
view.ui.add(homeWidget, "top-left");

  方法2:控件设置自定义位置:

<style>
...
  #zoomWiget{
    position: absolute;
    top: 50px;
    left: 50px;
  }
</style>

<script>
    //zoom1不自定义位置
    let zoom1 = new Zoom({
      view: view
    });
    view.ui.add(zoom1, "top-right");

    //zoom2自定义位置
    let zoom2 = new Zoom({
      view: view,
      container: document.getElementById('zoomWiget')
    });
    view.ui.add(zoom2);
</script>

...
<div id="zoomWiget"></div>

4)全部代码:

<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no" />
    <title>添加控件</title>
    <style>
      html,
      body,
      #viewDiv {
        position: relative;
        padding: 0;
        margin: 0;
        height: 100%;
        width: 100%;
      }
      #zoomWiget{
        position: absolute;
        top: 50px;
        left: 50px;
      }
    </style>

    <link rel="stylesheet" href="http://localhost/4.19/esri/css/main.css">
    <script src="http://localhost/4.19/init.js"></script>

    <script>
      require(["esri/Map","esri/views/MapView",
      "esri/Basemap","esri/layers/MapImageLayer",
      "esri/layers/TileLayer","esri/widgets/Home",
      "esri/widgets/Legend","esri/widgets/ScaleBar",
      "esri/widgets/Zoom"],
      function(Map,MapView,Basemap,MapImageLayer,TileLayer,Home,Legend,ScaleBar,Zoom){

        var basemap = new Basemap({
          baseLayers:[
          new TileLayer({
            url: "http://map.geoq.cn/arcgis/rest/services/ChinaOnlineStreetPurplishBlue/MapServer"
          }),
          ],
          title:'basemap',
          id:'20001'
        });

        var map = new Map({
          basemap:basemap //或者外层写map.add(layer);
        });

        const view = new MapView({
          map:map,
          center:[114,22],
          zoom:8,
          container:'viewDiv'
        })
        view.ui.components = [];//清空zoom组件
  
        
        //Home控件
        let homeWidget = new Home({
          view: view,
        });
        view.ui.add(homeWidget, "top-left");
        //图例控件
        let legend = new Legend({
          view: view,
        });
        view.ui.add(legend, "bottom-right");
        //比例尺
        let scaleBar = new ScaleBar({
          view: view,
          unit:'metric'
        });
        view.ui.add(scaleBar, {
          position: "bottom-left"
        });
        //zoom1不自定义位置
        let zoom1 = new Zoom({
          view: view
        });
        view.ui.add(zoom1, "top-right");
        //zoom2自定义位置
        let zoom2 = new Zoom({
          view: view,
          container: document.getElementById('zoomWiget')
        });
        view.ui.add(zoom2);

      })
    </script>

  </head>
  <body>
    <div id="viewDiv"></div>
    <div id="zoomWiget"></div>
  </body>
</html>

7.地图符号化(样式、标注)

代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    html,body {
      padding: 0;
      width: 100%;
      height: 100%;
    }
    #mapDiv {
      margin: 10px auto;
      width: 90%;
      height: 90%;
      border: 2px solid #999;
    }
  </style>
  <link rel="stylesheet" href="http://localhost/4.18api/esri/themes/light/main.css">
  <script src="http://localhost/4.18api/init.js"></script>

  <script>
    require(["esri/Map", "esri/views/MapView", "esri/layers/FeatureLayer"],
      function(Map, MapView, FeatureLayer) {
        var map = new Map({
          basemap: 'topo-vector',
        });

        //点样式
        var trailheadersRenderer = {
          type: 'simple',
          symbol: {
            type: 'picture-marker',
            url: 'http://static.arcgis.com/images/Symbols/NPS/npsPictograph_0231b.png',
            width: '18px',
            height: '18px'
          }
        };
        //点标注,标注TRL_NAME字段
        var trailheadsLabels = {
          symbol: {
            type: "text",
            color: "#FFFFFF",
            haloColor: "#5E8D74",
            haloSize: "2px",
            font: {
              size: "12px",
              family: "Noto Sans",
              style: "italic",
              weight: "normal"
            }
          },
          labelPlacement: "above-center",
          labelExpressionInfo: {
            expression: "$feature.TRL_NAME"
          }
        };
        //点图层
        var trailheadsLayer = new FeatureLayer({
          url: 'https://services3.arcgis.com/GVgbJbqm8hXASVYi/ArcGIS/rest/services/Trailheads/FeatureServer/0',
          renderer: trailheadersRenderer,
          labelingInfo: [trailheadsLabels]
        });
        map.add(trailheadsLayer)

        //线图层样式,根据海拔ELEV_GAIN设置线宽,海拔0设置3px,海拔2300设置7px
        var trailsRenderer = {
          type: "simple",
          symbol: {
            color: "#BA55D3",
            type: "simple-line",
            style: "solid"
          },
          visualVariables: [{
            type: "size",
            field: "ELEV_GAIN",
            minDataValue: 0,
            maxDataValue: 2300,
            minSize: "3px",
            maxSize: "7px"
          }]
        };
        var trailsLayer = new FeatureLayer({
          url: 'https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Trails/FeatureServer/0',
          renderer: trailsRenderer,
          opacity: .75
        })
        map.add(trailsLayer, 0)

        //设置自行车专用路线
        var bikeTrailsRenderer = {
          type: "simple",
          symbol: {
            type: "simple-line",
            style: "short-dot",
            color: "#FF91FF",
            width: "1px"
          }
        };
        var bikeTrails = new FeatureLayer({
          url: "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Trails/FeatureServer/0",
          renderer: bikeTrailsRenderer,
          definitionExpression: "USE_BIKE = 'YES'"
        });
        map.add(bikeTrails, 1);

        //为每种类型的公园区域使用不同的符号
        function createFillSymbol(value, color) {
          return {
            "value": value,
            "symbol": {
              "color": color,
              "type": "simple-fill",
              "style": "solid",
              "outline": {
                "style": "none"
              }
            },
            "label": value
          };
        };
        var openSpacesRenderer = {
          type: "unique-value",
          field: "TYPE",
          uniqueValueInfos: [
            createFillSymbol("Natural Areas", "#FF0000"),
            // createFillSymbol("Natural Areas", "#9E559C"),
            createFillSymbol("Regional Open Space", "#A7C636"),
            createFillSymbol("Local Park", "#149ECE"),
            createFillSymbol("Regional Recreation Park", "#ED5151")
          ]
        };
        var parksLayer = new FeatureLayer({
          url: "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Parks_and_Open_Space/FeatureServer/0",
          renderer: openSpacesRenderer,
          opacity: .2,
        });
        map.add(parksLayer, 0)

        var view = new MapView({
          container: 'mapDiv',
          map: map,
          zoom: 13,
          center: [-118.80543, 34.02700],
        });

      }
    )
  </script>
</head>

<body>
  <div id="mapDiv"></div>
</body>

</html>

8.ArcGIS API绘制点线面

方法1:通过控件的方法实现绘制"esri/widgets/Sketch", "esri/layers/GraphicsLayer"

方法2:通过代码实现绘制:"esri/Graphic"

两种方法实现代码:

<html>
<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no" />
  <title>绘制点线面</title>

  <style>
    html,
    body,
    #viewDiv {
      padding: 0;
      margin: 0;
      height: 100%;
      width: 100%;
    }
  </style>
  <link rel="stylesheet" href="http://localhost/4.19/esri/css/main.css">
  <script src="http://localhost/4.19/init.js"></script>
  <script>
    require(["esri/Map", "esri/views/MapView",
      "esri/widgets/Sketch", "esri/layers/GraphicsLayer",
      "esri/Graphic"
    ], function(Map, MapView, Sketch, GraphicsLayer, Graphic) {

      let graphicLayer = new GraphicsLayer()
      var map = new Map({
        basemap: 'osm',
        layers: [graphicLayer]
      });

      const view = new MapView({
        map: map,
        center: [114, 22],
        zoom: 8,
        container: 'viewDiv'
      })

      //方法1:通过控件的方法实现绘制
      const sketch = new Sketch({
        layer: graphicLayer,
        view: view,
        creationMode: "update"
      });
      view.ui.add(sketch, "top-right")

      //方法2:通过代码的方法实现绘制,以画线为例,点线面类似
      let polyline = {
        type: "polyline", // autocasts as new Polyline()
        paths: [
          [114, 23],
          [114.2, 23.3],
          [114.4, 23]
        ]
      };
      let polylineSymbol = {
        type: "simple-line", // autocasts as SimpleLineSymbol()
        color: [226, 119, 40],
        width: 4
      };
      let polylineAtt = {
        Name: "Keystone Pipeline",
        Owner: "TransCanada"
      };
      let polylineGraphic = new Graphic({
        geometry: polyline,
        symbol: polylineSymbol,
        attributes: polylineAtt
      });
      view.graphics.add(polylineGraphic);

    })
  </script>

</head>

<body>
  <div id="viewDiv"></div>
</body>

</html>

9.ArcGIS API弹窗

  • 用到的类:"esri/PopupTemplate"
  • 弹窗可以放不局限域API的东西,放的就是div:

        popupTemplate-example

10.属性查询,并定位到查询的结果

  • 用到的类:"esri/tasks/QueryTask", "esri/tasks/support/Query"
  • 代码:
  • <html>
    
    <head>
      <meta charset="utf-8" />
      <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no" />
      <title>属性查询</title>
    
      <style>
        html,
        body,
        #viewDiv {
          padding: 0;
          margin: 0;
          height: 100%;
          width: 100%;
        }
      </style>
    
      <link rel="stylesheet" href="http://localhost/4.19/esri/css/main.css">
      <script src="http://localhost/4.19/init.js"></script>
    
      <script>
        require(["esri/Map", "esri/views/MapView", "esri/layers/FeatureLayer",
          "esri/tasks/QueryTask", "esri/tasks/support/Query"
        ], function(Map, MapView, FeatureLayer, QueryTask, Query) {
    
          var map = new Map({
            basemap: 'osm'
          });
          const view = new MapView({
            map: map,
            center: [114, 25],
            zoom: 4,
            container: 'viewDiv'
          })
    
          let queryTask = new QueryTask({
            url: 'http://localhost:6080/arcgis/rest/services/province/MapServer/0'
          });
          let query = new Query();
          query.returnGeometry = true;
          query.outFields = ["*"];
          // query.where = "BOU2_4M_ &gt; 910"; 
          query.where = "NAME= '黑龙江省'";
    
          // When resolved, returns features and graphics that satisfy the query.
          queryTask.execute(query).then(function(results) {
            console.log(results.features);
            x = results.features[0].geometry.extent.center.longitude
            y = results.features[0].geometry.extent.center.latitude
            console.log(x, y);
            setTimeout(() => {
              view.goTo({
                  center: [x, y],
                  zoom: 8,
                })
                .catch(function(error) {
                  if (error.name != "AbortError") {
                    console.error(error);
                  }
                });
            }, 2000);
          });
        })
      </script>
    
    </head>
    
    <body>
      <div id="viewDiv"></div>
    </body>
    
    </html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

q124467623

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值