高德地图 Web JS API UI组件示例学习笔记(8)——行政区划聚合(一)

区划聚合

使用DistrictCluster实现按照行政区划聚合大量点信息的展示。

function initPage(DistrictCluster, $) {
      var distCluster = new DistrictCluster({
        map: map, //所属的地图实例
        zIndex: 11,
        getPosition: function (item) {
          if (!item) {
            return null;
          }
          var parts = item.split(',');
          //返回经纬度
          return [parseFloat(parts[0]), parseFloat(parts[1])];
        }
      });

      window.distCluster = distCluster;

      $('<div id="loadingTip">加载数据,请稍候...</div>').appendTo(document.body);
      $.get('https://a.amap.com/amap-ui/static/data/10w.txt', function (csv) {

        $('#loadingTip').remove();

        var data = csv.split('\n');
        // 返回111282个坐标点
        console.log(data);
        
        distCluster.setData(data);
      });
    }

    //加载相关组件
    AMapUI.load(['ui/geo/DistrictCluster', 'lib/$'], function (DistrictCluster, $) {
      window.DistrictCluster = DistrictCluster;
      //启动页面
      initPage(DistrictCluster, $);
    });

返回的是各个城市的坐标点数据:
在这里插入图片描述

点击后显示聚合标注

使用DistrictCluster实现点击后显示聚合标注的效果。

function initPage(DistrictCluster, $) {
      var distCluster = new DistrictCluster({
        map: map, //所属的地图实例
        zIndex: 11,
        // 获取经纬度坐标
        getPosition: function (item) {
          if (!item) {
            return null;
          }
          var parts = item.split(',');
          // 依次打印所有的坐标点数据
          // console.log("parts", parts);
          //返回经纬度
          return [parseFloat(parts[0]), parseFloat(parts[1])];
        },
        renderOptions: {
          //marker的位置随交互变化
          clusterMarkerKeepConsistent: false,
          getClusterMarkerPosition: function (feature) {
            //返回之前存储的点击位置
            return currentLngLat;
          },
          // 获取点击之后的聚合点
          getClusterMarker: function (feature, dataItems, recycledMarker) {
            //不是当前feature,直接返回null
            if (feature.properties.adcode !== currentAdcode) {
              return null;
            }
            // 打印当前点击的feature
            // console.log("feature", feature);
            // 打印当前点击的dataItems
            // 包括dataIndex、dataItem、position
            // console.log("dataItems", dataItems);
            // console.log("recycledMarker", recycledMarker);

            var container,
              title,
              body,
              nodeClassNames = {
                // 行政区划的名称,如北京市
                title: 'amap-ui-district-cluster-marker-title',
                // 区划名称后面的数字
                body: 'amap-ui-district-cluster-marker-body',
                // 内容框,包含了前两者
                container: 'amap-ui-district-cluster-marker'
              };

            if (recycledMarker) {
              container = recycledMarker.getContent();
              title = $(container).find('.' + nodeClassNames.title)[0];
              body = $(container).find('.' + nodeClassNames.body)[0];
            } else {
              container = document.createElement('div');
              title = document.createElement('span');
              title.className = nodeClassNames.title;
              body = document.createElement('span');
              body.className = nodeClassNames.body;
              container.appendChild(title);
              container.appendChild(body);
            }

            // 属性信息
            var props = feature.properties,
              routeNames = [];
            var classNameList = [nodeClassNames.container, 'level_' + props.level, 'adcode_' + props.adcode];
            // 赋值container节点的class名称
            container.className = classNameList.join(' ');
            if (routeNames.length > 0) {
              routeNames.push(props.name);
              container.setAttribute('title', routeNames.join('>'));
            } else {
              container.removeAttribute('title');
            }
            // 将要素的属性名赋给title
            $(title).html(props.name);
            // 将要素的dataItems的个数赋给body
            $(body).html(dataItems.length);
            // 创建一个结果marker
            var resultMarker = recycledMarker || new AMap.Marker({
              topWhenClick: true,
              offset: new AMap.Pixel(-20, -30),
              content: container
            });
            return resultMarker;
          }
        }
      });

      var currentAdcode = null,
        currentLngLat = null;

      //监听区划面的点击
      distCluster.on('featureClick', function (e, feature) {
        currentAdcode = feature.properties.adcode;
        //记住点击位置
        currentLngLat = e.originalEvent.lnglat;
        //重绘
        distCluster.renderLater();
      });

      //监听区划面之外的点击
      distCluster.on('outsideClick', function (e) {
        currentAdcode = currentLngLat = null;
        //重绘
        distCluster.renderLater();
      });

      window.distCluster = distCluster;

      // 加载txt数据
      $('<div id="loadingTip">加载数据,请稍候...</div>').appendTo(document.body);
      $.get('https://a.amap.com/amap-ui/static/data/10w.txt', function (csv) {
        $('#loadingTip').remove();
        var data = csv.split('\n');
        distCluster.setData(data);
      });
    }

    //加载相关组件
    AMapUI.load(['ui/geo/DistrictCluster', 'lib/$'], function (DistrictCluster, $) {
      window.DistrictCluster = DistrictCluster;
      //启动页面
      initPage(DistrictCluster, $);
    });

定制聚合信息标注

使用DistrictCluster实现定制聚合信息标注。
自定义标注中显示的内容及标注的位置。

function initPage(DistrictCluster, $) {
      var distCluster = new DistrictCluster({
        map: map, //所属的地图实例
        zIndex: 11,
        getPosition: function (item) {
          if (!item) {
            return null;
          }
          var parts = item.split(',');
          //返回经纬度
          return [parseFloat(parts[0]), parseFloat(parts[1])];
        },

        renderOptions: {
          //显示在所辖数据点的平均位置
          getClusterMarkerPosition: DistrictCluster.ClusterMarkerPositionStrategy.AVERAGE_POINTS_POSITION,
          getClusterMarker: function (feature, dataItems, recycledMarker) {

            //label内容
            var content = feature.properties.name + ' (' + dataItems.length + ')';

            var label = {
              offset: new AMap.Pixel(16, 18), //修改label相对于marker的位置
              content: content
            };

            //存在可回收利用的marker
            if (recycledMarker) {
              //直接更新内容返回
              recycledMarker.setLabel(label);
              return recycledMarker;
            }

            //返回一个新的Marker
            return new AMap.Marker({
              label: label
            });
          }
        }
      });

      window.distCluster = distCluster;

      $('<div id="loadingTip">加载数据,请稍候...</div>').appendTo(document.body);
      $.get('https://a.amap.com/amap-ui/static/data/10w.txt', function (csv) {
        $('#loadingTip').remove();
        var data = csv.split('\n');
        distCluster.setData(data);
      });
    }

    //加载相关组件
    AMapUI.load(['ui/geo/DistrictCluster', 'lib/$'], function (DistrictCluster, $) {
      window.DistrictCluster = DistrictCluster;
      //启动页面
      initPage(DistrictCluster, $);
    });

DistrictCluster内部提供了几类实现,以便快捷赋值,包括:
1.DistrictCluster.ClusterMarkerPositionStrategy.CENTER(默认)
返回行政中心
2.DistrictCluster.ClusterMarkerPositionStrategy.CENTROID
返回区划面的质心(区划面为凹多边形时返回行政中心,比如甘肃)
3.DistrictCluster.ClusterMarkerPositionStrategy.AVERAGE_POINTS_POSITION
返回该区划面下辖的数据点的平均位置(各个点的经纬度加总平均)

自定义绘制引擎

使用DistrictCluster实现行政区面的自定义绘制。
绘制一个蓝底白字的标注,去掉了水滴状的点标记。

function initPage(DistrictCluster, $, utils) {

      function MyRender(distClusterIns, opts) {
        //直接调用父类的构造函数
        MyRender.__super__.constructor.apply(this, arguments);
      }

      //继承默认引擎
      utils.inherit(MyRender, DistrictCluster.Render.Default);

      utils.extend(MyRender.prototype, {
        drawFeaturePolygons: function (ctx, polygons, styleOptions, feature, dataItems) {
          //调用父类方法
          MyRender.__super__.drawFeaturePolygons.apply(this, arguments);

          //直接绘制聚合信息
          this.drawMyLabel(feature, dataItems);
        },
        _initContainter: function () {
          //调用父类方法
          MyRender.__super__._initContainter.apply(this, arguments);

          //创建一个新的canvas
          this._createCanvas('mylabel', this._container);
        },
        /**
         * 绘制一个蓝底白字的label替代聚合标注
         */
        drawMyLabel: function (feature, dataItems) {

          var pixelRatio = this.getPixelRatio(); //高清下存在比例放大

          var containerPos = map.lngLatToContainer(feature.properties.centroid || feature.properties.center);

          var labelCtx = this._getCanvasCxt('mylabel');

          //文字的中心点
          var centerX = containerPos.getX() * pixelRatio,
            centerY = containerPos.getY() * pixelRatio;

          labelCtx.save();

          labelCtx.font = 14 * pixelRatio + 'px 微软雅黑';

          var text = feature.properties.name + ' (' + dataItems.length + ')';

          var textMetrics = labelCtx.measureText(text);

          var halfTxtWidth = textMetrics.width / 2;

          labelCtx.fillStyle = '#3366cc';
          //绘制一个蓝色背景
          labelCtx.fillRect(centerX - halfTxtWidth - 3 * pixelRatio,
            centerY - 11 * pixelRatio,
            textMetrics.width + 6 * pixelRatio,
            22 * pixelRatio);


          labelCtx.fillStyle = '#ffffff';
          labelCtx.textBaseline = 'middle';
          labelCtx.fillText(text, centerX - halfTxtWidth, centerY);

          labelCtx.restore();
        }
      });


      var distCluster = new DistrictCluster({
        zIndex: 200,
        map: map, //所属的地图实例

        getPosition: function (item) {

          if (!item) {
            return null;
          }

          var parts = item.split(',');

          //返回经纬度
          return [parseFloat(parts[0]), parseFloat(parts[1])];
        },
        //使用自定义的引擎类
        renderConstructor: MyRender,
        renderOptions: {
          //不再使用聚合标注
          getClusterMarker: null,
          //点击区划面后切换到子级区划
          featureClickToShowSub: true
        }
      });

      window.distCluster = distCluster;

      $('<div id="loadingTip">加载数据,请稍候...</div>').appendTo(document.body);
      $.get('https://a.amap.com/amap-ui/static/data/10w.txt', function (csv) {

        $('#loadingTip').remove();

        var data = csv.split('\n');

        distCluster.setData(data);
      });
    }

事件支持

使用DistrictCluster的事件支持。
示例了对地图feature和点标注的多个事件监听。

function initPage(DistrictCluster, $) {
      var distCluster = new DistrictCluster({
        map: map, //所属的地图实例
        zIndex: 11,
        getPosition: function (item) {
          if (!item) {
            return null;
          }
          var parts = item.split(',');
          //返回经纬度
          return [parseFloat(parts[0]), parseFloat(parts[1])];
        },
        renderOptions: {
          // 开启地图feature的事件监听
          featureEventSupport: true,
          // 开启Marker的事件监听
          clusterMarkerEventSupport: true,
          //标注信息Marker上需要监听的事件
          clusterMarkerEventNames: ['click', 'rightclick', 'mouseover', 'mouseout']
        }
      });

      window.distCluster = distCluster;
      // 实现了对地图feature的事件监听
      distCluster.on('featureClick featureMouseover featureMouseout', function (e, feature) {
        $('#infoTip').html(e.type + ': ' + feature.properties.name);
      });
      // 实现了对clusterMarker的事件监听
      distCluster.on('clusterMarkerClick clusterMarkerRightclick clusterMarkerMouseover clusterMarkerMouseout',
        function (e, record) {
          $('#infoTip').html(e.type + ': ' + record.feature.properties.name);
        });

      $('<div id="loadingTip">加载数据,请稍候...</div>').appendTo(document.body);
      $.get('https://a.amap.com/amap-ui/static/data/10w.txt', function (csv) {
        $('#loadingTip').remove();
        var data = csv.split('\n');
        // console.log(data.length);
        distCluster.setData(data);
      });
    }

    //加载相关组件
    AMapUI.load(['ui/geo/DistrictCluster', 'lib/$'], function (DistrictCluster, $) {
      //启动页面
      initPage(DistrictCluster, $);
    });
### 回答1: 想要在Vue中使用高德JS API UI组件示例轨迹,需要按照以下步骤进行操作: 1. 在Vue项目中安装高德地图的JavaScript APIJS API UI的依赖,可以使用npm或yarn命令进行安装。 2. 在Vue项目中引入高德地图的JavaScript APIJS API UI的依赖。可以在Vue的入口文件(如main.js)中使用import语句引入。 3. 在需要使用JS API UI组件的Vue组件中,使用组件的方式导入所需的组件。例如,如果需要使用轨迹组件,可以使用import语句导入AMapUI的Track组件。 4. 在Vue组件的模板中,使用导入的组件进行渲染。例如,在需要显示轨迹的地方使用<amap-track></amap-track>进行渲染。 5. 在Vue组件的JavaScript代码中,根据需要配置组件的属性和方法。可以通过提供的API文档查找所需的属性和方法,根据文档中的说明进行配置。 6. 在Vue组件的JavaScript代码中,使用高德地图的JavaScript APIJS API UI的相关方法进行地图的初始化和操作,例如将地图显示在指定的容器中,加载轨迹数据等。 7. 运行Vue项目,即可在界面上看到使用高德JS API UI组件示例轨迹的效果。 需要注意的是,为了使用高德地图APIUI组件,可能需要在高德地图开放平台注册并获取密钥。在开发过程中,可以在相关配置中使用密钥,以实现相关功能。 以上就是在Vue中使用高德JS API UI组件示例轨迹的基本步骤。具体的实现方式和配置可以根据自己的需求进行调整和扩展。 ### 回答2: 要使用高德 JS API UI 组件示例轨迹,首先需要安装相应的依赖包。可以在 Vue 项目的根目录下运行以下命令来安装: ``` npm install @amap/amap-jsapi-loader ``` 安装完成后,在需要使用轨迹示例组件中引入 AMapJSApiLoader: ```javascript import AMapJSApiLoader from '@amap/amap-jsapi-loader'; export default { data() { return { map: null }; }, mounted() { this.initMap(); }, methods: { async initMap() { // 加载高德地图 JS API const loader = new AMapJSApiLoader({ key: 'your-amap-api-key', version: '2.0', plugins: ['AMap.ToolBar'] }); // 加载完成后初始化地图 const AMap = await loader.load(); this.map = new AMap.Map('mapContainer', { // 地图选项配置 }); // 在地图上绘制轨迹 this.drawTrack(); }, drawTrack() { // 根据自己的需求,使用高德地图的服务和组件来绘制轨迹 // 示例:使用 AMap.Polyline 组件绘制折线 const polyline = new AMap.Polyline({ // 折线选项配置 }); polyline.setMap(this.map); } } } ``` 在上述代码中,我们首先在组件的 mounted 钩子函数中调用 initMap 方法来初始化地图。在 initMap 方法中,我们加载了高德地图JS API,并在加载完成后初始化了地图对象。然后我们调用 drawTrack 方法来绘制轨迹,在该方法中可以使用高德地图提供的服务和组件来绘制所需的轨迹效果。 需要注意的是,示例中的 `your-amap-api-key` 需要替换为自己申请的高德地图 API Key。另外,根据具体需求,可能需要根据高德地图API 文档来配置轨迹的样式、数据等参数。 ### 回答3: 要使用高德 JS API UI 组件示例轨迹,首先需要确保已经引入了高德地图 API 的 JavaScript库以及相关的插件。 在 Vue 中,可以在页面中使用 script 标签引入高德地图 API 的 JavaScript库,并在 mounted 钩子函数中初始化地图,并根据需要引入用于绘制轨迹的插件。 具体步骤如下: 1. 首先在 index.html 文件的 head 标签中引入高德地图 API 的 JavaScript库,例如: ```html <script src="https://webapi.amap.com/maps?v=1.4.15&key=your_amap_api_key"></script> ``` 2. 在组件文件中,引入需要用到的高德地图插件,例如轨迹插件: ```javascript import 'AMap.MarkerClusterer'; import 'AMap.Marker'; // 其他需要的插件 ``` 3. 在 mounted 钩子函数中,初始化地图并使用相关的插件进行轨迹绘制,例如: ```javascript mounted() { // 初始化地图 const map = new AMap.Map('mapContainer', { center: [lng, lat], zoom: 10 }); // 绘制轨迹 const polyline = new AMap.Polyline({ path: [ // 轨迹点数组 [lng1, lat1], [lng2, lat2], [lng3, lat3], ... ], strokeColor: "#3366FF", // 线颜色 strokeOpacity: 1, // 线透明度 strokeWeight: 3, // 线宽度 map: map // 轨迹绘制在地图上 }); // 其他相关操作 } ``` 以上就是使用 Vue 框架中实现高德 JS API UI 组件示例轨迹的一般步骤。根据具体需求,还可以进一步自定义地图样式、轨迹样式等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值