Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >如何在地图上寻找最密集点的位置?

如何在地图上寻找最密集点的位置?

作者头像
xindoo
发布于 2024-08-07 02:13:20
发布于 2024-08-07 02:13:20
13400
代码可运行
举报
文章被收录于专栏:XINDOO的专栏XINDOO的专栏
运行总次数:0
代码可运行

  最近我在工作中遇到了一个小的需求点,大概是需要在地图上展示出一堆点中的点密度最密集的位置。最开始没想到好的方法,就使用了一个非常简单的策略——所有点的坐标求平均值,这个方法大部分的时候好用,因为大部分城市所有点位基本上都是围绕某个中心点向四周发散的。但我们实际在线上使用的时候,遇到了两个特殊的case。

  首先就是当点位分布呈现出异形,比如哑铃型数据分布在两头,你们求平均值的方法就会找到中间数据密度最稀疏的地方,就比如我们在成都的数据上遇到的一样,下图中的红色点位就是按平均值求出来的中心点。

  另外一种异常case就是数据呈现圆周分布的时候,比如北京的数据,北京的中心是故宫,我们不可能会有点位,如果直接求平均值的话,计算出来的中心点就在故宫附近,这里的数据反而是最稀疏的,如下图所示。

  后来查询资料,了解到核密度这一方法可以解决我们所遇到的问题,经过实验后发现效果还不错,所以在这里分享给大家。 核密度的思路也很简单,就是遍历所有的点位,计算其他点到当前点的核密度总值,然后找出平均密度最大的点。举个简单例子,给定一个点,如果其他某个点距这个点距离近,密度值就高,反之就远,这个点到其他所有点的密度和求平均就是这个点最终的密度值,这里我们可以直接选用距离的倒数来当成核函数,不过这个核函数是线性的,最终结果和我求平均值差异不大。

  优化下思路,如果某个点的距离越远,是不是其带来的密度值应该越小? 前人也是这么想的,于是就有了很多非线性核函数,而我最终使用了高斯核,调整好核函数的带宽后,其他点带来的密度值也会随着距离,以正态分布的方式衰减如下图,举例越远纵轴的坐标值越低,图中的sigma就是我们核函数的里的带宽。

  接下来看下计算过程和效果,由于我们是Java系统,我的最终实现是用了java调用了simle包,整体代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    private double[] getHotpot(double[][] data) {
        // 创建高斯核
        MercerKernel<double[]> kernel = new GaussianKernel(0.02);

        // 计算所有点的核密度估计
        double[] densities = new double[data.length];
        for (int i = 0; i < data.length; i++) {
            for (int j = 0; j < data.length; j++) {
                densities[i] += kernel.k(data[i], data[j]);
            }
            // 计算平均密度
            densities[i] /= data.length;
        }

        // 找出密度最大的点
        int maxDensityIndex = 0;
        for (int i = 1; i < densities.length; i++) {
            if (densities[i] > densities[maxDensityIndex]) {
                maxDensityIndex = i;
            }
        }
        return data[maxDensityIndex];
    }

  这里我带宽(高斯核中的sigma)用了0.02,这个也是多次调试后的结果,如果过大会导致算出来的密度值更接近于全局平均值,过小的话会出现几个点集中在一起,但周围没有其他点的情况,我们还是拿上面两个异常的case看下核密度方法的效果。 首先就是成都哑铃型的数据。

再来就是北京的环形数据

  上面的图中,我使用了python中的sklearn来实现核密度,使用了folium来绘制地图,完整的代码也贴出来供大家参考。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*-
import folium
import pandas as pd
from sklearn.neighbors import KernelDensity
import numpy as np

def getCenterPoint(sites):
    points = sites[['latitude', 'longitude']].values
    weights = sites['score'].values

    # 实例化KernelDensity对象
    kde = KernelDensity(kernel='gaussian', bandwidth=0.02)

    # 对数据进行拟合
    kde.fit(points) 

    # 使用KDE模型评估每个点的密度
    log_densities = kde.score_samples(points)

    # 密度最高的点是评估密度最高(即,log_densities值最大)的点
    highest_density_point = points[np.argmax(log_densities)]

    print(highest_density_point.tolist())
    return highest_density_point.tolist()

# 创建一个以给定经纬度为中心的地图,初始缩放级别设为14
m = folium.Map(zoom_start=14)

for i, s in data.iterrows():
    # 在地图上添加一个点标记
    folium.Marker(
        location=[s['latitude'], s['longitude']],  # 经纬度
        popup=s['resblock'], 
    ).add_to(m)
# 保存为html文件
centerPoint = getCenterPoint(cityDf)
folium.Marker(
    location=centerPoint,  # 经纬度
    popup='中心点',  # 弹出内容
    radius=50,
    icon=folium.Icon(color="red", icon="info-sign")
).add_to(m)

m.location = centerPoint

m.save('map.html')
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-08-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
核密度估计和非参数回归
你可能听说过核密度估计(KDE:kernel density estimation)或非参数回归(non-parametric regression)。你甚至可能在不知不觉的情况下使用它。比如在Pyt
deephub
2020/12/24
1.8K0
2020年美赛A题总结
更新 最近很多朋友都想看一看论文,我平时不怎么上csdn,可能无法及时发给大家,故上传了论文资源。 祝大家美赛顺利! https://download.csdn.net/download/hroukie/14727940
全栈程序员站长
2022/08/11
1.4K0
2020年美赛A题总结
Python可视化笔记之folium交互地图
leftlet给R语言提供了很好用的交互式动态地图接口,其在Python中得API接口包名为folium(不知道包作者为何这样起名字,和leaflet已经扯不上关系了),可以满足我们平时常用的热力图、填充地图、路径图、散点标记等高频可视化场景。
数据小磨坊
2018/07/25
3K0
Python可视化笔记之folium交互地图
各种聚类算法的介绍和比较「建议收藏」
聚类就是按照某个特定标准(如距离准则)把一个数据集分割成不同的类或簇,使得同一个簇内的数据对象的相似性尽可能大,同时不在同一个簇中的数据对象的差异性也尽可能地大。即聚类后同一类的数据尽可能聚集到一起,不同数据尽量分离。
全栈程序员站长
2022/07/31
6.7K0
各种聚类算法的介绍和比较「建议收藏」
使用python-sklearn-机器学习框架针对140W个点进行kmeans基于密度聚类划分
任务需求:现有140w个某地区的ip和经纬度的对应表,根据每个ip的/24块进行初步划分,再在每个区域越100-200个点进行细致聚类划分由于k值未知,采用密度的Mean Shift聚类方式。
十四君
2019/11/27
1.6K0
使用python-sklearn-机器学习框架针对140W个点进行kmeans基于密度聚类划分
R语言非参数回归预测摩托车事故、收入数据:局部回归、核回归、LOESS可视化
非参数回归为经典(参数)回归方法提供了一种灵活的替代方法。与假定回归关系具有依赖于有限数量的未知参数的已知形式的传统(参数)方法不同,非参数回归模型尝试从数据样本中学习回归关系的形式(点击文末“阅读原文”获取完整代码数据)。
拓端
2025/04/15
1610
R语言非参数回归预测摩托车事故、收入数据:局部回归、核回归、LOESS可视化
一文详尽解释K-means算法
K-means 是我们最常用的基于距离的聚类算法,其认为两个目标的距离越近,相似度越大。
石晓文
2019/11/21
1.4K0
机器学习统计概率分布全面总结(Python)
在平时的科研中,我们经常使用统计概率的相关知识来帮助我们进行城市研究。因此,掌握一定的统计概率相关知识非常有必要。
算法进阶
2023/12/26
5880
机器学习统计概率分布全面总结(Python)
Chapter 6:Similarity-Based Methods
,其中Q是一个半正定的协方差矩阵,是多维度数据之间的方差。马氏距离比高斯距离考虑的更全面,因为他把数据的维度和数据的大小都考虑了进来。中间的Q矩阵就是起到这个作用,
西红柿炒鸡蛋
2019/03/05
6640
手把手教你用Python进行城市公交网络分析与可视化
总的数据有 30396 条,站名称缺失了 5 条,纬度(分)缺失了 1 条,经度(分)缺失了 38 条,为了处理方便,直接把有缺失值的行删除。
Python进阶者
2021/03/09
2.7K0
手把手教你用Python进行城市公交网络分析与可视化
【带着canvas去流浪(5)】绘制K线图
使用原生canvasAPI绘制K线图。(截图以及数据来自于百度Echarts官方示例库【查看示例链接】)。
大史不说话
2019/04/18
9510
【带着canvas去流浪(5)】绘制K线图
用Python快速分析和预测股票价格
某天,我的一个朋友告诉我说,实现经济自由的关键是股票投资。虽然这是市场繁荣时期的真理,但如今业余交易股票仍然是一个有吸引力的选择。由于在线交易平台的便利性,涌现了许多自主价值投资者或家庭主妇交易员。甚至还有一些成功的故事和广告吹嘘有“快速致富计划”学习如何投资回报率高达 40% 甚至更高的股票。投资已成为当今职场人士的福音。
数据森麟
2019/09/27
4K0
用Python快速分析和预测股票价格
全面解析Kmeans聚类算法(Python)
Clustering (聚类)是常见的unsupervised learning (无监督学习)方法,简单地说就是把相似的数据样本分到一组(簇),聚类的过程,我们并不清楚某一类是什么(通常无标签信息),需要实现的目标只是把相似的样本聚到一起,即只是利用样本数据本身的分布规律。
算法进阶
2022/06/02
2.1K0
全面解析Kmeans聚类算法(Python)
用编程赋能工作系列——地理围栏的基本操作运算
接着上一篇的地图系列相关知识,本篇给大家介绍一种局部空间分析的地理围栏运算,具体场景主要用在分析局部的商圈、商场、街道、步行街内部相关变量方面。
数据小磨坊
2020/03/06
2.9K1
用编程赋能工作系列——地理围栏的基本操作运算
基于MeanShift的目标跟踪算法及实现
大家好,又见面了,我是你们的朋友全栈君。 这次将介绍基于MeanShift的目标跟踪算法,首先谈谈简介,然后给出算法实现流程,最后实现了一个单目标跟踪的MeanShift算法【matlab/c两个版本】
全栈程序员站长
2022/09/18
8900
基于MeanShift的目标跟踪算法及实现
NASA数据集——加拿大西北地区(NWT)2014 年被野火烧毁的北方森林的实地数据
ABoVE: Characterization of Carbon Dynamics in Burned Forest Plots, NWT, Canada, 2014
此星光明
2024/05/24
700
NASA数据集——加拿大西北地区(NWT)2014 年被野火烧毁的北方森林的实地数据
干货 | kNN 的花式用法
AI 科技评论按,本文作者韦易笑,本文首发于知乎专栏简单代码(zhuanlan.zhihu.com/skywind3000),AI 科技评论获其授权转载。以下为原文:
AI科技评论
2019/05/15
9750
干货 | kNN 的花式用法
这40个Python可视化图表案例,强烈建议收藏!
不过有些小伙伴也会遇到不少问题,比如选择何种图表,以及如何制作,代码如何编写,这些都是问题!
小F
2021/09/14
4.3K0
UCB Data100:数据科学的原理和技巧:第六章到第十章
上一堂课,我们了解了定量和定性变量类型之间的区别。后者包括字符串数据——第 6 讲的主要焦点。在本笔记中,我们将讨论操纵文本所需的工具:python字符串操作和正则表达式。
ApacheCN_飞龙
2024/01/13
6560
UCB Data100:数据科学的原理和技巧:第六章到第十章
2013年 阿拉斯加巴罗活动层厚度和土壤含水量
Pre-ABoVE: Active Layer Thickness and Soil Water Content, Barrow, Alaska, 2013
此星光明
2024/06/11
860
2013年 阿拉斯加巴罗活动层厚度和土壤含水量
推荐阅读
相关推荐
核密度估计和非参数回归
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验