以百度地图的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数据的网址一般是这样的:api.map.baidu/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 = "api.map.baidu/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开始数,400 在第三排,属于root.ChildNodes[2],存储的InnerText表示总共的数据条数 //创建循环,获取每一页的所有数据 //从图3可以看出,之间存储的是每一页中所有的poi数据,其中的 之间存储的则是每一条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(); }
到这里,数据的解析、获取、入库就完成了!