Winform实现用多线程、百度地图API解析某公司的物理地址
前言
作为一个很挫的C#新手总喜欢自己写点儿不着边际的东西,本人是个新手加菜鸟,写B/S的,工作中,任务完成了,空闲下来,总想继续学点儿什么,由此触发了本篇文章了。个人一直认为,.NET中,C/S所要求的技术含量要高得多,需要的知识也多得多。所以想多多研究研究。菜鸟文章!
环境
.NET3.5 + VS2010 + Geocoding API v2.0 +httpwebrequest/httpwebresponse
软件截图
这是软件总图,很简单,就几个按钮。。。
这里编写了一个批量导入Excel文件的功能,导入的Excel表内容如下:
导入Excel后,点击解析,解析出该公司的地理位置、经纬度、精确度、附近地标 and so on~~
解析完成后,支持将结果导出到Excel文件,导出的结果如下图:
主要是学习百度地图API、多线程的,所以没有精心设计皮肤,很朴素啦~~~
代码部分
百度地图API
接下来说说是如何实现的,其实原理很简单(我也不会难的。囧。),先调用百度API接口(正向解析),将公司名发送过去,然后会返回一段Json,里面包含了该地址的经纬度,然后继续调用API(逆向解析),将经纬度发送过去,返回的Json中就包含了地理位置还有一系列其他内容,通过截取之类的操作就得到了我需要的内容。
/// <summary>
/// 地址逆向解析
/// </summary>
/// <param name="AddressName"></param>
public DataRow FindAddress(string AddressName, int i, DataRow dr)
{
try
{
string retString = HttpPost(string.Format("http://api.map.baidu.com/geocoder/v2/?ak=秘钥&callback=renderOption&output=json&address={0}&city=北京市&precise=1", AddressName));
retString = retString.Remove(, ).TrimEnd(')') + "\r\n";
string[] strs1 = retString.Split('{');
string[] strs2 = strs1[].Split(',');
string str3 = strs2[].Split(':')[];
string str4 = strs2[].Split(':')[].TrimEnd('}');
string str5 = strs2[].Split(':')[];
this.t_returnString.AppendText("经度:" + str3 + "\r\n" + "纬度:" + str4 + "\r\n" + "精确度:" + str5 + "\r\n");
string retLocad = HttpPost(string.Format("http://api.map.baidu.com/geocoder/v2/?ak=秘钥&callback=renderReverse&location={0}&output=json&pois=0", str4 + "," + str3));
//this.t_returnString.AppendText(retLocad + "\r\n");
string[] strs1_1 = retLocad.Split('{');
string[] strs2_1 = strs1_1[].Split(',');
string str3_1 = strs2_1[].Split(':')[];
string str4_1 = strs2_1[].Split(':')[] + "、" + strs2_1[] + "、" + strs2_1[];
this.t_returnString.AppendText("地理位置:" + str3_1 + "\r\n");
this.t_returnString.AppendText("附近地标:" + str4_1 + "\r\n");
this.t_returnString.ScrollToCaret();//滚动到光标处
dr["地理位置"] = str3_1;
dr["附近地标"] = str4_1;
dr["可信度"] = str5;
}
catch (Exception)
{
this.t_returnString.AppendText("暂无" + "\r\n");
}
return dr;
}
多线程
当我完成百度地图部分后,我决定给自己的小软件加入批量解析功能,于是乎,出现了导入和导出Excel的功能,这个功能这里不多说,我的博客里面目前为止,基本上都是导入导出(继续 。囧囧。)。
当完成批量功能后,发现一执行解析,软件就假死状态,突然想起要用多线程。以前没用过多线程,继续百度一下,这方面的内容博客园里面挺多的。
private void b_toExcel_Click(object sender, EventArgs e)
{
this.t_txtInfo.Enabled = false;
this.button1.Enabled = false;
this.b_openexcel.Enabled = false;
this.b_toExcel.Enabled = false;
WhileDataTable = ToDataTable(this.tb_url.Text, , true);
//多线程启动
ThreadStart startDownload = new ThreadStart(WhileFunc);
Thread downloadThread = new Thread(startDownload); //实例化要开启的新类
downloadThread.IsBackground = true;
downloadThread.Start();//开启线程
}
经过上面的部分是启动多线程的代码,意外的发现,多线程其实很好弄。
不过,再次遇到问题,发现交给线程处理的方法,不能传递值进行,也就是需要进行线程资源共享,继续百度!
这里,我使用委托、创建类级变量共享资源,具体代码如下(不知道是否理解错了,若是有错误,希望能提点一二):
private delegate void DoDataDelegate(); //创建委托
private DataTable WhileDataTable = null; //全局变量
private DataTable ReturnTable = null;
public void WhileFunc()
{
if (progressBar1.InvokeRequired)
{
DoDataDelegate d = WhileFunc;
progressBar1.Invoke(d, null);
}
else
{
ReturnTable = new DataTable();
ReturnTable.Columns.Add("公司名", typeof(string));
ReturnTable.Columns.Add("可信度", typeof(string));
ReturnTable.Columns.Add("地理位置", typeof(string));
ReturnTable.Columns.Add("附近地标", typeof(string)); progressBar1.Maximum = (int)WhileDataTable.Rows.Count;
for (int i = ; i < (int)WhileDataTable.Rows.Count; i++)
{
DataRow row = ReturnTable.NewRow();
progressBar1.Value = i + ;
row["公司名"] = WhileDataTable.Rows[i][];
this.t_returnString.AppendText("\r\n" + WhileDataTable.Rows[i][] + ":\r\n");
row = FindAddress(WhileDataTable.Rows[i][].ToString(), i, row); Application.DoEvents();
ReturnTable.Rows.Add(row);
if (progressBar1.Value == progressBar1.Maximum)
{
this.Enabled = true;
if (MessageBox.Show("数据解析完成,是否生成Excel文档?", "消息", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.OK)
{
CreateSheet("地址解析结果", ReturnTable);
}
}
}
}
}
到这里,测试,OK!
UI线程和执行方法的线程分离了,软件UI不会在执行解析方法的时候假死了!
后记
其实,这个软件有很大问题的,百度的API并不能准确的返回查询的公司信息,百度也不可能将所有的公司信息加载到他们的数据库里面去的。所以精确度有限,实用性差,练手吧!不过,在这个软件的启发下,我萌生了继续开发的想法,这次索性换了一种方法,决定用爬虫技术+多线程去爬行百度检索出来的网站,再通过网站内容检索、跳转找到这些公司的主页、或者相关页面,进一步得到该公司的准确地址信息!
网络爬虫的资料网上不是很多,大部分都是自己琢磨的,某些地方肯定会存在问题,软件我也写的差不多了,确实能够找到公司的具体地理位置,但是还是存在许多问题的。
先贴一张图,以后有时间完善了,发篇博文上来!
相关资料:
百度地图Geocoding API v2.0:http://developer.baidu.com/map/webservice-geocoding.htm
这里发上源代码(VS2010工程):http://download.csdn.net/detail/a406502972/7963037
Winform实现用多线程、百度地图API解析某公司的物理地址的更多相关文章
- 利用百度地图API和群蚁算法,对TSP问题进行模拟与求解
前言 最近由于换了工作,期间也有反思和总结上家公司的得失,总觉得有什么事情当初可以完成或者完成得更好,其中TSP问题就是其中之一.当初在开发一个仓配系统的时候,有一个线路排程的需求,当时自己简单在纸上 ...
- Python调用百度地图API实现批量经纬度转换为实际省市地点(api调用,json解析,excel读取与写入)
1.获取秘钥 调用百度地图API实现得申请百度账号或者登陆百度账号,然后申请自己的ak秘钥.链接如下:http://lbsyun.baidu.com/apiconsole/key?applicatio ...
- java 基于百度地图API GPS经纬度解析地址
首先这是百度地图api 的接口地址,基于接口的参数,不过多介绍,其中都提供相应的介绍: http://lbsyun.baidu.com/index.php?title=webapi/guide/web ...
- 百度地图API使用方法详解
最近做了个项目,其中项目中有个需求需要用到百度地图进行导航,通过查阅相关资料参考百度地图api完成了一个例子. API地址:http://developer.baidu.com/map/jsdemo. ...
- ***微信LBS地理位置开发+百度地图API(地理位置和坐标转换)
微信公众平台开发 - 获取用户地理位置 本文介绍在微信公众平台上如何使用高级接口开发获取用户地理位置的功能. 一.获取用户地理位置接口 开通了上报地理位置接口的公众号,用户在关注后进入公众号会话时,会 ...
- 百度地图API 简单使用
最近项目上需要用到百度地图进行导航,参考百度地图API完成一个例子.API地址:http://developer.baidu.com/map/jsdemo.htm#a1_2 <!DOCTYPE ...
- 【百度地图API】JS版本的常见问题
1.请问如何将我的店铺标注在百度地图上?我是否可以做区域代理?在百度地图上标注是否免费? 答复: 这里只负责API的技术咨询,不解决任何地图标注问题.在百度地图上标注自己公司,即气泡标注业务.该业务已 ...
- 【百度地图API】如何进行地址解析与反地址解析?——模糊地址能搜索到精确地理信息!
原文:[百度地图API]如何进行地址解析与反地址解析?--模糊地址能搜索到精确地理信息! 摘要: 什么是地址解析? 什么是反地址解析? 如何运用地址解析,和反地址解析? 可以同时运用地址解析,和反地址 ...
- 关于 WebBrowser调用百度地图API 鼠标滚轮缩放地图级别失灵的解决办法
在桌面程序下 百度地图API的鼠标缩放地图功能可能会失灵无效! 这个原因不是API的问题 小弟试了下在WEB上面是没有问题的 于是考虑可能是WebBrowser的获取焦点问题,于是在主窗体 添加了一个 ...
随机推荐
- 【bzoj1076】 SCOI2008—奖励关
http://www.lydsy.com/JudgeOnline/problem.php?id=1076 (题目链接) 题意 一个奖励,K次抛出宝物的机会,每次抛出都等概率的抛出n个物品中的一个,每个 ...
- 洛谷P2434 [SDOI2005]区间
题目描述 现给定n个闭区间[ai, bi],1<=i<=n.这些区间的并可以表示为一些不相交的闭区间的并.你的任务就是在这些表示方式中找出包含最少区间的方案.你的输出应该按照区间的升序排列 ...
- 搬家到cnblogs
从openshift搬到LOFTER再到点点然后来cnblogs,晃悠一大圈,主要是没时间学习很多东西,再加上cnblogs的搜索收录情况比较好一点(百 度搜索).另外听闻百度空间bye-bye了,以 ...
- 多线程之GCD
什么是GCD Grand Central Dispatch 是Apple开发的一种多核编程技术.主要用于优化应用程序以支持多核处理器以及其他多对称处理系统TA会自动管理线程的生命周期(创建线程.调度任 ...
- [Head First设计模式]生活中学设计模式——外观模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- [Nhibernate]sqlite数据库基本使用
目录 写在前面 操作步骤 总结 写在前面 昨天有朋友问我在nhibernate中如何使用sqlite数据库,当时实在忙的不可开交,下周要去山西出差,实在没空,按我的说法使用sqlite跟使用sqlse ...
- Bash 的 no-fork 优化
我们知道,Bash 在执行一个外部命令时,会先 fork() 一个子进程,然后在子进程里面执行 execve() 去加载那个外部程序.fork 子进程是会耗性能的,所以 Bash 会在下面几种情况下不 ...
- codevs1183 泥泞的道路
题目描述 Description CS有n个小区,并且任意小区之间都有两条单向道路(a到b,b到a)相连.因为最近下了很多暴雨,很多道路都被淹了,不同的道路泥泞程度不同.小A经过对近期天气和地形的科学 ...
- PHP中常见的五种设计模式
设计模式只是为 Java架构师准备的 — 至少您可能一直这样认为.实际上,设计模式对于每个人都非常有用.如果这些工具不是 “架构太空人” 的专利,那么它们又是什么?为什么说它们在 PHP 应用程序中非 ...
- 第2月第24天 coretext 行高
1.NSMutableAttributedString 行高 NSMutableAttributedString *attributedString = [[NSMutableAttributedSt ...