Arcgis API 不依赖地图服务的面要素创建和渲染

       需求场景:做一个专题图,图层不依赖于Arcgis地图服务,同时可以根据外部数据进行渲染。

       1.  不依赖于Arcgis地图服务,首先我们想到的是FeatureLayer,创建要素图层有两种方法:

        这里我们选第二种方式创建要素图层,此方式最主要是构造featureCollectionObject这个参数。

featureCollecttionObject又是由featureSetlayerDefinition构成,这两个参数构建了一个类似于标准featureLayer的数据结构。

       featureSets输入json格式的参数,json数据可以由shp格式通过ArcMap转换而来,转换方法参考:传送门:shp转json

       layerDefinition用来描述属性点构成的要素图层,最少需要geometryTypefields两个参数可以从JSON数据中获取

       2. 根据外部数据渲染图层,具体项目中外部数据一般都是通过接口获得,为了测试方便,我们把外部测试数据放在本地环境中。

在要素合集创建要素图层后,通过嵌套循环方式,把测试数据属性赋予要素图层。 

       实现步骤:

       ① 将要素转换为json格式   

       ② 通过json数据和要素合集方式创建要素图层

       ③ 将外部数据属性赋予要素图层

       ④ 根据新的属性指标渲染图层

       具体代码如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>

<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=7,IE=9" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>不依赖地图服务创建面要素和渲染</title>
  <link rel="stylesheet" href="https://js.arcgis.com/3.20/esri/css/esri.css">
  <style>
    body,
    html {
      margin: 0;
      padding: 0;
      width: 100%;
      height: 100%;
      font-family: Arial;
    }
    #map {
      width: 100%;
      height: 100%;
      margin: 0;
      padding: 0;
      border: 0px dashed black;
      background-color: rgb(0, 38, 48);
    }

  </style>
</head>
<body>
<button type="button" onclick="getJson('rk')">人口</button>
<button type="button" onclick="getJson('GDP')">GDP</button>
<button type="button" onclick="getJson('android')">安卓销售</button>
<button type="button" onclick="getJson('ios')">苹果销售</button>
<div id="map">
</div>
</body>

<!-- 引入ARCGIS API -->
<script src="https://js.arcgis.com/3.20"></script>
<script type="text/javascript">
  var map, getJson;
  require([
    "esri/map",
    'esri/Color',
    "esri/tasks/FeatureSet",
    "esri/layers/FeatureLayer",
    'esri/renderers/UniqueValueRenderer',
    'esri/symbols/SimpleFillSymbol',
    'esri/symbols/SimpleLineSymbol',
    'esri/graphic',
    "esri/geometry/Extent",
    "dojo/domReady!"
  ], function(
    Map,
    Color,
    FeatureSet,
    FeatureLayer,
    UniqueValueRenderer,
    SimpleFillSymbol,
    SimpleLineSymbol,
    Graphic,
    Extent
  ) {

    //地图范围
    var mapExtent = new Extent({
      xmax: 113.799760210539,
      xmin: 106.57095767482662,
      ymax: 20.459116202966324,
      ymin: 18.27952992162579,
      spatialReference: {
        wkid: 4326
      }
    })
    map = new Map("map", {
      extent: mapExtent,
      sliderStyle: "small",
      logo: false,
    });

    map.on('load', function () {
      map.hideZoomSlider()
      map.hidePanArrows()

    })
    //测试数据
    var dataTest = [
      {"city":"海口", "rk":1, "GDP":1, "android":1, "ios":1},
      {"city":"三亚", "rk":2, "GDP":2, "android":2, "ios":2},
      {"city":"文昌", "rk":1, "GDP":2, "android":3, "ios":4},
      {"city":"儋州", "rk":4, "GDP":3, "android":2, "ios":1},
      {"city":"琼海", "rk":3, "GDP":4, "android":1, "ios":2},
      {"city":"保亭", "rk":2, "GDP":3, "android":4, "ios":1},
      {"city":"陵水", "rk":1, "GDP":2, "android":3, "ios":4},
      {"city":"东方", "rk":4, "GDP":3, "android":2, "ios":1},
      {"city":"白沙", "rk":3, "GDP":4, "android":1, "ios":2},
      {"city":"临高", "rk":2, "GDP":3, "android":4, "ios":1},
      {"city":"定安", "rk":1, "GDP":2, "android":3, "ios":4},
      {"city":"澄迈", "rk":4, "GDP":1, "android":2, "ios":3},
      {"city":"琼中", "rk":3, "GDP":4, "android":1, "ios":2},
      {"city":"屯昌", "rk":2, "GDP":3, "android":4, "ios":1},
      {"city":"乐东", "rk":1, "GDP":2, "android":3, "ios":4},
      {"city":"昌江", "rk":4, "GDP":1, "android":2, "ios":3},
      {"city":"万宁", "rk":1, "GDP":2, "android":3, "ios":4},
      {"city":"五指山", "rk":2, "GDP":3, "android":4, "ios":1}
    ]
    window.onload = function() {
      getJson("GDP")// 默认GDP指标渲染
    }

    //获取本地json数据,根据json数据创建要素图层,根据属性指标渲染图层
    getJson = function (type) {
      var json = null
      var url = "city.json"/*json文件url*/
      var request = new XMLHttpRequest();
      request.open("get", url);/*设置请求方法与路径*/
      request.send(null);/*不发送数据到服务器*/
      request.onload = function () {/*XHR对象获取到返回信息后执行*/
        if (request.status == 0) {/*返回状态为0,即为数据获取成功*/
          json = JSON.parse(request.responseText);
          var featureSet = new FeatureSet(json)
          var layerDefinition = {  //要素描述
            "geometryType": "esriGeometryPolygon",
            "fields":[
              {
                "name" : "FID", //字段名称
                "type" : "esriFieldTypeOID", //字段类型
                "alias" : "FID"
              },
              {
                "name" : "city_name",
                "type" : "esriFieldTypeString",
                "alias" : "city_name",
                "length" : 254
              },
              {
                "name" : "value",
                "type" : "esriFieldTypeInteger",
                "alias" : "value"
              }
            ]
          }
          //要素合集
          var featureCollection = {
            layerDefinition: layerDefinition,
            featureSet: featureSet
          }
          var featurelayer = new FeatureLayer(featureCollection) //使用要素合集创建要素图层
          addData(featurelayer,dataTest)  //测试数据属性赋予图层
          var symbol = new SimpleFillSymbol() //渲染类型
          symbol.setColor(new Color([150, 150, 150, 0.5]))
          var renderer = new UniqueValueRenderer(symbol, type)  //唯一值渲染
          renderer.addValue('1', new SimpleFillSymbol().setColor(new Color([079, 135, 062, 0.5])))
          renderer.addValue('2', new SimpleFillSymbol().setColor(new Color([252, 237, 136, 0.5])))
          renderer.addValue('3', new SimpleFillSymbol().setColor(new Color([238, 155, 053, 0.5])))
          renderer.addValue('4', new SimpleFillSymbol().setColor(new Color([233, 087, 062, 0.5])))
          featurelayer.setRenderer(renderer)
          map.addLayer(featurelayer)
        }
      }
    }
    //将测试数据属性赋予要素图层
    addData = function(layer,data) {
      var length = layer.graphics.length
      for (var i=0; i<length; i++){
        cityname = layer.graphics[i].attributes.city_name
        for (var j=0; j<data.length; j++) {
          city = data[j].city
          if (cityname == city) {
            layer.graphics[i].attributes = Object.assign(data[j], {'cityname': data[j].city})
          }
        }
      }
    }

  });
</script>
</html>

效果:

 

 

 

       

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值