编程那点事编程那点事

专注编程入门及提高
探究程序员职业规划之道!

根据地址智能解析出省/市/区/街道/门牌号

最近在做一个医药商城的开发,在同步数据的过程中,发现旧系统中,地址就是一段字符串,没有根据省/市/区/街道/门牌号分别存储。

网上看了大致的解决方案,原理就是根据省、自治区、市等关键字进行分割,这样就会导致某些地址没办法解析出正确的省/市/区/街道/门牌号,因为他们可能填写会不规范。

在做商城小程序的时候刚好用到了腾讯位置服务,于是想到了它WebService API中的地址解析(地址转坐标)

以下是我C#代码,有需要的可以拿去参考:

using Newtonsoft.Json;
using System;
using System.Configuration;
using System.Data;
using System.IO;
using System.Net;
using System.Threading;

namespace LibsQQ
{

    /// <summary>
    /// 腾讯地址服务
    /// 把 地址 解析成 省 市 区
    /// https://lbs.qq.com/service/webService/webServiceGuide/SmartGeocoder
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            string key = "填写您自己的Key";

            string conn = ConfigurationManager.AppSettings["sqlserver"];
            DbHelperSQLP sqlp = new DbHelperSQLP(conn);

            DataSet ds = sqlp.Query("SELECT * FROM Mall_User_Address WHERE (IsDo IS NULL OR IsDo = 0) and DoMsg is null");

            foreach (DataRow row in ds.Tables[0].Rows)
            {
                Console.WriteLine();

                var address = row["Remark"].ToString();
                address = address.Replace("#", "");
                var id = row["Id"].ToString();

                if (!string.IsNullOrEmpty(address))
                {
                    var request = (HttpWebRequest)WebRequest.Create("https://apis.map.qq.com/ws/geocoder/v1/?address=" + address + "&key=" + key);
                    var response = (HttpWebResponse)request.GetResponse();
                    var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();

                    dynamic r = JsonConvert.DeserializeObject<dynamic>(responseString);

                    if (r.status.Value == 121)
                    {
                        Environment.Exit(0);
                    } else if (r.status.Value == 347)
                    {
                        Console.WriteLine("查询无结果!");
                        sqlp.ExecuteSql("UPDATE dbo.Mall_User_Address SET IsDo=1,DoMsg='查询无结果' where Id='" + id + "'");
                        Thread.Sleep(1000);

                    }
                    else if (r.status.Value == 120)
                    {
                        Console.WriteLine("每秒查询量达上限!");
                        Thread.Sleep(1000);
                    }
                    else
                        {
                            var province = r.result.address_components.province.Value;
                            var city = r.result.address_components.city.Value;
                            var district = r.result.address_components.district.Value;
                            var street = r.result.address_components.street.Value;
                            var code = r.result.ad_info.adcode;
                            var lng = r.result.location.lng;
                            var lat = r.result.location.lat;

                            sqlp.ExecuteSql("UPDATE dbo.Mall_User_Address SET Province='" + province + "',City='" + city + "',District='" + district + "',Street='" + street + "',Address='" + address + "',Lng=" + lng + ",Lat=" + lat + ",ZipCode='" + code + "',IsDo=1 where Id='" + id + "'");

                            Console.WriteLine("{0}:更新完成!", id);
                            Thread.Sleep(1000);
                        }
                }
            }
        }
    }
}

其实最好还是★智能地址解析这个接口,但是他每天限量,个人开发者1次调用,企业开发者100次调用。

 

如果认证了企业开发者,虽然可以申请多个key,但是我算了下,我们靠近2w的地址解析,我得至少申请50个以上的key,太麻烦了。

未经允许不得转载: 技术文章 » .NET编程 » 根据地址智能解析出省/市/区/街道/门牌号