首页/新闻资讯/正文详情

使用 @turf/clusters-kmeans 对 GeoJSON 点要素执行 K-Means 空间聚类

发布时间:2026/9/25 17:46:44 来源:云帆数科 栏目:资讯中心
使用 @turf/clusters-kmeans 对 GeoJSON 点要素执行 K-Means 空间聚类
数据分析【免费下载链接】turfA modular geospatial engine written in JavaScript and TypeScript项目地址https://gitcode.com/gh_mirrors/tu/turf点击查看免费下载turf/clusters-kmeans是 Turf 地理空间引擎中的 K-Means 聚类模块输入一个由点要素Point组成的 FeatureCollection输出被划分为k个簇、并在每个要素属性中标注簇编号与簇质心的点集合。本文围绕该模块的 API 参数、返回结构、源码实现原理、配套聚类工具及测试基准展开帮助你在空间数据可视化、地理分组与降噪场景中直接落地使用。函数签名与参数说明clustersKmeans的完整签名如下源码见 packages/turf-clusters-kmeans/index.tsclustersKmeans( points: FeatureCollectionPoint, options?: { numberOfClusters?: number; mutate?: boolean; } ): FeatureCollectionPoint, KmeansProps参数类型默认值说明pointsFeatureCollectionPoint必填待聚类的点要素集合options.numberOfClustersnumberMath.round(Math.sqrt(count / 2))期望生成的簇数量k其中count为输入点的总数options.mutatebooleanfalse是否允许直接修改输入的 GeoJSON设为true时跳过克隆性能显著提升两个关键边界行为同样体现在源码中index.tsnumberOfClusters缺省时按Math.sqrt(count / 2)四舍五入自动推算无需人工指定当传入的numberOfClusters大于点的总数时会自动回退为点数count保证算法不会产生空簇。返回值cluster与centroid两个附加属性函数返回与输入同结构的FeatureCollectionPoint但每个要素的properties会被追加两个字段clusternumber该点所属的簇编号clusterId从0开始centroid[number, number]所属簇质心的经纬度坐标格式为[Longitude, Latitude]。对应的类型定义在 packages/turf-clusters-kmeans/index.ts 中type KmeansProps GeoJsonProperties { cluster?: number; centroid?: [number, number]; };因此你可以直接从每个要素的属性中读取分组结果例如feature.properties.cluster和feature.properties.centroid。快速上手示例以下示例来自模块 README随机生成 100 个点聚成 7 簇// 生成 bbox 内 100 个随机点 var points turf.randomPoint(100, { bbox: [0, 30, 20, 50] }); var options { numberOfClusters: 7 }; var clustered turf.clustersKmeans(points, options); // 用于地图叠加展示 var addToMap [clustered];借助 Turf 的配套工具可以很方便地把聚类结果拆回独立集合例如用getCluster取出cluster属性等于0的全部点详见 packages/turf-clusters/index.ts// 取出第 0 个簇的所有点 var cluster0 turf.getCluster(clustered, { cluster: 0 }); // 按 cluster 属性逐个遍历每个簇 turf.clusterEach(clustered, cluster, function (cluster, clusterValue, currentIndex) { // cluster 当前簇的点集合 // clusterValue 当前簇编号 // currentIndex 当前遍历索引 }); // 统计簇总数等价于 Array.reduce 语义 var total turf.clusterReduce(clustered, cluster, function (previousValue) { return previousValue 1; }, 0);源码实现原理从坐标收集到质心标注clustersKmeans内部依赖 skmeans完整流程可以拆解为四步对应 index.ts参数归一化计算默认numberOfClusters并对超出点数的取值做回退防止副作用当mutate ! true时先通过turf/clone深克隆输入保证原始 GeoJSON 不被污染坐标收集与初始化用coordAll来自turf/meta把所有点的坐标抽成纯数组data并以data.slice(0, numberOfClusters)取前k个坐标作为初始质心seed从而避免 skmeans 初始化漂移导致结果不稳定聚类与标注调用skmeans(data, numberOfClusters, initialCentroids)得到每个点的簇归属idxs与质心集合centroids最后通过featureEach把cluster和centroid写回每个要素的属性。正是第 3 步的固定初始质心策略让相同输入下重复调用会得到稳定的结果这比随机初始化更利于测试与复现。参数深入mutate的性能含义mutate参数对应的是“是否跳过克隆”mutate: false默认先clone(points)再在副本上写属性输入数据保持原样mutate: true直接原地修改传入的 FeatureCollection省去整份深拷贝的开销。测试 packages/turf-clusters-kmeans/test.ts 对两种模式都有断言验证默认模式下原输入点属性的cluster仍为undefined而mutate: true调用后原输入属性已被写入cluster。若你的输入数据是一次性的例如刚生成完的随机点、加载后不再复用的数据集开启mutate可以获得明显的性能收益若输入还要继续复用请保持默认值。类型体验与自定义属性透传模块提供了独立的类型校验文件 packages/turf-clusters-kmeans/types.ts其中演示了读取properties.cluster与properties.centroid时类型分别为number与[number, number]若试图把cluster赋值为foo或把centroid赋值为字符串TypeScript 会直接报类型错误调用时numberOfClusters、mutate均为可选可省略全部 options要素原有的自定义属性如properties.foo在聚类后依然可以访问说明函数不会清空原有属性测试 test.ts 同样验证了foo: bar被保留。测试夹具与基准表现模块的测试与基准都基于test/in目录下的 5 份 GeoJSON 夹具见 test 目录fiji.geojson斐济周边 6 个点many-points.geojson约 4000 个点的压力数据集points-with-properties.geojson带自定义属性的点集points1.geojson/points2.geojson在要素集合顶层properties.numberOfClusters中显式指定簇数分别为 3 和 4的小数据集见 points1.geojson。运行方式package.json 脚本见 packages/turf-clusters-kmeans/package.json# 运行 tape 单元测试 pnpm test:tape # 运行 benchmark 基准测试 pnpm bench # 校验类型 pnpm test:typesbench.ts 中记录了各数据集的耗时参考不同机器会有差异many-points约 35ms 级别fiji、points-with-properties在毫秒级小数据集在 0.1ms 量级。测试中还展示了典型的聚类可视化方案用chromatism为每个簇分配颜色、用turf/centroid计算簇质心点、用concaveman生成簇的凹包多边形见 test.ts这一套组合可以直接迁移到你的地图渲染管线中。安装与引入方式与其他 Turf 模块一致支持单模块安装与全家桶安装两种方式# 仅安装本模块 $ npm install turf/clusters-kmeans # 安装包含全部模块的 turf/turf $ npm install turf/turf从turf/turf引入时通过turf.clustersKmeans调用若单独安装本模块则直接import { clustersKmeans } from turf/clusters-kmeans;使用注意事项小结points必须是FeatureCollectionPoint非点要素集合不在本模块支持范围内显式指定numberOfClusters时应结合数据规模与业务语义权衡默认的sqrt(count/2)适合大多数场景对结果做后续分析时优先使用turf/clusters的getCluster/clusterEach/clusterReduce避免手写属性过滤需要高性能处理大数据量点集时开启mutate: true可减少克隆开销但请确认输入数据可被修改由于初始质心取自前k个点极端情况下如点顺序特殊、数据量极小聚类结果会受输入顺序影响可通过显式指定簇数并结合业务校验来规避。赞分享数据分析【免费下载链接】turfA modular geospatial engine written in JavaScript and TypeScript项目地址https://gitcode.com/gh_mirrors/tu/turf点击查看免费下载相关推荐turf/clusters-dbscan使用 DBSCAN 算法对 GeoJSON 点要素进行空间聚类turf/clusters dbscan使用 DBSCAN 算法对 GeoJSON 点要素进行空间聚类 导读 turf/clusters dbscan 是数据分析turf/collect 详解使用 Turf 将点要素属性按多边形空间聚合turf/collect 详解使用 Turf 将点要素属性按多边形空间聚合 导读 turf/collect 是 Turf 地理引擎中的一个空间聚合模块它数据分析使用 turf/clusters 处理 GeoJSON 聚类数据getCluster、clusterEach 与 clusterReduce 实战指南使用 turf/clusters 处理 GeoJSON 聚类数据getCluster、clusterEach 与 clusterReduce 实战指南 导读数据分析上一篇langchain/weaviate 演进全解析从 LangChain v1.0 兼容到 jsonSchema 原生支持下一篇Megatron-LM 对象存储训练与检查点管理实战Multi-Storage Client (MSC) 集成完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

数据迁移工具别只当“搬运工”:一份KDMS评估报告,是怎么把我从加班里捞出来的
数据迁移工具别只当“搬运工”:一份KDMS评估报告,是怎么把我从加班里捞出来的

先说个不太体面的现场。晚上十一点,迁移群里还在刷消息。业务问:“今晚能不能切?”开发回:“存储过程那边还有点问题。”DBA发了张截图,执行计划看着不太对,但谁也说不清是统计信息没跑,还是索引… · 2026/9/25 17:46:44

Apache Beam GCP 安全日志分析器:从 Log Sink 配置到每周 IAM 安全告警的自动化实践
Apache Beam GCP 安全日志分析器:从 Log Sink 配置到每周 IAM 安全告警的自动化实践

大数据批处理流处理数据工程 【免费下载链接】beam Apache Beam is a unified programming model for Batch and Streaming data processing. 项目地址: https://gitcode.com/gh_mirrors/beam4/beam 点击查看 免费下载 Apache Beam 仓库的 infra/security 模块 实现… · 2026/9/25 17:46:38

EMQX 规则引擎 republish 动作的 Namespace 隔离修复:limit_selects_in_namespace 行为详解
EMQX 规则引擎 republish 动作的 Namespace 隔离修复:limit_selects_in_namespace 行为详解

后端物联网消息队列通信 【免费下载链接】emqx The most scalable and reliable MQTT broker for AI, IoT, IIoT and connected vehicles 项目地址: https://gitcode.com/gh_mirrors/em/emqx 点击查看 免费下载 导读 本文围绕 EMQX 规则引擎(Rule Engi… · 2026/9/25 17:46:26

只用一个问题训练几百步,模型居然还在变强:一篇论文的意外发现
只用一个问题训练几百步,模型居然还在变强:一篇论文的意外发现

先说一件让人有点摸不着头脑的事。有研究团队拿出一个数学题,就一道题,反复喂给模型训练了上千步。按常理这事儿应该很快就练废了,一道题能有多少信息量?可结果是,模型的准确率一路涨,涨到接近用全部一万七千道题训练出来的效果的七成二。这不是巧合,也… · 2026/9/25 18:25:34

Atlas 300V 24G实战:从NPU选型到YOLO生产级部署
Atlas 300V 24G实战:从NPU选型到YOLO生产级部署

刚拿到Atlas 300V 24G这块卡的时候,我第一反应也是——这不就是一块显存比较大的“图像处理卡”吗?直到把YOLO模型完整跑完一遍,才真正搞明白它和普通GPU加速卡的区别。这篇文章不整虚的,就围绕两个实际问题展开:Atlas… · 2026/9/25 18:25:34

小模型能当裁判吗?一场关于强化学习奖励成本的实验
小模型能当裁判吗?一场关于强化学习奖励成本的实验

先问你一个问题。如果你要训练一个AI模型写深度研究报告,怎么判断它写得好不好?数学题有标准答案,代码题能跑测试用例,可一篇论文该不该给9分还是7分,谁说了算?过去几年,大模型圈子里流行的做法… · 2026/9/25 18:25:27

数据闭环分层抽帧策略从 TB 级采集数据中提取高价值帧:三道成本闸门
数据闭环分层抽帧策略从 TB 级采集数据中提取高价值帧:三道成本闸门

上一篇讲完了挖掘平台的架构骨架,从这篇开始填血肉。平台拿到采集数据后做的第一件事是「抽帧」——把视频形态的 clip 变成一张张图片。为什么必须做这一步?因为下游所有能力都是「认图不认视频」的:VLM 推理要喂图片,Embedding … · 2026/9/25 18:25:27

Atlas 300V 24G推理卡实战:从CANN环境搭建到YOLOv5模型部署全流程
Atlas 300V 24G推理卡实战:从CANN环境搭建到YOLOv5模型部署全流程

先给结论:Atlas 300V 24G确实是一张“运算加速卡”,但你要是拿它当普通图形卡用,就完全理解偏了。它是一张面向AI推理场景的加速卡,最近“atlas部署yolo”这么热,主要还是因为这卡性价比够看、国产化适配到位&#xff… · 2026/9/25 18:25:27

把已经跑过的智能体聊天记录,重新变成能用的编程练习场
把已经跑过的智能体聊天记录,重新变成能用的编程练习场

2014 年,语音识别领域有一件让所有人挠头的事:训练一个能听懂人说话的模型,需要成千上万小时的标注音频。可标注音频这东西,贵、慢、还容易出错。十年后,AI 编程智能体(就是那种能在命令行里帮你写代码、修… · 2026/9/25 18:25:27

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码