上一篇博文中讲到如何获取用于搜索的关键词,并且已经准备好了一百五十万的关键词   这其中有门牌号码,餐馆酒店名称,公司名称,道路名称等。有了这些数据,我们就可以通过代码,模拟我们在百度地图的搜索框中搜索地点,从而获取其返回的POI数据。下面直接上代码~

一 、准备好用于存储数据的数据库表

  

由于百度返回的POI数据都是JSON字符串且子节点非常多,为了按照子节点一一存储,就需要建这么一张包含很多字段的表,虽然麻烦,但是信息很全面。当然各位也可以选择性的存储其中的数据。

  二、获取并解析数据的代码

  1. class Program
  2. {
  3. static string[] strArr = { "name", "addr", "address_norm", "alias", "aoi", "area_name", "brand_id", "cla", "di_tag", "ext_display", "geo", "indoor_pano", "navi_update_time", "new_catalog_id", "primary_uid", "show_tag", "std_tag", "storage_src", "street_id", "tag", "tel", "uid" };
  4. static string[] flaArr = { "navi_x", "navi_y" };
  5. static string[] intArr = { "acc_flag", "area", "biz_type", "catalogID", "click_flag", "detail", "diPointX", "diPointY", "dis", "dist2route", "dist2start", "ext_type", "f_flag", "father_son", "flag_type", "geo_type", "ismodified", "pano", "poiType", "poi_click_num", "poi_profile", "prio_flag", "route_flag", "status", "ty", "view_type", "x", "y" };
  6. static List<string> tempList = new List<string>();
  7. static void Main(string[] args)
  8. {
           //调用SQLHelper类中的方法
  9. DataTable kwDt = SQLHelper.ExecuteDataTable("select KWName from SHKW order by SaveTime", CommandType.Text);
  10. List<string> kwList = new List<string>();
  11. foreach (DataRow row in kwDt.Rows)
  12. {
  13. kwList.Add(row["KWName"].ToString());
  14. }
  15. int total = kwList.Count;
  16. DataTable tempDt = SQLHelper.ExecuteDataTable("select name,addr from SHPOI", CommandType.Text);
  17. foreach (DataRow row in tempDt.Rows)
  18. {
  19. tempList.Add(row["name"].ToString() + "," + row["addr"].ToString());
  20. }
  21. for (int i = ; i < kwList.Count; i++)
  22. {
  23. string kw = kwList[i];
  24. string keyWord = "上海市" + kw;
  25. for (int j = ; j < ; j++)
  26. {
  27. string url = "http://map.baidu.com/?newmap=1&reqflag=pcmap&biz=1&from=webmap&da_par=direct&pcevaname=pc4.1&qt=s&da_src=searchBox.button&wd=" + keyWord + "&c=289&pn=" + j;
  28. int count = DownloadPOIInfoFromBMap(url, -, keyWord + j);
  29. if (count == -) break;
  30. Console.WriteLine("成功写入数据:" + count + "条 执行次数:" + (j + ) + " KeyWord:" + keyWord + " kwNum:" + (kwList.IndexOf(kw) + ) + " tatal:" + total);
  31. }
  32. }
  33. Console.WriteLine("ok");
  34. Console.ReadKey();
  35. }
  36. private static int DownloadPOIInfoFromBMap(string url, int typeId, string fileName)
  37. {
  38. int count = ;
  39. Stream responseStream;
  40. string restring;
  41. try
  42. {
  43. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
  44. request.Method = "GET";
  45. HttpWebResponse response = (HttpWebResponse)request.GetResponse();
  46. responseStream = response.GetResponseStream();
  47. StreamReader sr = new StreamReader(responseStream, Encoding.Default);
  48. restring = sr.ReadToEnd();
  49. }
  50. catch
  51. {
  52. Console.WriteLine("网络异常");
  53. return count;
  54. }
  55. string[] strArr = restring.Split(new string[] { "\\u" }, StringSplitOptions.None);
  56. StringBuilder sb = new StringBuilder();
  57. sb.Append(strArr[]);
  58. try
  59. {
  60. for (int i = ; i < strArr.Length; i++)
  61. {
  62. string code = strArr[i];
  63. int value = Convert.ToInt32(code.Substring(, ), );
  64. sb.Append(char.ConvertFromUtf32(value));
  65. if (code.Length > )
  66. {
  67. sb.Append(code.Substring(, code.Length - ));
  68. }
  69.  
  70. }
  71. }
  72. catch
  73. {
  74. return count;
  75. }
  76. JObject jo;
  77. try
  78. {
  79. jo = (JObject)JsonConvert.DeserializeObject(sb.ToString());
  80. }
  81. catch
  82. {
             //一些数据无法正确转换为json对象 需要特别处理
  83. Regex regex = new Regex("\"\\{\\\\\"index_tag\\\\\".*?\"\\}\"");
  84. //MatchCollection collection = regex.Matches(sb.ToString());
  85. string data = sb.ToString();
  86. data = regex.Replace(data, "\"\"");
  87. try
  88. {
  89. jo = (JObject)JsonConvert.DeserializeObject(data);
  90. }
  91. catch
  92. {
  93. Regex regex1 = new Regex("\"\\{\\\\\"shop_id\\\\\".*?\"\\}\"");
  94. data = regex1.Replace(data, "\"\"");
  95. try
  96. {
  97. jo = (JObject)JsonConvert.DeserializeObject(data);
  98. }
  99. catch
  100. {
  101. try
  102. {
  103. Console.Write("无法构建JSON对象 ");
  104. File.WriteAllText(@"D:\errorData\" + fileName + ".txt", data);
  105. }
  106. catch { }
  107. return count;
  108. }
  109. }
  110. }
  111. return SavePOIToDB(jo, typeId);
  112. }
  113.  
  114. private static int SavePOIToDB(JObject jo, int typeId)
  115. {
  116. int count = ;
  117. try
  118. {
  119. if (jo["content"].Children().Count() == ) return -;
  120. }
  121. catch
  122. {
  123. if (jo != null) return -;
  124.  
  125. }
  126. foreach (JToken child in jo["content"].Children())
  127. {
  128. List<SqlParameter> listParam = new List<SqlParameter>();
  129. foreach (string s in strArr)
  130. {
  131. listParam.Add(new SqlParameter(@s, GetInfoString(s, child)));
  132. }
  133. foreach (string f in flaArr)
  134. {
  135. listParam.Add(new SqlParameter(@f, GetInfoString(f, child)));
  136. }
  137. foreach (string i in intArr)
  138. {
  139. listParam.Add(new SqlParameter(@i, GetInfoString(i, child)));
  140. }
  141. List<float> coordinate = ConvertCoor(GetInfoInt("x", child), GetInfoInt("y", child));
  142. listParam.Add(new SqlParameter(@"TypeId", typeId));
  143. listParam.Add(new SqlParameter(@"lot_bdll", coordinate[]));
  144. listParam.Add(new SqlParameter(@"lat_bdll", coordinate[]));
  145. string tempStr = GetInfoString("name", child).Replace("'", "") + "," + GetInfoString("addr", child);
  146. if (tempList.Contains(tempStr)) continue;
  147. tempList.Add(tempStr);
  148. string sql = "insert into SHPOI values(@Name,@acc_flag,@addr,@address_norm,@alias,@aoi,@area,@area_name,@biz_type,@brand_id,@catalogID,@cla,@click_flag,@detail,@diPointX,@diPointY,@di_tag,@dis,@dist2route,@dist2start,@ext_display,@ext_type,@f_flag,@father_son,@flag_type,@geo,@geo_type,@indoor_pano,@ismodified,@navi_update_time,@navi_x,@navi_y,@new_catalog_id,@pano,@poiType,@poi_click_num,@poi_profile,@primary_uid,@prio_flag,@route_flag,@show_tag,@status,@std_tag,@storage_src,@street_id,@tag,@tel,@ty,@uid,@view_type,@x,@y,@lot_bdll,@lat_bdll,@TypeId)";
  149. SQLHelper.ExecuteNonQuery(sql, CommandType.Text, listParam.ToArray());
  150. count++;
  151. }
  152. return count;
  153. }
  154. private static int GetInfoInt(string key, JToken jo)
  155. {
  156. try
  157. {
  158. return Convert.ToInt32(jo[key].ToString());
  159. }
  160. catch
  161. {
  162. return ;
  163. }
  164. }
  165.  
  166. private static float GetInfoFloat(string key, JToken jo)
  167. {
  168. try
  169. {
  170. return float.Parse(jo[key].ToString());
  171. }
  172. catch
  173. {
  174. return ;
  175. }
  176. }
  177. private static string GetInfoString(string key, JToken jo)
  178. {
  179. try
  180. {
  181. return jo[key].ToString();
  182. }
  183. catch
  184. {
  185. return DBNull.Value.ToString();
  186. }
  187. }
  188.  
  189. /// <summary>
  190. /// 将bdmac坐标转换城bdll坐标
  191. /// </summary>
  192. /// <param name="x"></param>
  193. /// <param name="y"></param>
  194. /// <returns></returns>
  195. private static List<float> ConvertCoor(int x, int y)
  196. {
  197. //GevTfxGlAWxzIzTobk7PGX1eu2YF0RMl
  198. //ghCXsfOvpXwWsnm6lhWGelF5f0Fh3y82
  199. List<float> list = new List<float>();
  200. string url = "http://api.map.baidu.com/geoconv/v1/?coords=" + x / (100.0) + "," + y / (100.0) + "&from=6&to=5&ak=ghCXsfOvpXwWsnm6lhWGelF5f0Fh3y82";
  201. Stream responseStream;
  202. StreamReader sr;
  203. try
  204. {
  205. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
  206. request.Method = "GET";
  207. HttpWebResponse response = (HttpWebResponse)request.GetResponse();
  208. responseStream = response.GetResponseStream();
  209. sr = new StreamReader(responseStream, Encoding.Default);
  210. }
  211. catch
  212. {
  213. list.Add();
  214. list.Add();
  215. return list;
  216. }
  217. string restring = sr.ReadToEnd();
  218. JObject jo;
  219. try
  220. {
  221. jo = (JObject)JsonConvert.DeserializeObject(restring);
  222. list.Add(float.Parse(jo["result"][]["x"].ToString()));
  223. list.Add(float.Parse(jo["result"][]["y"].ToString()));
  224. }
  225. catch
  226. {
  227. list.Add();
  228. list.Add();
  229. }
  230. return list;
  231. }
  232. }

使用关键词模拟百度地图的搜索功能从而获取返回的POI数据的方法能够获取大量的POI数据  由于返回的数据中没有百度经纬度坐标信息,只有百度墨卡托的坐标,所以还需要调用它的API  通过坐标转换的方方法来获取百度经纬度坐标。这就需要申请开发密钥了,而且每个密钥一天最多只能进行十万次的坐标转换。

以下是本人获取的部分POI数据:

以上就是本人获取百度地图POI数据的方式,由于关键词数量在百万级别   而且百度每次返回的数据的页数也不近相同,多的有百页,少的仅有一条设置没有,所以程序需要运行很长的时间,本人运行两周程序也才获取到一百多万数据。预计程序运行完成时POI数据总量或与关键词总量相差无几,也能达到一百五十万左右,虽然并不知道百度地图上海地区的POI数据具体有多少,但是一百多万的数据量已经能够做些分析了。

获取百度地图POI数据三(模拟关键词搜索)的更多相关文章

  1. 获取百度地图POI数据二(准备搜索关键词)

    上篇讲到  想要获取尽可能多的POI数据 需要准备尽可能多的搜索关键字   那么这些关键字如何得来呢?   本人使用的方法是通过一些网站来获取这些关键词   http://poi.mapbar.com ...

  2. 基于 Golang 完整获取百度地图POI数据的方案

    百度地图为web开发者提供了基于HTTP/HTTPS协议的丰富接口,其中包括地点检索服务,web开发者通过此接口可以检索区域内的POI数据.百度地图处于数据保护对接口做了限制,每次访问服务,最多只能检 ...

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

    POI是一切可以抽象为空间点的现实世界的实体,比如餐馆,酒店,车站,停车场等.POI数据具有空间坐标和各种属性,是各种地图查询软件的基础数据之一.百度地图作为国内顶尖的地图企业,其上具有丰富的POI数 ...

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

    1.POI爬取方法说明 1.1AK申请 登录百度账号,在百度地图开发者平台的API控制台申请一个服务端的ak,主要用到的是Place API.检校方式可设置成IP白名单,IP直接设置成了0.0.0.0 ...

  5. Android百度地图开发(三)范围搜索

    // 1.新建项目 将地图API添加进classpath中: 2.在activity_main.xml中添加一个MapView,用来显示地图: <LinearLayout xmlns:andro ...

  6. 教你如何拔取百度地图POI兴趣点

    教你如何拔取百度地图POI兴趣点   通过聚合数据提供的接口,获取百度地图的POI兴趣点,并存储至数据库中. 实现: 1.聚合数据百度POI接口说明 调用聚合数据,首先得注册聚合.聚合数据提供的百度地 ...

  7. 【百度地图API】建立全国银行位置查询系统(四)——如何利用百度地图的数据生成自己的标注

    原文:[百度地图API]建立全国银行位置查询系统(四)--如何利用百度地图的数据生成自己的标注 摘要: 上一章留个悬念,"如果自己没有地理坐标的数据库,应该怎样制作银行的分布地图呢?&quo ...

  8. iOS地图集成示例:百度地图POI检索

    一.集成百度地图(傻瓜教程,以网站说明文档为准,此处罗列几项主要步骤) 1.登录  http://lbsyun.baidu.com  百度地图开发者平台,获取SDK和集成文档. 2.百度地图可以提供的 ...

  9. 【百度地图API】如何用圆形搜索获取中心点周围100米内全部关键点?如天安门附近所有的餐厅、加油站、宾馆、大厦等

    原文:[百度地图API]如何用圆形搜索获取中心点周围100米内全部关键点?如天安门附近所有的餐厅.加油站.宾馆.大厦等 摘要: 在LBS上有这样一个常用的功能,查找附近所有的关键点(POI点,比如标志 ...

随机推荐

  1. Java核心知识盘点(二)- 缓存使用

    Redis有哪些数据类型 String.Hash.List.Set.ZSet String:字符串 Hash:哈希 Set:集合 List:列表 ZSet:有序集合 Redis内部结构 1.Redis ...

  2. Kinect外包-就找北京动点飞扬软件(长年承接微软Kinect体感项目外包,有大型Kinect案例)

    承接Kinect体感企业项目.游戏项目外包 有丰富案例提供演示,可公对公签正规合同,开发票. 我们是北京的公司.专业团队,成员为专业WPF产品公司一线开发人员,有大型产品开发经验: 提供优质的售后服务 ...

  3. Jmeter接口测试实例

    此文章作为工作中用到的jmeter接口测试相关内容简述,方便日后查阅参考,如有理解描述有误之处,欢迎指出. 首先Jmeter环境准备网上有很多教程,在此不多做赘述: 1.接口简述 接口可理解为从客户端 ...

  4. java笔记 -- 输入输出

    读取输入: 如果想通过控制台进行输入, 首先需要构造一个Scanner对象.并与'标准输入流'System.in关联. 代码见下文代码块. Sanner (InputStream in) 用给定的输入 ...

  5. warning C4828问题的处理

    在QT的一些项目中,有时候会出现如下警告 warning C4828: 文件包含在偏移 0x215 处开始的字符,该字符在当前源字符集中无效(代码页 65001). (编译源文件 XXXXXXcpp) ...

  6. 20190320xlVBA_考场座位设置

    花了一写时间做了一个Excel宏工作簿,可以根据考场人数.座位排列和考生名单 生成<考试座位表><考生去向表><考试通知单>,想要的前往了解哦: https://i ...

  7. python 数据分类赋值

    问题描述:在数据预处理时,往往需要对描述性数据进行分类赋值或对数据进行分级赋值. 首先,会想到用for循环,依次判断赋值: for n in range(len(data1)): print(n) i ...

  8. Vue.js——60分钟快速入门(转)

    vue:Vue.js——60分钟快速入门 <!doctype html> <html lang="en"> <head> <meta ch ...

  9. 毕业设计《项目管理》总结06之ajax的初步使用经验

    1.ajax页面时不能实现下载功能,因为后台下载功能返回的是一个流,而ajax得到后台的数据只能是字符串或字符,所以实现的方法可以: 例如:用js生成一个form,用这个form提交参数,并返回“流” ...

  10. python--个人信息修改程序

    创建一个新的文本,account.txt,输入以下个人信息内容, lanyinhua,lanyinhua,蓝银花,22,Model,PR,22alex,123,华仔 Li,222,CEO,IT,133 ...