在VS2010中利用百度mapPlace API获取POI数据(XML文件方式存储),并导入mysql数据库
以百度地图的Place API为例,在vs2010中获取某一类型(如酒店)的POI数据(以xml文件方式存储),并导入mysql数据库中。
第一步:
打开vs2010,并建立一个windows窗体应用程序,在窗体中添加主要的控件和按钮。如下图示
其中listview的右上角有一个小三角形,点击之后选择“编辑列”,就可以添加其他的项目,这样得到的数据就排列的特别整齐。如下图所示
第二步:
创建完窗体后,开始编写程序。思路:(1)当点击button1时候,如果radiobutton1选中,则调用百度地图的Place API,最后会得到一个xml文件,从而解析这个xml文件中的数据,并且在listview1中展示出来,且radionbutton2选中时同理;(2)点击完button1之后,再点击button2,就会把刚才得到的poi数据存储进具有相同实体、字段名的mysql数据库中。
可以在百度地图API官网中学习Place API的方法,如果要调用的话还必须申请密钥。利用这个API最多可以得到400条数据,共20页(可想而知,如果这个数据全被你获取了,百度还吃什么呢!)。获取POI数据的网址一般是这样的:http://api.map.baidu.com/place/v2/search?q=酒店®ion=成都&output=xml&page_num=1&page_size=20&ak=你申请的密钥
得到的结果如下图所示:
所以这里我们主要的任务是把这个xml文件解析出来,把每一条数据按照正确的位置对应在窗体中的名称、经度、纬度、地址、电话中去。
第三步:
当点击“数据获取”按钮并选择“百度地图”时,主要的代码如下,省去了一些初始化数据的代码。
private void button1_Click(object sender, EventArgs e)
{
string keyword = textBox1.Text;
string city = textBox3.Text;
if (radioButton1.Checked == true)
{ //选中百度地图
//设置一个循坏函数,不停的重复20次,获取总共400条信息
for (int j = 0; j < 20; j++) //j表示页数,共20页,范围从1——19;i表示每一页的个数,20;
{
//请求http
string url = "http://api.map.baidu.com/place/v2/search?q=" + keyword + "®ion=" + city + "&output=xml&page_num=" + j + "&page_size=20&ak=你的密钥";
//以下代码从网上复制,具体含义不是特别懂。基本上讲的是用HttpWebRequest类来从这个url中得到数据流datastream,并读取,再存入xml中
HttpWebRequest request = HttpWebRequest.Create(url) as HttpWebRequest;
request.Method = "GET";
request.ProtocolVersion = new Version(1, 1);
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
Stream datastream = response.GetResponseStream();
StreamReader reader = new StreamReader(datastream);
string xml = reader.ReadToEnd();
//创建并载入XML文档
XmlDocument xDoc = new XmlDocument();
//xDoc.Load("search2.xml");这种方法好像可以直接载入保存在本地的xml文档,但我好像没有成功
xDoc.LoadXml(xml);
XmlElement root = xDoc.DocumentElement;//提取xml文档的根元素(应该表示整个文档吧-_-||)
//string total = root.ChildNodes[2].InnerText;//从子节点为0开始数,<total>400</total>在第三排,属于root.ChildNodes[2],存储的InnerText表示总共的数据条数
//创建循环,获取每一页的所有数据
//从图3可以看出,<results></results>之间存储的是每一页中所有的poi数据,其中的<result></result>之间存储的则是每一条poi数据中的所有内容
//现在可以先获取每一页所有的poi数据条数(用ChildNodes.Count),这样做是为了防止最后一页有不到20条数据的可能性存在
for (int i = 0; i < root.ChildNodes[3].ChildNodes.Count; i++)
{
//取根元素的第i个子元素hot
XmlNode hot = root.ChildNodes[3].ChildNodes[i];//childNods[3]表示status、message、total之后的result
//取节点hot的各个子元素的值,分别赋值给相应的变量
hotName_b = hot.ChildNodes[0].InnerText;//获取或设置节点的串联值
hotLat_b = hot.ChildNodes[1].ChildNodes[0].InnerText;
hotLng_b = hot.ChildNodes[1].ChildNodes[1].InnerText;
hotAdd_b = hot.ChildNodes[2].InnerText;
hotTel_b = hot.ChildNodes[3].InnerText;
//将每一次存储的数据显示在listView中
ListViewItem item = new ListViewItem();
item.Text = hotName_b;
item.SubItems.Add(hotLat_b);
item.SubItems.Add(hotLng_b);
item.SubItems.Add(hotAdd_b);
item.SubItems.Add(hotTel_b);
listView1.Items.Add(item);
//将数据保存在hotel_b数组中,以便下面的数据入库
hotel_b[j * 20 + i, 0] = hotName_b;
hotel_b[j * 20 + i, 1] = hotLat_b;
hotel_b[j * 20 + i, 2] = hotLng_b;
hotel_b[j * 20 + i, 3] = hotAdd_b;
hotel_b[j * 20 + i, 4] = hotTel_b;
}
}
}
ChildNodes节点有点复杂,可以对照上面的代码和下面的图来分析。如下图:
第四步:
获取到数据并且保存到数组之后,就可以将数据导入数据库中了。本文用了mysql数据库。
有两点需要注意的:(1)在mysql数据库中,必须有一个已经创建好的空的数据库来装这些数据,并事先设置好该数据库中表的对应字段名以及字段长度,确保获取的数据没有超过这个长度。(2)要想在VS2010中调用mysql数据库,必须添加MySql.Data的dll文件引用,并且在程序的最前端加入using MySql.Data.MySqlClient的代码。如下图所示
具体的入库程序如下:
private void button2_Click(object sender, EventArgs e)
{
//这个字符串用来连接数据库的
string constr = "server=localhost;User Id=root;password=密码;Database=数据库名称;Charset=utf8";
MySqlConnection hotConnection = new MySqlConnection(constr);
hotConnection.Open();
if (radioButton1.Checked == true)
{ //选中百度地图 400*5
//用来连接数据库中的hotel表,这个表用来装这些数据
MySqlDataAdapter hotDA = new MySqlDataAdapter("select * from hotel", hotConnection);
DataSet hotDS = new DataSet();//声明并生成新的DATASET对象
hotDA.Fill(hotDS, "hotel");//利用hotDA检索出的数据填充stuDS
DataTable hotDT = hotDS.Tables["hotel"];
for (int k = 0; k < 400; k++)
{
//在表中创建新的记录,即每一列的数据
DataRow newRow = hotDT.NewRow();
newRow["id"] = k;
newRow["name"] = hotel_b[k,0];
newRow["lat"] = hotel_b[k, 1];
newRow["lng"] = hotel_b[k, 2];
newRow["address"] = hotel_b[k, 3];
newRow["telephone"] = hotel_b[k,4];
hotDT.Rows.Add(newRow);
}
MySqlCommandBuilder hotOBJ = new MySqlCommandBuilder(hotDA);
hotDA.Update(hotDS, "hotel");
hotConnection.Close();
}
到这里,数据的解析、获取、入库就完成了!