zoukankan      html  css  js  c++  java
  • Winform下的地图开发控件(GMap.NET)使用心得之三批量解析地址经纬度坐标

    在之前的文章中,介绍了两篇关于GMap.NET这样的开源地图控件,介绍了其一些基本信息以及如何进行初步的应用。

    Winform下的地图开发控件(GMap.NET)使用心得

    Winform下的地图开发控件(GMap.NET)使用心得之二

     

    这是一个基于Winform的地图控件。该地图控件的定义如下:

    GMap.NET是一个强大、免费、跨平台、开源的.NET控件,它在Windows Forms 和WPF环境中能够通过Google, Yahoo!, Bing, OpenStreetMap, ArcGIS, Pergo, SigPac等实现寻找路径、地理编码以及地图展示功能,并支持缓存和运行在Mobile环境中。

    GMap.NET是一个开源的GEO地图定位和跟踪程序。就像谷歌地图、雅虎地图一样,可以自动计算两地的距离,定位经纬度,与Google地图不同的是,该项目是建立在C#语言WinForm基础上的。可以对地图放大缩小,进行城市标记等。  

    本文主要介绍应用该控件来批量解析地址经纬度坐标。由于项目需要,我需要把数据库里面的4千多条地址信息解析出经纬度坐标,以供其他用途。经纬度坐标不要求非常精确,大体位置准确即可。如果人工通过Googlemap或者其他途径标准,工作量非常大,而且也很枯燥。由于之前接触过该控件,知道好像比较容易能够解析获取地址的经纬度坐标,那么我们把数据库信息逐一解析即可,这样可以节省人力,更重要的是,可以避免做枯燥的工作。我们先看看程序的运行效果,然后分析如何具体编码实现。

    开始一段时间的效果图: 

     

    基本完成的效果图:

     


    代码实现如下所示,主要利用了背景工作线程BackgroundWorker来提高界面的友好响应。

            private BackgroundWorker work = new BackgroundWorker();

            
    public FrmMainMap()
            {
                InitializeComponent();

                work.WorkerReportsProgress 
    = true;
                work.DoWork 
    += new DoWorkEventHandler(work_DoWork);
                work.RunWorkerCompleted 
    += new RunWorkerCompletedEventHandler(work_RunWorkerCompleted);
                work.ProgressChanged 
    += new ProgressChangedEventHandler(work_ProgressChanged);
            }

            
    void work_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                
    this.progressBar.Value = e.ProgressPercentage;
                
    this.tsslTips.Text = e.UserState.ToString();
            }

            
    private void FrmMainMap_FormClosing(object sender, FormClosingEventArgs e)
            {
                work.DoWork 
    -= new DoWorkEventHandler(work_DoWork);
                work.RunWorkerCompleted 
    -= new RunWorkerCompletedEventHandler(work_RunWorkerCompleted);
            } 

            
    void work_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                
    string tips = string.Format("更新完成, 共成功更新数据 {0} 个", e.Result);
                
    this.tsslTips.Text = tips;
                
    this.progressBar.Value = 100;
                MessageUtil.ShowTips(tips);
            }

            
    void work_DoWork(object sender, DoWorkEventArgs e)
            {
                
    string sql = "select t.ID, t.company_addr from tbpark_enterprise t where t.company_addr is not null and t.latitude is null ";
                Database db 
    = DatabaseFactory.CreateDatabase();
                DbCommand command 
    = db.GetSqlStringCommand(sql);
                Dictionary
    <intstring> addrList = new Dictionary<intstring>();
                
    using (IDataReader dr = db.ExecuteReader(command))
                {
                    SmartDataReader reader 
    = new SmartDataReader(dr);
                    
    while (reader.Read())
                    {
                        
    int id = reader.GetInt32("ID");
                        
    string addr = reader.GetString("company_addr");
                        work.ReportProgress(
    10string.Format("正在处理地址[ {0} ]", addr));

                        
    if (!string.IsNullOrEmpty(addr))
                        {
                            
    int sindex = addr.IndexOfAny(new char[] { '''(' });
                            
    if (sindex > 0)
                            {
                                addr 
    = addr.Substring(0, sindex);
                            }

                            
    if (!addrList.ContainsKey(id))
                            {
                                addrList.Add(id, addr);
                            }
                        }
                    }
                }
                work.ReportProgress(
    20string.Format("获取列表地址信息结束,正在获取Google地图坐标..."));

                
    int totoal = addrList.Count;
                
    double step = Convert.ToDouble(100/ totoal;
                
    int i = 1;
                
    int successCount = 0;
                
    foreach (int id in addrList.Keys)
                {
                    
    int percent = Convert.ToInt32(step * i);
                    work.ReportProgress(percent, 
    string.Format("正在获取Google地图坐标...,已成功获取 {0} 个", successCount));

                    
    try
                    {
                        
    string addr = addrList[id];
                        GeoCoderStatusCode unknow 
    = GeoCoderStatusCode.Unknow;
                        PointLatLng
    ? latLngFromGeocoder = Singleton<GMaps>.Instance.GetLatLngFromGeocoder(addr, out unknow);
                        
    if (latLngFromGeocoder.HasValue && (unknow == GeoCoderStatusCode.G_GEO_SUCCESS))
                        {
                            PointLatLng latLng 
    = latLngFromGeocoder.Value;

                            sql 
    = string.Format("Update tbpark_enterprise t set t.LATITUDE={0}, t.LONGITUDE={1} where t.ID={2}",
                                latLng.Lat, latLng.Lng, id);
                            command 
    = db.GetSqlStringCommand(sql);
                            
    bool success = db.ExecuteNonQuery(command) > 0;
                            
    if (success)
                            {
                                successCount
    ++;
                            }
                        }
                        
    else
                        {
                            LogHelper.Info(unknow.ToString());
                        }
                    }
                    
    catch (Exception ex)
                    {
                        LogHelper.Error(ex);
                    }

                    i
    ++;
                }
                e.Result 
    = successCount;
            }

     
    上面最为关键的部分代码就是如何解析地址为坐标的操作,判断如果解析成功,则获取相应的地理坐标即可,是下面这段:

    string addr = addrList[id];
                        GeoCoderStatusCode unknow 
    = GeoCoderStatusCode.Unknow;
                        PointLatLng
    ? latLngFromGeocoder = Singleton<GMaps>.Instance.GetLatLngFromGeocoder(addr, out unknow);
                        
    if (latLngFromGeocoder.HasValue && (unknow == GeoCoderStatusCode.G_GEO_SUCCESS))
                        {
                            PointLatLng latLng 
    = latLngFromGeocoder.Value;

                            sql 
    = string.Format("Update tbpark_enterprise t set t.LATITUDE={0}, t.LONGITUDE={1} where t.ID={2}",
                                latLng.Lat, latLng.Lng, id);
                            command 
    = db.GetSqlStringCommand(sql);
                            
    bool success = db.ExecuteNonQuery(command) > 0;
                            
    if (success)
                            {
                                successCount
    ++;
                            }
                        }
     
    主要研究技术:代码生成工具、会员管理系统、客户关系管理软件、病人资料管理软件、Visio二次开发、酒店管理系统、仓库管理系统等共享软件开发
    专注于Winform开发框架/混合式开发框架Web开发框架Bootstrap开发框架微信门户开发框架的研究及应用
      转载请注明出处:
    撰写人:伍华聪  http://www.iqidi.com 
        
  • 相关阅读:
    Digital Video Stabilization and Rolling Shutter Correction using Gyroscope 论文笔记
    Distortion-Free Wide-Angle Portraits on Camera Phones 论文笔记
    Panorama Stitching on Mobile
    Natural Image Stitching with the Global Similarity Prior 论文笔记 (三)
    Natural Image Stitching with the Global Similarity Prior 论文笔记(二)
    Natural Image Stitching with the Global Similarity Prior 论文笔记(一)
    ADCensus Stereo Matching 笔记
    Efficient Large-Scale Stereo Matching论文解析
    Setting up caffe on Ubuntu
    Kubernetes配置Secret访问Harbor私有镜像仓库
  • 原文地址:https://www.cnblogs.com/wuhuacong/p/1893186.html
Copyright © 2011-2022 走看看