百度地图热力图--批量地址转换应用(基于百度api)

需求:把外卖订餐地址做个用户分布热力图

思路分析:第一步去百度地图api开放平台找例子 http://lbsyun.baidu.com/jsdemo.htm#c1_15

首先从百度API的demo例子参考静态页面,其中数据格式是

然后我们就想把数据库里的地址批量转换但是百度API没有提供批量转换的接口。
但是我们找到了百度webapi单个地址转换的接口

利用这个接口,在后台读取地址和统计个数,返回一个json

用HttpWebRequest去发起get请求返回json,在把返回的json转成对象

这里套了三层,所以数据结构构造成这样(一开始不这么写获取是null)

单个地址转换写好了,下面用一个list<T>装一下,foreach遍历依次赋值,用个一般处理程序得到json

最后把前台界面的数组换成ajax请求数据,要把async设置成false同步请求,不然就会跳过这里往下执行,这里用匿名函数返回一个数组

最后结果

代码:

 1  public static T RequestApi<T>(string address)
 2       {
 3           string apiUrl = "http://api.map.baidu.com/geocoder/v2/";
 4           string apiKey = "6Gra1QZ4gWrsrUgirWZ0Z1NdfFrh0mD3"; //
 5           string output = "json";
 6
 7           IDictionary<string, string> param = new Dictionary<string, string>();
 8           param.Add("ak", apiKey);
 9           param.Add("output", output);
10
11
12           param.Add("address", address);
13
14           string result = string.Empty;
15
16           //初始化方案信息实体类。
17           T info = default(T);
18           try
19           {
20               //以 Get 形式请求 Api 地址
21               result = HttpUtils.DoGet(apiUrl, param);
22               info = JsonHelper.FromJson<T>(result);
23           }
24           catch (Exception)
25           {
26               info = default(T);
27               throw;
28           }
29
30           return info;
31       }
  1 public class HttpUtils
  2     {
  3         /// <summary>
  4         /// 执行HTTP GET请求。
  5         /// </summary>
  6         /// <param name="url">请求地址</param>
  7         /// <param name="parameters">请求参数</param>
  8         /// <returns>HTTP响应</returns>
  9         public static string DoGet(string url, IDictionary<string, string> parameters)
 10         {
 11             if (parameters != null && parameters.Count > 0)
 12             {
 13                 if (url.Contains("?"))
 14                 {
 15                     url = url + "&" + BuildPostData(parameters);
 16                 }
 17                 else
 18                 {
 19                     url = url + "?" + BuildPostData(parameters);
 20                 }
 21             }
 22
 23             HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
 24             req.ServicePoint.Expect100Continue = false;
 25             req.Method = "GET";
 26             req.KeepAlive = true;
 27             req.UserAgent = "Test";
 28             req.ContentType = "application/x-www-form-urlencoded;charset=utf-8";
 29
 30             HttpWebResponse rsp = null;
 31             try
 32             {
 33                 rsp = (HttpWebResponse)req.GetResponse();
 34             }
 35             catch (WebException webEx)
 36             {
 37                 if (webEx.Status == WebExceptionStatus.Timeout)
 38                 {
 39                     rsp = null;
 40                 }
 41             }
 42
 43             if (rsp != null)
 44             {
 45                 if (rsp.CharacterSet != null)
 46                 {
 47                     Encoding encoding = Encoding.GetEncoding(rsp.CharacterSet);
 48                     return GetResponseAsString(rsp, encoding);
 49                 }
 50                 else
 51                 {
 52                     return string.Empty;
 53                 }
 54             }
 55             else
 56             {
 57                 return string.Empty;
 58             }
 59         }
 60
 61         /// <summary>
 62         /// 把响应流转换为文本。
 63         /// </summary>
 64         /// <param name="rsp">响应流对象</param>
 65         /// <param name="encoding">编码方式</param>
 66         /// <returns>响应文本</returns>
 67         private static string GetResponseAsString(HttpWebResponse rsp, Encoding encoding)
 68         {
 69             StringBuilder result = new StringBuilder();
 70             Stream stream = null;
 71             StreamReader reader = null;
 72
 73             try
 74             {
 75                 // 以字符流的方式读取HTTP响应
 76                 stream = rsp.GetResponseStream();
 77                 reader = new StreamReader(stream, encoding);
 78
 79                 // 每次读取不大于256个字符,并写入字符串
 80                 char[] buffer = new char[256];
 81                 int readBytes = 0;
 82                 while ((readBytes = reader.Read(buffer, 0, buffer.Length)) > 0)
 83                 {
 84                     result.Append(buffer, 0, readBytes);
 85                 }
 86             }
 87             catch (WebException webEx)
 88             {
 89                 if (webEx.Status == WebExceptionStatus.Timeout)
 90                 {
 91                     result = new StringBuilder();
 92                 }
 93             }
 94             finally
 95             {
 96                 // 释放资源
 97                 if (reader != null) reader.Close();
 98                 if (stream != null) stream.Close();
 99                 if (rsp != null) rsp.Close();
100             }
101
102             return result.ToString();
103         }
104
105         /// <summary>
106         /// 组装普通文本请求参数。
107         /// </summary>
108         /// <param name="parameters">Key-Value形式请求参数字典。</param>
109         /// <returns>URL编码后的请求数据。</returns>
110         private static string BuildPostData(IDictionary<string, string> parameters)
111         {
112             StringBuilder postData = new StringBuilder();
113             bool hasParam = false;
114
115             IEnumerator<KeyValuePair<string, string>> dem = parameters.GetEnumerator();
116             while (dem.MoveNext())
117             {
118                 string name = dem.Current.Key;
119                 string value = dem.Current.Value;
120                 // 忽略参数名或参数值为空的参数
121                 if (!string.IsNullOrEmpty(name) && !string.IsNullOrEmpty(value))
122                 {
123                     if (hasParam)
124                     {
125                         postData.Append("&");
126                     }
127
128                     postData.Append(name);
129                     postData.Append("=");
130                     postData.Append(Uri.EscapeDataString(value));
131                     hasParam = true;
132                 }
133             }
134
135             return postData.ToString();
136         }
137
138     }
 1 public static class JsonHelper
 2     {
 3         private static JsonSerializerSettings _jsonSettings;
 4
 5         static JsonHelper()
 6         {
 7             IsoDateTimeConverter datetimeConverter = new IsoDateTimeConverter();
 8             datetimeConverter.DateTimeFormat = "yyyy-MM-dd HH:mm:ss";
 9
10             _jsonSettings = new JsonSerializerSettings();
11             _jsonSettings.MissingMemberHandling = Newtonsoft.Json.MissingMemberHandling.Ignore;
12             _jsonSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
13             _jsonSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
14             _jsonSettings.Converters.Add(datetimeConverter);
15         }
16
17         /// <summary>
18         /// 将指定的对象序列化成 JSON 数据。
19         /// </summary>
20         /// <param name="obj">要序列化的对象。</param>
21         /// <returns></returns>
22         public static string ToJson(this object obj)
23         {
24             try
25             {
26                 if (null == obj)
27                     return null;
28
29                 return JsonConvert.SerializeObject(obj, Formatting.None, _jsonSettings);
30             }
31             catch (Exception ex)
32             {
33
34                 return null;
35             }
36         }
37
38         /// <summary>
39         /// 将指定的 JSON 数据反序列化成指定对象。
40         /// </summary>
41         /// <typeparam name="T">对象类型。</typeparam>
42         /// <param name="json">JSON 数据。</param>
43         /// <returns></returns>
44         public static T FromJson<T>(this string json)
45         {
46             try
47             {
48                 return JsonConvert.DeserializeObject<T>(json, _jsonSettings);
49             }
50             catch (Exception ex)
51             {
52
53
54                 return default(T);
55             }
56         }
57     }

最后结果:

 1  public static IEnumerable<JWCDTO> GetAllJW()
 2         {
 3             List<BigDataDTO> p = GetAll().ToList();
 4
 5             List<JWCDTO> list = new List<JWCDTO>(); ;
 6             foreach (BigDataDTO pp in p)
 7             {
 8                 string address = pp.Address;
 9                 int count = pp.count;
10                 BGDTO bg = Re.RequestApi<BGDTO>(address);
11                 if(bg==null)
12                 {
13                     continue;
14                 }
15                 string lat = bg.result.location.lat;
16                 string lng = bg.result.location.lng;
17                 JWCDTO log = ToProductDTO(lat, lng, count);
18                 list.Add(log);//list.Add(ToLog(row));
19
20             }
21
22             return list;
23
24         }

JW.ashx:

 1  public class JW : IHttpHandler
 2     {
 3
 4         public void ProcessRequest(HttpContext context)
 5         {
 6             context.Response.ContentType = "application/json";
 7             List<JWCDTO> p;
 8             p = ReJson.GetAllJW().ToList();
 9             context.Response.Write(new JavaScriptSerializer().Serialize(p));
10         }
11
12         public bool IsReusable
13         {
14             get
15             {
16                 return false;
17             }
18         }
19     }

前台页面:

 1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ReJson.aspx.cs" Inherits="XZ.UI.Web.Admin.ReJson" %>
 2
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 4
 5 <html xmlns="http://www.w3.org/1999/xhtml">
 6 <head runat="server">
 7     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 8     <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
 9     <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=1fReIR62vFbOc2vgrBnRAGyUtLkgoIIH"></script>
10     <script type="text/javascript" src="http://api.map.baidu.com/library/Heatmap/2.0/src/Heatmap_min.js"></script>
11     <script src="../Scripts/jquery-1.9.1.min.js" type="text/javascript"></script>
12
13     <title></title>
14      <style type="text/css">
15         ul,li{list-style: none;margin:0;padding:0;float:left;}
16         html{height:100%}
17         body{height:100%;margin:0px;padding:0px;font-family:"微软雅黑";}
18         #container{height:700px;width:100%;}
19         #r-result{width:100%;}
20     </style>
21 </head>
22 <body>
23     <form id="form1" runat="server">
24     <div>
25         <div id="container"></div>
26         <div id="r-result">
27             <input type="button"  onclick="openHeatmap();" value="显示热力图"/><input type="button"  onclick="closeHeatmap();" value="关闭热力图"/>
28         </div>
29     </div>
30     </form>
31 </body>
32 </html>
33
34 <script type="text/javascript">
35     var map = new BMap.Map("container");          // 创建地图实例
36
37     var point = new BMap.Point(118.906886, 31.895532);
38     map.centerAndZoom(point, 15);             // 初始化地图,设置中心点坐标和地图级别
39     map.enableScrollWheelZoom(); // 允许滚轮缩放
40
41     if (!isSupportCanvas()) {
42         alert(‘热力图目前只支持有canvas支持的浏览器,您所使用的浏览器不能使用热力图功能~‘)
43     }
44
45     heatmapOverlay = new BMapLib.HeatmapOverlay({ "radius": 20 });
46     map.addOverlay(heatmapOverlay);
47     heatmapOverlay.setDataSet({ data: function () {
48         var serie = [];
49         $.ajax({
50             url: "JW.ashx",
51             dataType: "json",
52             async: false,
53             success: function (dataJson) {
54                 for (var i = 0; i < dataJson.length; i++) {
55                     var item = {
56                         lat: dataJson[i].lat,
57                         lng: dataJson[i].lng,
58                         count: dataJson[i].count
59                     };
60                     serie.push(item);
61                 }
62             }
63         });
64         return serie;
65     } (), max: 100 });
66     //是否显示热力图
67     function openHeatmap() {
68         heatmapOverlay.show();
69     }
70     function closeHeatmap() {
71         heatmapOverlay.hide();
72     }
73     closeHeatmap();
74     function setGradient() {
75         /*格式如下所示:
76         {
77         0:‘rgb(102, 255, 0)‘,
78         .5:‘rgb(255, 170, 0)‘,
79         1:‘rgb(255, 0, 0)‘
80         }*/
81         var gradient = {};
82         var colors = document.querySelectorAll("input[type=‘color‘]");
83         colors = [].slice.call(colors, 0);
84         colors.forEach(function (ele) {
85             gradient[ele.getAttribute("data-key")] = ele.value;
86         });
87         heatmapOverlay.setOptions({ "gradient": gradient });
88     }
89     //判断浏览区是否支持canvas
90     function isSupportCanvas() {
91         var elem = document.createElement(‘canvas‘);
92         return !!(elem.getContext && elem.getContext(‘2d‘));
93     }
94 </script>

原文地址:https://www.cnblogs.com/symkmk123/p/9309322.html

时间: 2024-10-02 05:24:53

百度地图热力图--批量地址转换应用(基于百度api)的相关文章

安卓开发_慕课网_百度地图_实现模式转换

学习内容来自“慕课网” 模式转换,即地图的普通模式,罗盘模式,跟随模式之间的转换 学习内容接自前三篇 安卓开发_慕课网_百度地图 安卓开发_慕课网_百度地图_实现定位 安卓开发_慕课网_百度地图_实现方向传感器 一.模式转换通过菜单按钮来控制 所以添加对应的菜单项(红色字体部分) 1 <menu xmlns:android="http://schemas.android.com/apk/res/android" > 2 3 <item 4 android:id=&qu

百度地图经纬度批量查找功能XGeocoding使用手册

<XGeocoding使用手册> 1.下载XGeocoding V2 http://www.gpsspg.com/xgeocoding/download/ 2.解压XGeocoding_v2.rar,打开xGeocoding.exe , 首次登陆界面如下: 3.申请百度地图API(   有可以直接跳至4进行操作) (1)   按提示申请百度地图API KEY,点击蓝色连接,进入百度地图api申请界面,注册登录,点击右上角APP控制台 (2)   选择创建应用,填写个人信息注册成为开发者 (3)

Google地图百度地图GPS经纬度偏移转换(JAVA)

不多说,直接代码,Java版 主要就是Google地图,百度地图,GPS经纬度偏移转换 GCJ-02转换BD-09,Google地图经纬度转百度地图经纬度 BD-09转换GCJ-02,百度转google WGS-84 到 GCJ-02 的转换(即 GPS 加偏) /** * 用于构造地图中的坐标点 * @author lw * **/ public class Point { private double lat;// 纬度 private double lng;// 经度 public Poi

百度地图根据输入地址获取坐标

首先新建一个html页面,然后引用百度地图api: <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>根据地址查询经纬度</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <script type="tex

获取百度地图POI数据一(详解百度返回的POI数据)

POI是一切可以抽象为空间点的现实世界的实体,比如餐馆,酒店,车站,停车场等.POI数据具有空间坐标和各种属性,是各种地图查询软件的基础数据之一.百度地图作为国内顶尖的地图企业,其上具有丰富的POI数据,要获取其上的POI数据可以根据百度地图提供的API,但是这种方式有限制,能获取的数据极少.本文将详细介绍通过模拟HTTP请求的方式获取其上的POI数据. 当我们在百度地图的搜索框中通过输入关键字进行搜索时,这其实就是发送一个HTTP请求到百度的服务器,然后服务器返回数据. 打开网页的调试面板可以

[百度地图] 用于类似 DWZ UI 框架的 百度地图 功能封装类 [MultiZMap.js] 实例源码

MultiZMap 功能说明 MultiZMap.js 本类方法功能大多使用 prototype 原型 实现,它是 ZMap 的多加载版本,主要用于类似 DWZ 这个 多标签的 UI 的框架: 包含的功能有:轨迹回放,圈画区域可编辑,判断几个坐标是否在一个圆圈内,生活服务查询,从经纬度获取地址信息,地图工具包括测距,获取面积,以积打印地图,地图全屏,实时路况,坐标是否在polygon区域内,打车方案,经过中间途经点,添加地图控件: 界面查看 : http://www.cnblogs.com/ed

百度地图POI数据爬取,突破百度地图API爬取数目“400条“的限制11。

1.POI爬取方法说明 1.1AK申请 登录百度账号,在百度地图开发者平台的API控制台申请一个服务端的ak,主要用到的是Place API.检校方式可设置成IP白名单,IP直接设置成了0.0.0.0/0比较方便. Place API 提供的接口用于返回查询某个区域的某类POI数据,且提供单个POI的详情查询服务,用户可以使用C#.C++.Java,Python等开发语言发送请求,接收json.xml的数据.关于Place API的具体使用可以参考:Place API Web服务API 1.2爬

如何使用邓西百度网盘批量重命名工具对百度网盘中的文件进行批量改名、删除等

做网盘的小伙伴都有这种需求,从上家转存了资料后,全部带得有别人的广告名称,如果手工在电脑上一个一个的去除,更别说手机安卓上面了(百度网盘批量重命名安卓 /百度网盘批量重命名器安卓版/手机百度云批量重命名)那是相当的费时费力,下面就介绍如何使用工具来解决(百度云文件名批量修改 /新版百度网盘重命名/百度网盘批量修改文件名 /百度网盘批量处理软件/百度网盘批量改文件名/百度网盘批量改名/百度云文件名批量修改/网盘文件改名批量/百度网盘如何批量更改后缀名/百度网盘批量删除重复文件 )这个头痛的事情了.

EChart系列:在echart3中使用百度地图扩展之后,如何获取到百度地图对象

最近做项目想要在百度地图上叠加显示echart的散点图,然后根据地图的缩放等级和区域范围要显示不同的散点图,这中间折腾了好久.功能要求包括: (1)底图使用百度地图: (2)可以在地图上叠加显示echart的散点图: (3)鼠标移动到散点图上面之后,可以浮动显示相关信息: (4)能够获取当前显示区域地图的经纬度范围: (5)能够响应地图的拖拽和缩放事件: 这里有两种选择: 1. 使用echart2的百度地图扩展,1, 3, 4, 5 都可以满足,就是2满足不了,他的一个series的所有图标样式