地理密度图是matlab2018以后才有的工具,对于更早版本,这里提出一种自编程的绘制方法。
A、没有地图衬托的热力图
已知的数据格式为坐标经纬度,数据量大概在200万行。
![4259b02f9722310b036d28b34254db67.png](https://img-blog.csdnimg.cn/img_convert/4259b02f9722310b036d28b34254db67.png)
基本思路:
确定坐标的角点范围,也就是最大最小值;
确定计算间隔,经纬度的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,'EdgeColor','none'); colorbar; |
---|