获取百度地图POI数据三(模拟关键词搜索)
上一篇博文中讲到如何获取用于搜索的关键词,并且已经准备好了一百五十万的关键词 这其中有门牌号码,餐馆酒店名称,公司名称,道路名称等。有了这些数据,我们就可以通过代码,模拟我们在百度地图的搜索框中搜索地点,从而获取其返回的POI数据。下面直接上代码~
一 、准备好用于存储数据的数据库表
由于百度返回的POI数据都是JSON字符串且子节点非常多,为了按照子节点一一存储,就需要建这么一张包含很多字段的表,虽然麻烦,但是信息很全面。当然各位也可以选择性的存储其中的数据。
二、获取并解析数据的代码
class Program
{
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" };
static string[] flaArr = { "navi_x", "navi_y" };
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" };
static List<string> tempList = new List<string>();
static void Main(string[] args)
{
//调用SQLHelper类中的方法
DataTable kwDt = SQLHelper.ExecuteDataTable("select KWName from SHKW order by SaveTime", CommandType.Text);
List<string> kwList = new List<string>();
foreach (DataRow row in kwDt.Rows)
{
kwList.Add(row["KWName"].ToString());
}
int total = kwList.Count;
DataTable tempDt = SQLHelper.ExecuteDataTable("select name,addr from SHPOI", CommandType.Text);
foreach (DataRow row in tempDt.Rows)
{
tempList.Add(row["name"].ToString() + "," + row["addr"].ToString());
}
for (int i = ; i < kwList.Count; i++)
{
string kw = kwList[i];
string keyWord = "上海市" + kw;
for (int j = ; j < ; j++)
{
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;
int count = DownloadPOIInfoFromBMap(url, -, keyWord + j);
if (count == -) break;
Console.WriteLine("成功写入数据:" + count + "条 执行次数:" + (j + ) + " KeyWord:" + keyWord + " kwNum:" + (kwList.IndexOf(kw) + ) + " tatal:" + total);
}
}
Console.WriteLine("ok");
Console.ReadKey();
}
private static int DownloadPOIInfoFromBMap(string url, int typeId, string fileName)
{
int count = ;
Stream responseStream;
string restring;
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
responseStream = response.GetResponseStream();
StreamReader sr = new StreamReader(responseStream, Encoding.Default);
restring = sr.ReadToEnd();
}
catch
{
Console.WriteLine("网络异常");
return count;
}
string[] strArr = restring.Split(new string[] { "\\u" }, StringSplitOptions.None);
StringBuilder sb = new StringBuilder();
sb.Append(strArr[]);
try
{
for (int i = ; i < strArr.Length; i++)
{
string code = strArr[i];
int value = Convert.ToInt32(code.Substring(, ), );
sb.Append(char.ConvertFromUtf32(value));
if (code.Length > )
{
sb.Append(code.Substring(, code.Length - ));
} }
}
catch
{
return count;
}
JObject jo;
try
{
jo = (JObject)JsonConvert.DeserializeObject(sb.ToString());
}
catch
{
//一些数据无法正确转换为json对象 需要特别处理
Regex regex = new Regex("\"\\{\\\\\"index_tag\\\\\".*?\"\\}\"");
//MatchCollection collection = regex.Matches(sb.ToString());
string data = sb.ToString();
data = regex.Replace(data, "\"\"");
try
{
jo = (JObject)JsonConvert.DeserializeObject(data);
}
catch
{
Regex regex1 = new Regex("\"\\{\\\\\"shop_id\\\\\".*?\"\\}\"");
data = regex1.Replace(data, "\"\"");
try
{
jo = (JObject)JsonConvert.DeserializeObject(data);
}
catch
{
try
{
Console.Write("无法构建JSON对象 ");
File.WriteAllText(@"D:\errorData\" + fileName + ".txt", data);
}
catch { }
return count;
}
}
}
return SavePOIToDB(jo, typeId);
} private static int SavePOIToDB(JObject jo, int typeId)
{
int count = ;
try
{
if (jo["content"].Children().Count() == ) return -;
}
catch
{
if (jo != null) return -; }
foreach (JToken child in jo["content"].Children())
{
List<SqlParameter> listParam = new List<SqlParameter>();
foreach (string s in strArr)
{
listParam.Add(new SqlParameter(@s, GetInfoString(s, child)));
}
foreach (string f in flaArr)
{
listParam.Add(new SqlParameter(@f, GetInfoString(f, child)));
}
foreach (string i in intArr)
{
listParam.Add(new SqlParameter(@i, GetInfoString(i, child)));
}
List<float> coordinate = ConvertCoor(GetInfoInt("x", child), GetInfoInt("y", child));
listParam.Add(new SqlParameter(@"TypeId", typeId));
listParam.Add(new SqlParameter(@"lot_bdll", coordinate[]));
listParam.Add(new SqlParameter(@"lat_bdll", coordinate[]));
string tempStr = GetInfoString("name", child).Replace("'", "") + "," + GetInfoString("addr", child);
if (tempList.Contains(tempStr)) continue;
tempList.Add(tempStr);
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)";
SQLHelper.ExecuteNonQuery(sql, CommandType.Text, listParam.ToArray());
count++;
}
return count;
}
private static int GetInfoInt(string key, JToken jo)
{
try
{
return Convert.ToInt32(jo[key].ToString());
}
catch
{
return ;
}
} private static float GetInfoFloat(string key, JToken jo)
{
try
{
return float.Parse(jo[key].ToString());
}
catch
{
return ;
}
}
private static string GetInfoString(string key, JToken jo)
{
try
{
return jo[key].ToString();
}
catch
{
return DBNull.Value.ToString();
}
} /// <summary>
/// 将bdmac坐标转换城bdll坐标
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
private static List<float> ConvertCoor(int x, int y)
{
//GevTfxGlAWxzIzTobk7PGX1eu2YF0RMl
//ghCXsfOvpXwWsnm6lhWGelF5f0Fh3y82
List<float> list = new List<float>();
string url = "http://api.map.baidu.com/geoconv/v1/?coords=" + x / (100.0) + "," + y / (100.0) + "&from=6&to=5&ak=ghCXsfOvpXwWsnm6lhWGelF5f0Fh3y82";
Stream responseStream;
StreamReader sr;
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
responseStream = response.GetResponseStream();
sr = new StreamReader(responseStream, Encoding.Default);
}
catch
{
list.Add();
list.Add();
return list;
}
string restring = sr.ReadToEnd();
JObject jo;
try
{
jo = (JObject)JsonConvert.DeserializeObject(restring);
list.Add(float.Parse(jo["result"][]["x"].ToString()));
list.Add(float.Parse(jo["result"][]["y"].ToString()));
}
catch
{
list.Add();
list.Add();
}
return list;
}
}
使用关键词模拟百度地图的搜索功能从而获取返回的POI数据的方法能够获取大量的POI数据 由于返回的数据中没有百度经纬度坐标信息,只有百度墨卡托的坐标,所以还需要调用它的API 通过坐标转换的方方法来获取百度经纬度坐标。这就需要申请开发密钥了,而且每个密钥一天最多只能进行十万次的坐标转换。
以下是本人获取的部分POI数据:
以上就是本人获取百度地图POI数据的方式,由于关键词数量在百万级别 而且百度每次返回的数据的页数也不近相同,多的有百页,少的仅有一条设置没有,所以程序需要运行很长的时间,本人运行两周程序也才获取到一百多万数据。预计程序运行完成时POI数据总量或与关键词总量相差无几,也能达到一百五十万左右,虽然并不知道百度地图上海地区的POI数据具体有多少,但是一百多万的数据量已经能够做些分析了。
获取百度地图POI数据三(模拟关键词搜索)的更多相关文章
- 获取百度地图POI数据二(准备搜索关键词)
上篇讲到 想要获取尽可能多的POI数据 需要准备尽可能多的搜索关键字 那么这些关键字如何得来呢? 本人使用的方法是通过一些网站来获取这些关键词 http://poi.mapbar.com ...
- 基于 Golang 完整获取百度地图POI数据的方案
百度地图为web开发者提供了基于HTTP/HTTPS协议的丰富接口,其中包括地点检索服务,web开发者通过此接口可以检索区域内的POI数据.百度地图处于数据保护对接口做了限制,每次访问服务,最多只能检 ...
- 获取百度地图POI数据一(详解百度返回的POI数据)
POI是一切可以抽象为空间点的现实世界的实体,比如餐馆,酒店,车站,停车场等.POI数据具有空间坐标和各种属性,是各种地图查询软件的基础数据之一.百度地图作为国内顶尖的地图企业,其上具有丰富的POI数 ...
- 百度地图POI数据爬取,突破百度地图API爬取数目“400条“的限制11。
1.POI爬取方法说明 1.1AK申请 登录百度账号,在百度地图开发者平台的API控制台申请一个服务端的ak,主要用到的是Place API.检校方式可设置成IP白名单,IP直接设置成了0.0.0.0 ...
- Android百度地图开发(三)范围搜索
// 1.新建项目 将地图API添加进classpath中: 2.在activity_main.xml中添加一个MapView,用来显示地图: <LinearLayout xmlns:andro ...
- 教你如何拔取百度地图POI兴趣点
教你如何拔取百度地图POI兴趣点 通过聚合数据提供的接口,获取百度地图的POI兴趣点,并存储至数据库中. 实现: 1.聚合数据百度POI接口说明 调用聚合数据,首先得注册聚合.聚合数据提供的百度地 ...
- 【百度地图API】建立全国银行位置查询系统(四)——如何利用百度地图的数据生成自己的标注
原文:[百度地图API]建立全国银行位置查询系统(四)--如何利用百度地图的数据生成自己的标注 摘要: 上一章留个悬念,"如果自己没有地理坐标的数据库,应该怎样制作银行的分布地图呢?&quo ...
- iOS地图集成示例:百度地图POI检索
一.集成百度地图(傻瓜教程,以网站说明文档为准,此处罗列几项主要步骤) 1.登录 http://lbsyun.baidu.com 百度地图开发者平台,获取SDK和集成文档. 2.百度地图可以提供的 ...
- 【百度地图API】如何用圆形搜索获取中心点周围100米内全部关键点?如天安门附近所有的餐厅、加油站、宾馆、大厦等
原文:[百度地图API]如何用圆形搜索获取中心点周围100米内全部关键点?如天安门附近所有的餐厅.加油站.宾馆.大厦等 摘要: 在LBS上有这样一个常用的功能,查找附近所有的关键点(POI点,比如标志 ...
随机推荐
- SAP ERP SD模块中维护销售人员
SAP ERP SD模块中维护销售人员信息并分配销售组织 分类: SAPHCM用户指南 在SAP ERP系统,销售和分销(SD)模块中需要创建销售人员(Sales Personnels)消息, ...
- Go-For Range 性能研究
文章转载地址:https://www.flysnow.org/2018/10/20/golang-for-range-slice-map.html 如果我们要遍历某个数组,Map 集合.Slice 切 ...
- Object-C的类可以多重继承吗?可以实现多个接口吗?category是什么?重写一个类的方式用继承好还是分类好,为什么?
Object-C的类可以多重继承吗?可以实现多个接口吗?category是什么?重写一个类的方式用继承好还是分类好,为什么? 答:Object-c的类不可以多重继承,可以实现多个接口(协议),Cate ...
- 对java中路径的一些理解
开始前先贴一下项目结构 public class TestLocation { @Test public void test1(){ String s1 = Objects.requireNonNul ...
- vue--vant组件库field输入框
安装vant UI框架: cnpm install vant –-save-dev 导入组件-在main.js里: import Vant from 'vant'; import'vant/lib/v ...
- oledb
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data; ...
- day6_自定义类型转换
#include <iostream> using namespace std; class Point2D{ public: Point2D(int x, int y):m_x(x), ...
- linux命令 常用
1.linux手动连接主机ssh '主机地址' 2.编辑 vi 查看i 编辑esc 退出编辑:wq 保存退出:q 直接退出 3. linux 防火墙 centOS7 firewall-cmd --sa ...
- postgis 随笔
一.表的定义: 对于任何一种关系型数据库而言,表都是数据存储的最核心.最基础的对象单元.现在就让我们从这里起步吧. 1. 创建表: CREATE TABLE products ( ...
- expect使用
expect时用与提供自动交互的工具.比如如果想要用ssh登陆服务器,每次都输入密码你觉得麻烦,那你就可以使用expect来做自动交互,这样的话就不用每次都输入密码了. 先看例子: #!/usr/bi ...