C#地址分析算法,自动获取地址对应的省市区行政区域编码|C/S开发框架

C#地址分析算法,自动获取地址对应的省市区行政区域编码
C# 地址分析算法,返回省市区行政区域编码
C# AddressToCityIDs 类库
public class AddressToCityIDs
{
private int MAX_CITYS = 3;
private string ROOT_ID = "100000";
private DataTable data;
public AddressToCityIDs(DataTable dtCitys)
{
this.data = dtCitys;
}
private string GetParentId(string cityCode)
{
var rs = data.Select($"code='{cityCode}'");
if (rs.Length > 0)
return rs[0]["parent_id"].ToString();
else
return "";
}
public void GetParentIDs(List<String> result, string cityCode)
{
var rs = data.Select($"code='{cityCode}'");
if (rs.Length > 0)
{
result.Add(rs[0]["parent_id"].ToString());
data.DefaultView.RowFilter = $"code='{rs[0]["parent_id"].ToString()}'";
var dt = data.DefaultView.ToTable();
if (dt.Rows.Count > 0)
{
foreach (DataRow R in dt.Rows)
{
GetParentIDs(result, R["code"].ToString());
}
}
}
result.Remove(ROOT_ID);
}
public string GetCityName(List<string> codeList)
{
StringBuilder sb = new StringBuilder();
foreach (var s in codeList)
{
var rs = data.Select($"code='{s}'");
if (rs.Length > 0)
{
if (sb.Length == 0)
sb.Append(rs[0]["name"].ToString());
else
sb.Append("-" + rs[0]["name"].ToString());
}
}
return sb.ToString().Trim();
}
public bool GetCityId(string address, ref string cityIDs, ref string cityNames)
{
List<String> ids = new List<string>();
if (address.IndexOf("/") > 0)
ids = GetCityIDsByAddress(address, '/', ' ');
else
ids = GetCityIDsByAddress(address);
var result = ids.Take<String>(MAX_CITYS).ToList<String>();
cityIDs = String.Join(",", result).Trim();
cityNames = GetCityName(result);
return result.Count > 0;
}
public List<String> GetCityIDsByAddress(string address, params char[] separator)
{
void AddIDs(List<String> ids, DataRow rs)
{
List<string> tmp = new List<string>();
GetParentIDs(tmp, rs["code"].ToString());
tmp.Add(rs["code"].ToString());
if (ids.Count == 0 || ids.Exists(e => tmp.IndexOf(e) >= 0))
{
ids.Add(rs["code"].ToString());
ids.Add(rs["parent_id"].ToString());
ids.Add(GetParentId(rs["parent_id"].ToString()));
}
}
List<String> result = new List<string>();
var list = address.Split(separator, StringSplitOptions.RemoveEmptyEntries).Distinct().ToArray();
list = list.Distinct().ToArray();
if (list.Length > 1)
{
DataRow[] rs;
foreach (var item in list)
{
rs = data.Select($"name='{item.Trim()}'", "level_type ASC");
if (rs.Length == 1)
{
AddIDs(result, rs[0]);
}
else if (rs.Length > 1)
{
foreach (DataRow R in rs)
{
List<string> tmp = new List<string>();
GetParentIDs(tmp, R["code"].ToString());
if (result.Exists(e => tmp.IndexOf(e) >= 0))
{
AddIDs(result, R);
break;
}
}
}
}
}
result = result.Where(e => e != "" && e != ROOT_ID).Distinct().OrderBy(x => x).ToList<String>();
return result;
}
public List<String> GetCityIDsByAddress(string address)
{
List<String> ids = new List<string>();
data.DefaultView.Sort = "level_type ASC";
foreach (DataRow R in data.DefaultView.ToTable().Rows)
{
var name = R["name"].ToString();
if (address.IndexOf(name) >= 0)
{
List<string> tmp = new List<string>();
GetParentIDs(tmp, R["code"].ToString());
tmp.Add(R["code"].ToString());
if (ids.Count == 0 || ids.Exists(e => tmp.IndexOf(e) >= 0))
{
ids.Add(R["code"].ToString());
ids.Add(R["parent_id"].ToString());
ids.Add(GetParentId(R["parent_id"].ToString()));
address = address.Replace(R["name"].ToString(), "");
}
}
}
var result = ids.Where(e => e != "" && e != ROOT_ID).Distinct().OrderBy(x => x).ToList<String>();
return result;
}
}
测试案例
DataTable dict = new SyncHelper().GetCityData();
Console.WriteLine("记录数:" + dict.Rows.Count);
Test1(dict, "蔡灵波 上海市黄浦区南京东路街道湖滨路150号*****");
Test1(dict, "上海住豪建筑上海市 青浦区 青浦区徐泾镇龙联 ****");
Test1(dict, "张家港市塘桥镇南环路阳地钢工地(58号银达*****");
Test1(dict, "绍兴市隐山府项目部(杨绍线与山阴*****");
Test1(dict, "黑龙江省双鸭山市宝山区南环路阳地钢工地");
Test1(dict, "上海市宝山区南环路阳地钢工地");
Test1(dict, "双鸭山市宝山区南环路阳地钢工地");
Test1(dict, "邵阳市隆回县报看村");
Console.WriteLine("------------------------------");
Test2(dict, "蔡灵波 上海市/黄浦区/南京东路街道 湖滨路150号*****");
Test2(dict, "上海住豪建筑 上海市/ 青浦区 青浦区徐泾镇龙联 ****");
Test2(dict, "张家港市/塘桥镇/南环路阳地钢工地(58号银达*****");
Test2(dict, "绍兴市/隐山府项目部(杨绍线与山阴*****");
Test2(dict, "黑龙江省/双鸭山市/宝山区 南环路阳地钢工地");
Test2(dict, "上海市/宝山区/南环路阳地钢工地");
Test2(dict, "双鸭山市/宝山区/南环路阳地钢工地");
Test2(dict, "邵阳市/隆回县/报看村");
Console.ReadKey();
测试结果


扫一扫加作者微信