网站建设知识
在VS2010中利用百度地图PlaceAPI获取POI数据(XML文件方式存储),并导入mysql数据库
2025-07-22 09:58  点击:0

以百度地图的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();            }

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