zoukankan      html  css  js  c++  java
  • 聚合点算法实现

    最近项目需要做GPS点位的预警分析,其中有用到点聚集的分析。

    从网上找了一些文章看了下,结合别人的思路、例子进行了加工。

    具体的思路分析:

    1、数据存储类设计,一个的点的设计,一个是聚合点类;

        public class Point
        {
            /// <summary>
            /// 经度
            /// </summary>
            public double Longitude { get; set; }
    
            /// <summary>
            /// 纬度
            /// </summary>
            public double Latitude { get; set; }
        }
    
    
        public class Cluster
        {
            /// <summary>
            /// 聚类中心点
            /// </summary>
            public Point CenterPoint { get; set; }
    
            /// <summary>
            /// 聚集包含的点集
            /// </summary>
            public List<Point> Points { get; set; }
        }

    2、对于传入的一组点进行初始化,以及对聚类点的初始化;

        Cluster cluster = new Cluster()
        {
            CenterPoint = points[0],
            Points = new List<Point>
            {
                points[0]
            }
        };
        clusters.Add(cluster);

    3、对所有点进行遍历,找出距离最近的聚类点,如果距离最近的聚类点小于查找的半径,该点添加到该聚类点内,否则重新建一个聚类点;

    int n = points.Count;
    // 对所有的点进行遍历
    for (int i = 1; i < n; i++)
    {
        double distance = Radius + 1;
        int clusterIndex = 0;           // 存储距离最近的聚集类的索引
        // 对已有的聚类进行遍历,找出最近的一个聚类
        for (int j = 0; j < clusters.Count; j++)
        {
            double tempDistance = GeoDistance.GetDistance(clusters[j].CenterPoint, points[i]);
            if (tempDistance < distance)
            {
                distance = tempDistance;
                clusterIndex = j;
            }
        }
        if (distance <= Radius)
        {
            clusters[clusterIndex].Points.Add(points[i]);
            clusters[clusterIndex].CenterPoint.Latitude = clusters[clusterIndex].Points.Sum(t => t.Latitude) / clusters[clusterIndex].Points.Count;
            clusters[clusterIndex].CenterPoint.Longitude = clusters[clusterIndex].Points.Sum(t => t.Longitude) / clusters[clusterIndex].Points.Count;
        }
        else
        {
            cluster = new Cluster()
            {
                CenterPoint = points[i],
                Points = new List<Point>
                {
                    points[i]
                }
            };
            clusters.Add(cluster);
        }
    }

    最后得到的 clusters 就是聚类点集。

  • 相关阅读:
    restful规范以及drf框架
    vue的第三方插件,vuex,axios,element-ui ,jq+bs
    路由,生命周期钩子函数,数据间的交互,全局配置js与css
    实例成员补充,项目环境配置以及vue组件
    vue指令实例成员
    初识vue
    django中如何暴露后端任意文件资源
    django中间件以及请求生命流程图
    wraps修饰器
    cookie与session
  • 原文地址:https://www.cnblogs.com/zhurong/p/10023280.html
Copyright © 2011-2022 走看看