聚类

按燃料类型对全球发电厂进行聚类和分类。聚类汇总了图层的渲染器,因此您可以一目了然地查看要素的空间密度。

什么是聚类?

聚类是一种通过彼此之间的空间接近度将点要素分组为聚类来减少图层中点的方法。通常,聚类按每个聚类中的要素数按比例调整大小。

如果区域中的许多点相互叠加,则这是显示该区域的有效方法。

聚类允许您有效地可视化点叠加在另一点上或彼此非常接近的位置。使用上面的卷帘微件比较发电厂的未聚类图层与聚类版本。

为什么聚类分析很有用?

大型点图层可能具有欺骗性。看起来只有几个点,但实际上可能是几千个。聚类允许您在相对较小的区域中以可视化方式表示大量点。

例如,以下地图显示了数千个发电厂的位置。在下图中,区域 A 和 B 都具有高密度的点,因此无法进行比较。 

clustering disabled

区域 A 和区域 B 都具有高密度的点。无法判断每个区域中有多少个点重叠。

但是,启用聚类时,用户现在可以清楚地看到区域 B 的点数几乎是区域 A 的两倍。

classed with no label

聚类可使用户能够一目了然地轻松比较重叠要素的密度。

聚类的工作方式

聚类是在图层的 featureReduction 属性上配置的。通过将 featureReduction 类型设置为 cluster,可以使用最少的代码启用聚类。

   
1
2
3
layer.featureReduction = {
  type: "cluster"
};

featureReduction 属性使您可以控制许多其他聚类属性。clusterRadius 可定义每个聚类的影响区域以包括要素。您还可以为聚类定义 popupTemplateslabels,以汇总聚类中包含的要素。

示例

基本聚类

以下示例演示了如何在点图层上启用聚类,以及如何配置用于显示聚类计数的标注和弹出窗口。

在图层上启用聚类后,将生成聚类使用的聚合字段。默认情况下,所有聚类图层都具有 cluster_count 聚合字段。这可用于每个聚类的标注和弹出窗口。图层渲染器中使用的其他字段均可以在弹出窗口中显示。您可在 FeatureReductionCluster.popupTemplate 文档中了解有关如何使用它们的更多信息。

按计数聚类的全球发电厂。
GeoScene JS API
52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 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 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no" />

    <title>Point clustering - basic configuration</title>

    <link rel="stylesheet" href="https://js.geoscene.cn/4.23/geoscene/themes/light/main.css" />
    <script src="https://js.geoscene.cn/4.23/"></script>

    <style>
      html,
      body,
      #viewDiv {
        height: 100%;
        width: 100%;
        margin: 0;
        padding: 0;
        background-color: white;
    </style>

    <script>
      require([
        "geoscene/WebMap",
        "geoscene/views/MapView",
        "geoscene/layers/FeatureLayer"
      ], (
      ) => {
        const clusteredLayer = new FeatureLayer({
          portalItem: {
            id: "eb54b44c65b846cca12914b87b315169"
          renderer: {
            type: "simple",
            symbol: {
              type: "simple-marker",
              size: 6,
              color: "teal",
              outline: {
                color: "white",
                width: 0.5
        clusteredLayer.featureReduction = {
          type: "cluster",
          clusterMinSize: 16.5,
          // defines the label within each cluster
          labelingInfo: [
            {
              deconflictionStrategy: "none",
              labelExpressionInfo: {
                expression: "Text($feature.cluster_count, '#,###')"
              },
              symbol: {
                type: "text",
                color: "white",
                font: {
                  family: "Noto Sans",
                  size: "12px"
                }
              },
              labelPlacement: "center-center"
            }
          ],
          // information to display when the user clicks a cluster
          popupTemplate: {
            title: "Cluster Summary",
            content: "This cluster represents <b>{cluster_count}</b> features.",
            fieldInfos: [{
              fieldName: "cluster_count",
              format: {
                places: 0,
                digitSeparator: true
              }
            }]
          }
        };
        const map = new WebMap({
          basemap: {
            portalItem: {
              id: "75a08e8cd8b64dcfa6945bb7f624ccc5"
          layers: [clusteredLayer]
        const view = new MapView({
          container: "viewDiv",
          extent: {
            spatialReference: {
              latestWkid: 3857,
              wkid: 102100
            xmin: -15327459,
            ymin: 2740044,
            xmax: -6076744,
            ymax: 6878650
          popup: {
            dockEnabled: true,
            dockOptions: {
              breakpoint: false,
              position: "top-right"
          constraints: {
            snapToZoom: false
    </script>
  </head>

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

建议的聚类默认值

默认情况下,聚类符号始终汇总聚类中的要素。当图层具有 UniqueValueRenderer 时,每个聚类的符号表示聚类中要素的主要值。当图层应用了任何视觉变量时,可将聚类中每个变量的平均值应用于聚类符号。描述数值字段的主要类型和平均值的字段可以在聚类弹出窗口和标注中引用。

此示例使用智能制图方法演示了如何生成特定于图层渲染器的建议聚类配置。

按燃料类型对全球发电厂进行聚类和分类。聚类汇总了图层渲染器,因此您可以一目了然地查看聚类所包含的要素汇总。
GeoScene JS API
102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 122 122 122 122 122 122 122 122 122 122 122
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no" />

    <title> Point clustering - unique values</title>

    <link rel="stylesheet" href="https://js.geoscene.cn/4.23/geoscene/themes/light/main.css" />
    <script src="https://js.geoscene.cn/4.23/"></script>

    <style>
      html,
      body,
      #viewDiv {
        height: 100%;
        width: 100%;
        margin: 0;
        padding: 0;
        background-color: white;
    </style>

    <script>
      require([
        "geoscene/WebMap",
        "geoscene/views/MapView",
        "geoscene/layers/FeatureLayer",
        "geoscene/widgets/Legend",
        "geoscene/widgets/Expand",
        "geoscene/smartMapping/labels/clusters",
        "geoscene/smartMapping/popup/clusters"
      ], (
      ) => {
        const layer = new FeatureLayer({
          portalItem: {
            id: "eb54b44c65b846cca12914b87b315169"
        const map = new WebMap({
          basemap: {
            portalItem: {
              id: "75a08e8cd8b64dcfa6945bb7f624ccc5"
          layers: [layer]
        const view = new MapView({
          container: "viewDiv",
          extent: {
            spatialReference: {
              latestWkid: 3857,
              wkid: 102100
            xmin: -15327459,
            ymin: 2740044,
            xmax: -6076744,
            ymax: 6878650
          popup: {
            dockEnabled: true,
            dockOptions: {
              breakpoint: false,
              position: "top-right"
          constraints: {
            snapToZoom: false
          new Expand({
            content: new Legend({ view }),
          "top-left"
          .then( (featureReduction) => {
            // sets generated cluster configuration on the layer
          .catch((error) => {
            console.error(error);
        async function generateClusterConfig(layer) {
          // generates default popupTemplate
          const popupTemplate = await clusterPopupCreator
            .getTemplates({ layer })
            .then( (popupTemplateResponse) => popupTemplateResponse.primaryTemplate.value );

          // generates default labelingInfo
          const { labelingInfo, clusterMinSize } = await clusterLabelCreator
            .getLabelSchemes({
              layer,
              view
            })
            .then((labelSchemes) => labelSchemes.primaryScheme);

          // Set this object on layer.featureReduction
          return {
            type: "cluster",
            popupTemplate,
            labelingInfo,
            clusterMinSize
          };
    </script>
  </head>

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

API 支持

下表描述了非常适合每种可视化技术的几何和视图类型。

完全支持部分支持不支持
  • 1. 不支持通过选择减少要素
  • 2. 仅支持通过选择减少要素
  • 3. 仅支持比例驱动过滤

Your browser is no longer supported. Please upgrade your browser for the best experience. See our browser deprecation post for more details.

Navigated to 聚类