在VS2010中利用百度mapPlace API获取POI数据(XML文件方式存储),并导入mysql数据库

在VS2010中利用百度地图Place API获取POI数据(XML文件方式存储),并导入mysql数据库

以百度地图的Place API为例,在vs2010中获取某一类型(如酒店)的POI数据(以xml文件方式存储),并导入mysql数据库中。

第一步:

打开vs2010,并建立一个windows窗体应用程序,在窗体中添加主要的控件和按钮。如下图示
在VS2010中利用百度mapPlace API获取POI数据(XML文件方式存储),并导入mysql数据库

其中listview的右上角有一个小三角形,点击之后选择“编辑列”,就可以添加其他的项目,这样得到的数据就排列的特别整齐。如下图所示
在VS2010中利用百度mapPlace API获取POI数据(XML文件方式存储),并导入mysql数据库

第二步:

创建完窗体后,开始编写程序。思路:(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=酒店&region=成都&output=xml&page_num=1&page_size=20&ak=你申请的密钥

得到的结果如下图所示:
在VS2010中利用百度mapPlace API获取POI数据(XML文件方式存储),并导入mysql数据库

所以这里我们主要的任务是把这个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 + "&region=" + 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节点有点复杂,可以对照上面的代码和下面的图来分析。如下图:
在VS2010中利用百度mapPlace API获取POI数据(XML文件方式存储),并导入mysql数据库

第四步:

获取到数据并且保存到数组之后,就可以将数据导入数据库中了。本文用了mysql数据库。

有两点需要注意的:(1)在mysql数据库中,必须有一个已经创建好的空的数据库来装这些数据,并事先设置好该数据库中表的对应字段名以及字段长度,确保获取的数据没有超过这个长度。(2)要想在VS2010中调用mysql数据库,必须添加MySql.Data的dll文件引用,并且在程序的最前端加入using MySql.Data.MySqlClient的代码。如下图所示
在VS2010中利用百度mapPlace API获取POI数据(XML文件方式存储),并导入mysql数据库

具体的入库程序如下:

 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();

            }

到这里,数据的解析、获取、入库就完成了!