前言

作为一个很挫的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('{');
                ].Split(',');
                ].Split(];
                ].Split(].TrimEnd('}');
                ].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('{');
                ].Split(',');
                ].Split(];
                ].Split(] + ] + ];
                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(, 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;
                ; i < (int)WhileDataTable.Rows.Count; i++)
                {
                    DataRow row = ReturnTable.NewRow();
                    progressBar1.Value = i + ;
                    row[];
                    ] + ":\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解析某公司的物理地址的更多相关文章

  1. 利用百度地图API和群蚁算法,对TSP问题进行模拟与求解

    前言 最近由于换了工作,期间也有反思和总结上家公司的得失,总觉得有什么事情当初可以完成或者完成得更好,其中TSP问题就是其中之一.当初在开发一个仓配系统的时候,有一个线路排程的需求,当时自己简单在纸上 ...

  2. 百度地图API使用方法详解

    最近做了个项目,其中项目中有个需求需要用到百度地图进行导航,通过查阅相关资料参考百度地图api完成了一个例子. API地址:http://developer.baidu.com/map/jsdemo. ...

  3. ***微信LBS地理位置开发+百度地图API(地理位置和坐标转换)

    微信公众平台开发 - 获取用户地理位置 本文介绍在微信公众平台上如何使用高级接口开发获取用户地理位置的功能. 一.获取用户地理位置接口 开通了上报地理位置接口的公众号,用户在关注后进入公众号会话时,会 ...

  4. 百度地图API 简单使用

    最近项目上需要用到百度地图进行导航,参考百度地图API完成一个例子.API地址:http://developer.baidu.com/map/jsdemo.htm#a1_2 <!DOCTYPE ...

  5. 【百度地图API】JS版本的常见问题

    1.请问如何将我的店铺标注在百度地图上?我是否可以做区域代理?在百度地图上标注是否免费? 答复: 这里只负责API的技术咨询,不解决任何地图标注问题.在百度地图上标注自己公司,即气泡标注业务.该业务已 ...

  6. 【百度地图API】如何进行地址解析与反地址解析?——模糊地址能搜索到精确地理信息!

    原文:[百度地图API]如何进行地址解析与反地址解析?--模糊地址能搜索到精确地理信息! 摘要: 什么是地址解析? 什么是反地址解析? 如何运用地址解析,和反地址解析? 可以同时运用地址解析,和反地址 ...

  7. 百度地图API的使用

    ------------------自说自话----------------------------- 好奇怪,习惯性使用有道云笔记记录心得与知识后就很少用博客园来记录了. 但是后来想想,有些东西还是 ...

  8. 吐槽贴:百度地图 api 封装 的实用功能 [源码下载]

    ZMap 类 功能介绍 ZMap 是学习百度地图 api 接口,开发基本功能后整的一个脚本类,本类方法功能大多使用 prototype 原型 实现: 包含的功能有:轨迹回放,圈画区域可编辑,判断几个坐 ...

  9. 百度地图API 批量添加 带检索功能的信息窗口

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

随机推荐

  1. spring 多数据源一致性事务方案

    spring 多数据源配置 spring 多数据源配置一般有两种方案: 1.在spring项目启动的时候直接配置两个不同的数据源,不同的sessionFactory.在dao 层根据不同业务自行选择使 ...

  2. 实现断点续传的FTP下载类(支持多线程多任务下载)

    using System; using System.Collections.Generic; using System.Text; using System.Threading; using Sys ...

  3. 使用Windows Azure的VM安装和配置CDH搭建Hadoop集群

    本文主要内容是使用Windows Azure的VIRTUAL MACHINES和NETWORKS服务安装CDH (Cloudera Distribution Including Apache Hado ...

  4. python中的函数以及递归

    一  函数 函数的组成: def funname(parameters): instructions.... 在探讨函数的定义之前,让我们想想,如果我们写了上千行代码,其实各种变量定义,循环..... ...

  5. Aufs与Devicemapper的关系

    Aufs与Devicemapper的应用 Aufs是Docker最初采用的文件系统,由于Aufs未能加入到Linux内核,考虑到兼容性问题,加入了Devicemapper的支持.目前,除少数版本如Ub ...

  6. wordpress中如何禁止或者屏蔽更新提示

    WordPress禁止,插件更新,主题更新,wordpress本身更新提示的方法 禁止wp更新 : open file "wordpress\wp-includes\update.php&q ...

  7. DirectX考试判卷心得

    今天帮老师判<三维图形程序设计>的试卷,这门课开卷考,用的教材是段菲翻译的DX9的龙书.判卷过程中发现有两道题虽然不难,但是错的比较多: 1.Direct3D中深度缓冲区中值的范围? A. ...

  8. 2011年-CUshell编程大赛

    今天群里有人在做练习时遇到一个问题,$0中的分隔符使用OFS没有成功作用,遂查到这个问题,留作备忘查看 http://bbs.chinaunix.net/thread-2319120-1-1.html

  9. Maven 安装记

    java初学者 昨天通m2e插件把maven项目导入eclipse的时候各种bug,看了各家技术博客,决定安装maven好好了解下. 安装maven也是一波三折的,先是看各种安装指导,结果环境变量都没 ...

  10. CentOS7.0小随笔——运行级别

    一.Linux运行级别(通用) 0:关机(halt) 1:单用户模式(无需用户名和密码的登录,用于紧急维护系统时用,类似于Windows中的安全模式) 2:不启用网络功能的多用户模式 3:启用网络功能 ...