ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Winform WPF 绘制热力图组件 效果媲美B/S 热力图

2021-12-06 10:00:21  阅读:289  来源: 互联网

标签:2.0 double 力图 ret WPF pi Sin Math Winform


近期应客户的要求, 需要在地图中呈现热力图效果,我们知道在B/S中百度地图可以直接呈现热力图,相对要容易很多。在C/S中呈现的并不是特别完美。

既然客户有需求,就抽出半天时间给弄了一个热力图的组件。 近期跟GDI绘图组件干上了。 

没啥技术含量的一个小组件。 就是一个绘图,需要掌握GDI绘图要素。 由于是GDI绘图 在WPF中也会有独到的优势, 绘制热力图模版也可以进行完全自定义

整理了一下发现代码量也就400多行,还包含大量的回车符。支持地图源切换,公里标记,以及创建热力图。

在不同的Zoom中呈现对应的数据信息。 下面有个GIF动态图,相对比较大。 耐心等待。

 

 

 此窗口用的WPF ,需要考虑经纬度坐标的对应转换。

 

 

 

还需要注意在地图中需要对坐标的一个数据转换。

在网上随便找了一个转换坐标的处理。能用就行。 不做太精确。 等客户的数据对接即可。

public static double pi = 3.14159265358979324;


public static double a = 6378245.0;


public static double ee = 0.00669342162296594323;


public static double[] transform(double wgLat, double wgLon)
{
double[] latlng = new double[2];

double dLat = transformLat(wgLon - 105.0, wgLat - 35.0);
double dLon = transformLon(wgLon - 105.0, wgLat - 35.0);
double radLat = wgLat / 180.0 * pi;
double magic = Math.Sin(radLat);
magic = 1 - ee * magic * magic;
double sqrtMagic = Math.Sqrt(magic);
dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
dLon = (dLon * 180.0) / (a / sqrtMagic * Math.Cos(radLat) * pi);
latlng[0] = wgLat + dLat;
latlng[1] = wgLon + dLon;
return latlng;
}


private static double transformLat(double x, double y)
{
double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.Sqrt(Math.Abs(x));
ret += (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0;
ret += (20.0 * Math.Sin(y * pi) + 40.0 * Math.Sin(y / 3.0 * pi)) * 2.0 / 3.0;
ret += (160.0 * Math.Sin(y / 12.0 * pi) + 320 * Math.Sin(y * pi / 30.0)) * 2.0 / 3.0;
return ret;
}

private static double transformLon(double x, double y)
{
double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.Sqrt(Math.Abs(x));
ret += (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0;
ret += (20.0 * Math.Sin(x * pi) + 40.0 * Math.Sin(x / 3.0 * pi)) * 2.0 / 3.0;
ret += (150.0 * Math.Sin(x / 12.0 * pi) + 300.0 * Math.Sin(x / 30.0 * pi)) * 2.0 / 3.0;
return ret;
}

 

 贴出部分代码

 

 

 

放了一个控件,以及三个button按钮

private void MapExpansion_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{

}

private void MapExpansion_OnTileLoadComplete(long ElapsedMilliseconds)
{
//Console.WriteLine("加载时间: " + ElapsedMilliseconds);
}

private void MapExpansion_OnTileLoadStart()
{
//Console.WriteLine("开始加载: " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
}


public int MapProviderIndex
{
get
{
return (int)base.GetValue(MapExpansion.MapProviderIndexProperty);
}
set
{
base.SetValue(MapExpansion.MapProviderIndexProperty, value);
}
}
public static readonly DependencyProperty MapProviderIndexProperty = DependencyProperty.Register("MapProviderIndex", typeof(int), typeof(MapExpansion),
new FrameworkPropertyMetadata(0, new PropertyChangedCallback(MapExpansion.OnSourceMapProviderChanged)));

private static void OnSourceMapProviderChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)

mapExpansion.MapProvider = MapProviders.AMap; 
mapExpansion.Refresh();
}
}

功能没啥东西。

在就是融合用户的数据部分, 可将对应的热力点与地图上的所有经纬度进行整合。

算法也没啥东西。 根据具体的业务以及数据参数,进行处理热力数据业务即可。

如果需要看具体效果。可以看头条发了一个视频展示的效果更多一些。

视频效果地址:https://www.ixigua.com/7038095419494269455

 

标签:2.0,double,力图,ret,WPF,pi,Sin,Math,Winform
来源: https://www.cnblogs.com/liuyunsheng/p/15648539.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有