地理密度图是matlab2018以后才有的工具,对于更早版本,这里提出一种自编程的绘制方法。
A、没有地图衬托的热力图
已知的数据格式为坐标经纬度,数据量大概在200万行。图1:经纬度坐标,向量名gps
基本思路:
确定坐标的角点范围,也就是最大最小值;
确定计算间隔,经纬度的1°约为111km,则d1=1/111代表1km间隔;
利用meshgrid创建采样点;
以采样点为中心,网格为长度为边长,计算落入每一个网格的坐标数量;
利用surf绘制网格曲面
函数如下所示:%西安建筑科技大学 zuoyoutong
%2020.12.27
%功能:根据坐标密度绘制热力图,返回计算结果
% 输入:gps(lat,lon),d1(经纬度计算精度:1/111为1km),d2(显示精度)
% 输出:[x2,y2,z2],显示结果对应的三维数据
function [x2,y2,z2,boundary]=hot_map(gps,d1,d2)
%gps(gps(:,1)<10,:)=[];%删除空坐标行
boundary=[min(gps);max(gps)];%坐标范围
%d1=1/111*2;%网格间距,1代表111km
%网格坐标
a1=boundary(1,1):d1:boundary(2,1);
a2=boundary(1,2):d1:boundary(2,2);
[x1,y1]=meshgrid(a1,a2);%创建采样点
num1=size(x1);
%计算每个栅格点的范围,并重置为行向量
x11=reshape(x1-d1/2,1,[]);
x12=reshape(x1+d1/2,1,[]);
y11=reshape(y1-d1/2,1,[]);
y12=reshape(y1+d1/2,1,[]);
mm=(gps(:,1)>x11) & (gps(:,1)<=x12) & (gps(:,2)>y11) & (gps(:,2)<=y12);
z1=reshape(sum(mm),num1);
%定义显示精度d2=1/444;
a11=boundary(1,1):d2:boundary(2,1);
a21=boundary(1,2):d2:boundary(2,2);
[x2,y2]=meshgrid(a11,a21);%创建采样点
z2=interp2(x1,y1,z1,x2,y2,'spline');%spline
surf(x2,y2,z2,'FaceAlpha',0.8,