最近在做一个医药商城的开发,在同步数据的过程中,发现旧系统中,地址就是一段字符串,没有根据省/市/区/街道/门牌号分别存储。
网上看了大致的解决方案,原理就是根据省、自治区、市等关键字进行分割,这样就会导致某些地址没办法解析出正确的省/市/区/街道/门牌号,因为他们可能填写会不规范。
在做商城小程序的时候刚好用到了腾讯位置服务,于是想到了它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,太麻烦了。