1.GIS点聚类:

聚类:GIS点聚类是一种空间分析方法,专门用于识别和划分地理信息系统中分散的点状数据,使其按照特定属性或空间关系聚集成若干个具有相似特征的簇群。


2.前期准备

2.1 配置arcgis api

文章使用前端框架为vue3 setup,使用其他框架或者原生JS的小伙伴也可以参考本篇文章,如果有特殊需求或者问题可以咨询博主Q1476701700

  2.1.1 安装arcgis api 

npm install @arcgis/core@4.29

  2.1.2 引入CSS

     在vue项目中找到“index.html”,引入外部的CSS文件,粘贴到哪里见下图(非常贴心的)

<link rel="stylesheet" href="https://js.arcgis.com/4.29/esri/themes/light/main.css" />

  2.1.3 准备数据

这里博主给大家准备的数据是.csv文件,有些小伙伴在做聚类分析时发现运行时没有报错也没有显示聚类效果,可能是数据不对噢!

    以下为聚类分析所用数据的注意点:

    1.数据表头必须有"X"和"Y",其对应的就是经度和纬度,不要搞反了,也不要用其他命名。

    2.csv文件的编码最好为“UTF-8”,“UTF-8-BOM”应该也不行,需要转码的话推荐使用“notepad++”这个IDE,特别特别好用,其他博主有详细安装教程→notepad++安装教程超级简单!

(根据博主给的数据进行参考,绝对不会出错)

  2.1.4 数据存放

    全栈程序猿应该有自己的云服务器吧,以及自己搭后台,然后把需要分析的数据放在后台。这里可以教大家个简单方法,把数据放vue项目的public文件夹下,该文件夹用于存放不需要通过Webpack打包处理的静态资源,如图片、字体文件、favicon.ico等,方便但不安全!


3.代码示例

博主先贴上代码,后面再逐一讲解要点,可能不是很详细,但是作为CV工程师的你肯定很快就上手了吧

<script setup>
import { onMounted, ref } from "vue";
import Map from "@arcgis/core/Map";
import MapView from "@arcgis/core/views/MapView";
import CSVLayer from "@arcgis/core/layers/CSVLayer";

onMounted(() => {
  MapInit();
});

// 全局地图实例
let view;
let map;

// 聚类
let isclustering = ref("取消聚类");
let Crime_clustering;
let Crime_clustering_layer;

function MapInit() {
  //↓==========================================================================================
  //  犯罪点聚类
  Crime_clustering = {
    type: "cluster",
    clusterRadius: "50px",
    popupTemplate: {
      title: "犯罪案件聚类",
      content: "总共{cluster_count}个案件",
    },
    //聚类圆形最小值
    clusterMinSize: "10px",
    //聚类圆形最大值
    clusterMaxSize: "50px",
    labelingInfo: [
      {
        deconflictionStrategy: "none",
        labelExpressionInfo: {
          //统计数字的显示与显示格式
          expression: "Text($feature.cluster_count, '#,###')", //显示统计数字
        },
        symbol: {
          type: "text",
          color: "#FFFFF",
          font: {
            //统计数字的字体颜色
            weight: "bold",
            // family: "Noto Sans",
            //统计数字的字体大小
            size: "10px",
          },
          // 调整标注的水平偏移量,使其向左偏移
          //xoffset: -20,
          // 调整标注的垂直偏移量,使其显示在图标的正上方
          //yoffset: -30,
        },
        //聚类统计的数字居中对齐
        labelPlacement: "above-center",
      },
    ],
  };
  Crime_clustering_layer = new CSVLayer({
    url: "http://127.0.0.1:5173/csv/Crimes_2016Q4_handle.csv",
    featureReduction: Crime_clustering,
    popupTemplate: {
      title: "{type}",
      content: [
        {
          type: "fields",
          fieldInfos: [
            {
              fieldName: "type",
              label: "案件",
            },
            {
              fieldName: "Brief_description",
              label: "描述",
            },
            {
              fieldName: "时间",
              label: "Date",
            },
            {
              fieldName: "Block",
              label: "地点",
            },
          ],
        },
      ],
    },
  });
  //  犯罪点聚类
  //↑==========================================================================================

  map = new Map({
    basemap: {
      style: {
        id: "arcgis/streets-night",
        language: "zh-CN",
      },
    },

    layers: [Crime_clustering_layer],
  });
  view = new MapView({
    container: "map_box",
    map: map,
    center: [-87.69878684514447, 41.830316350748234],
    scale: 200000,
  });
  // 不显示底部logo
  view.ui.remove("attribution");
  // 不显示层级缩放组件
  view.ui.remove("zoom");
  // 地图旋转-60°
  view.rotation = -60;
}
function clusteringClick() {
  if (isclustering.value == "取消聚类") {
    isclustering.value = "开始聚类";
    // 取消聚类
    Crime_clustering_layer.featureReduction = null;
  } else {
    isclustering.value = "取消聚类";
    // 开始聚类
    Crime_clustering_layer.featureReduction = Crime_clustering;
  }
}
</script>

<template>
  <div id="map_box"></div>
  <button class="clusteringBtn" @click="clusteringClick()">
    {{ isclustering }}
  </button>
</template>

<style>
#map_box {
  position: absolute;
  left: 0.5vw;
  top: 1vh;
  height: 56vh;
  width: 71vw;
  background: rgba(74, 122, 172, 0.1);
}
.clusteringBtn {
  position: absolute;
  bottom: 1vh;
  right: 1vw;
  z-index: 100;
}
</style>

    代码这么长汗流浃背了吧,先别慌,这是vue完整代码示例当然多啦,核心代码就那一段。接下里我逐一讲解:

    1、数据地址“url”不一定和我是一模一样的,大家注意自己的vue项目运行端口号,这个其实就是获取我放在public下的静态资源。

    2、对于popupTemplate(点击打开弹窗)的代码,大家可以对照着我给的数据进行理解。这里的"fieldName:type"可以对应到数据表头"type",就是大家理解的那个属性字段;而"label:'案件'"就是字段名。

(ps:创作不易,如果文章对你有帮助,感谢点个赞鼓励下博主哟,后续还会继续发布webgis开发案例。如果有特殊需求或者问题可以咨询博主Q1476701700) 

GitHub 加速计划 / vu / vue
80
16
下载
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
最近提交(Master分支:4 个月前 )
73486cb5 * chore: fix link broken Signed-off-by: snoppy <michaleli@foxmail.com> * Update packages/template-compiler/README.md [skip ci] --------- Signed-off-by: snoppy <michaleli@foxmail.com> Co-authored-by: Eduardo San Martin Morote <posva@users.noreply.github.com> 6 个月前
e428d891 Updated Browser Compatibility reference. The previous currently returns HTTP 404. 6 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐