根据地址智能识别省市县/区
项目上遇到个需求,根据身份证地址或者用户输入的地址智能识别省市县/区
思路是:给到接口地址详情address,逐个匹配省province、市city、县/区area,然后将province+city+area返回即可,需要考虑一些情况:直辖市,address只有省、县/区,address只有市、县/区,市与县/区重名,县/区与县/区重名。
上代码:
查询 省province、市city、县/区area
-- province
SELECT
CASEWHENtemp.province LIKE '%省%' THENsubstring_index( temp.province, '省', 1 ) WHEN temp.province LIKE '%自治区%' THENsubstring_index( temp.province, '自治区', 1 ) WHEN temp.province LIKE '%市%' THENsubstring_index( temp.province, '市', 1 ) END AS provinceShort,temp.province AS provinceSource,temp.ids recordId FROM( SELECT province, ids, count( DISTINCT province ) FROM city_dic GROUP BY province ) temp;-- city
SELECTCASEWHENtemp.city LIKE '%市%' THENsubstring_index( temp.city, '市', 1 ) WHEN temp.city LIKE '%自治%' THENsubstring_index( temp.city, '自治', 1 ) WHEN temp.city LIKE '%盟%' THENsubstring_index( temp.city, '盟', 1 ) WHEN temp.city LIKE '%地区%' THENsubstring_index( temp.city, '地区', 1 ) ELSE temp.city END AS cityShort,temp.city AS citySource,temp.ids recordId FROM( SELECT city, ids, count( DISTINCT city ) FROM city_dic GROUP BY city ) temp;-- areaSELECTCASEWHENLENGTH( temp.area ) < 7 THENtemp.area WHEN temp.area = '津市市' THEN'津市' WHEN temp.area = '辉县市' THEN'辉县' WHEN temp.area LIKE '%自治%' THENsubstring_index( temp.area, '自治', 1 ) WHEN temp.area LIKE '%区%' THENsubstring_index( temp.area, '区', 1 ) WHEN temp.area LIKE '%县%' THENsubstring_index( temp.area, '县', 1 ) WHEN temp.area LIKE '%市%' THENsubstring_index( temp.area, '市', 1 ) WHEN temp.area LIKE '%旗%' THENsubstring_index( temp.area, '旗', 1 ) END AS areaShort,temp.area AS areaSource,temp.ids recordId FROM( SELECT area, ids FROM city_dic ) temp;
逐个匹配省province、市city、县/区area (注:1、代码在jfinal框架下完成的,2、Record作用和Map<String,Object>类似)
//province
String province = "";
for(Record temp : provinces){String provinceShort = temp.getStr("provinceShort");if(addrStr.contains(provinceShort)){province = temp.getStr("provinceSource");}
}
//city
String city = "";List<Record> cityRecords = new ArrayList<Record>();
for(Record temp : citys){String cityShort = temp.getStr("cityShort");if(addrStr.contains(cityShort)){cityRecords.add(temp);}
}
Record cityRecord = new Record();// if onlyone city
if(cityRecords.size() == 1){city = cityRecords.get(0).getStr("citySource");cityRecord = cityRecords.get(0);
}else if(cityRecords.size() > 1){for(Record tempCityRecords : cityRecords){String cityId = tempCityRecords.getStr("recordId"); //find city_dic by cityIdRecord cityRecordTemp = Db.findFirst("select * from city_dic where ids = ?", cityId);if(province.equals(cityRecordTemp.getStr("province"))){city = cityRecordTemp.getStr("city");cityRecord = cityRecordTemp;}}
} //area
String area = "";
List<Record> areaRecords = new ArrayList<Record>();
for(Record temp : areas){String areaShort = temp.getStr("areaShort");if(addrStr.contains(areaShort)){areaRecords.add(temp);}
}
判断 省、县/区
// if not empty province and empty city
if(StringUtils.isNotBlank(province) && StringUtils.isBlank(city)){if(areaRecords.size() == 1){String areaId = areaRecords.get(0).getStr("recordId");//find city by areaRecord areaRecordTemp = Db.findFirst("select * from city_dic where ids = ?", areaId);province = areaRecordTemp.getStr("province");city = areaRecordTemp.getStr("city");area = areaRecordTemp.getStr("area");if(province.equals("北京市")||province.equals("上海市")||province.equals("天津市")||province.equals("重庆市")){province = "";}return province + city + area;} else if (areaRecords.size() > 1) {for(Record tempAreaRecords : areaRecords){String areaId = tempAreaRecords.getStr("recordId"); //find city by areaRecord areaRecordTemp = Db.findFirst("select * from city_dic where ids = ?", areaId);if(province.equals(areaRecordTemp.getStr("province"))){city = areaRecordTemp.getStr("city");area = areaRecordTemp.getStr("area");if(province.equals("北京市")||province.equals("上海市")||province.equals("天津市")||province.equals("重庆市")){province = "";}return province + city + area;}}} else {if(province.equals("北京市")||province.equals("上海市")||province.equals("天津市")||province.equals("重庆市")){province = "";}return province + city + area;}
}
判断 市、县/区
// if empty province and not empty city
if(StringUtils.isBlank(province) && StringUtils.isNotBlank(city)){String cityId = cityRecord.getStr("recordId");//find province by citycityRecord = Db.findFirst("select * from city_dic where ids = ?", cityId);province = cityRecord.getStr("province");
}
最后
if(areaRecords.size() == 1){area = areaRecords.get(0).getStr("areaSource");
} else if (areaRecords.size() > 1) {for(Record tempAreaRecords : areaRecords){String areaId = tempAreaRecords.getStr("recordId"); //find city by areaRecord areaRecordTemp = Db.findFirst("select * from city_dic where ids = ?", areaId);if(province.equals(areaRecordTemp.getStr("province"))){city = areaRecordTemp.getStr("city");area = areaRecordTemp.getStr("area");if(province.equals("北京市")||province.equals("上海市")||province.equals("天津市")||province.equals("重庆市")){province = "";}return province + city + area;}}
}
结束,将province+city+area返回即可
Enjoying!
附:建表语句:
CREATE TABLE `city_dic` (`ids` varchar(32) NOT NULL,`p_code` varchar(100) NOT NULL COMMENT '省编号',`province` varchar(255) DEFAULT NULL COMMENT '省',`c_code` varchar(100) DEFAULT NULL COMMENT '市编号',`city` varchar(255) DEFAULT NULL COMMENT '市',`a_code` varchar(100) DEFAULT NULL COMMENT '区编号',`area` varchar(255) DEFAULT NULL COMMENT '区',`status` tinyint(2) DEFAULT NULL,PRIMARY KEY (`ids`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='省市区';
附:成果展示
根据地址智能识别省市县/区相关推荐
- Dart/Flutter地址智能识别源码,类似顺丰填写地址的智能识别,识别率95%+
smartParseAddress Dart/Flutter地址智能识别源码,类似顺丰填写地址的智能识别,识别率95%+ 站在巨人肩膀上,前排感谢:GitHub@wzc570738205 实际就是将地 ...
- 智能识别收货地址 javascript地址智能识别
欢迎加入前端交流群交流知识&&获取视频资料:749539640 地址: https://github.com/wzc570738205/smart_parse
- php快递地址填写,智能识别快递地址api接口实现(PHP示例)
电商.ERP等行业发货时,批量录入图片上的收件人地址是个难题:智能识别收件人API是近乎完美的解决方案,通过识别图片,解析出图片中收件人的姓名.电话.详细地址(省.市.区/县.详细地址).将此接口集成 ...
- php智能识别收货地址信息
功能需求:用户输入混合的收货地址,能智能识别出地址,手机,姓名 能正常识别包含三级其中一项的地址,直白点说就是只包含第三级地区一样能识别出来 代码不完成免费共享了,转为收费(删除部分代码),生活所迫! ...
- 智能识别收货地址(支持vue)/省市区街道四级联动
一.智能识别收货地址 解决方案一:smartParsePro 源代码地址: https://github.com/wzc570738205/smartParsePro 使用方法1,在线API: 特别提 ...
- vue - js 智能识别快递地址 电话 收件人
智能识别收货地址Pro 引用: https://github.com/wzc570738205/smartParsePro引用方式: //1. 下载 npm install address-smart ...
- web js智能识别收货地址
一.直接上干货 <!doctype html> <html lang="en"> <head><meta charset="UT ...
- Java 收货地址智能解析
收货地址智能解析 省市区县文件下载地址:china-area.json TreeUtils 地址:Java 万物皆可 Tree 工具类 BaseEnum 地址:枚举字典管理器 基础类:AreaTree ...
- Android智能识别 - 银行卡区域裁剪(原理篇)
在 Android智能识别 - 银行卡区域裁剪 一文中我们用了如下几行代码,获取发现银行卡的轮廓: // 梯度增强 , x 轴和 y 轴Mat grad_x, grad_y;Scharr(blur, ...
最新文章
- html表格立体效果,用HTML实现凸(凹)起的立体效果的表格
- 操作系统设计与实现第3版笔记与minix3心得(2)-minix3内核调用
- 移动时捕捉不到基点_CAD入门学习攻略:CAD软件中对象捕捉功能使用技巧汇总
- 用grep和cut做一些数据统计
- Serverless 工程实践 | 自建 Apache OpenWhisk 平台
- JS 原生实现复选框全选反选功能
- 使用ABAP memory inspector分析product 搜索内存占用
- IE6/IE7/Firefox浏览器不兼容原因及解决办法
- Hello, Android 快速入门
- 51Nod-1015 水仙花数【进制+查表搜索】
- Intellij IDEA 使用Debug模式运行非常慢
- 华为工业云平台:制造业企业数据平台建设最佳实践分享
- 2021年上海第一批高新技术企业上海熙有网络科技集团榜上有名
- Git版本控制管理(二)--git配置
- 北漂程序员一天的生活
- Codeforces Round #835 (Div. 4) B. Lost Permutation
- 在线办公的前浪与后浪:输出工具到输出能力
- Java无符号数据类型
- 监视Oracle ASM磁盘组上的空间使用情况(空闲和已用)
- Java显示当前月的日历