项目上遇到个需求,根据身份证地址或者用户输入的地址智能识别省市县/区

思路是:给到接口地址详情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='省市区';

附:成果展示

根据地址智能识别省市县/区相关推荐

  1. Dart/Flutter地址智能识别源码,类似顺丰填写地址的智能识别,识别率95%+

    smartParseAddress Dart/Flutter地址智能识别源码,类似顺丰填写地址的智能识别,识别率95%+ 站在巨人肩膀上,前排感谢:GitHub@wzc570738205 实际就是将地 ...

  2. 智能识别收货地址 javascript地址智能识别

    欢迎加入前端交流群交流知识&&获取视频资料:749539640 地址: https://github.com/wzc570738205/smart_parse

  3. php快递地址填写,智能识别快递地址api接口实现(PHP示例)

    电商.ERP等行业发货时,批量录入图片上的收件人地址是个难题:智能识别收件人API是近乎完美的解决方案,通过识别图片,解析出图片中收件人的姓名.电话.详细地址(省.市.区/县.详细地址).将此接口集成 ...

  4. php智能识别收货地址信息

    功能需求:用户输入混合的收货地址,能智能识别出地址,手机,姓名 能正常识别包含三级其中一项的地址,直白点说就是只包含第三级地区一样能识别出来 代码不完成免费共享了,转为收费(删除部分代码),生活所迫! ...

  5. 智能识别收货地址(支持vue)/省市区街道四级联动

    一.智能识别收货地址 解决方案一:smartParsePro 源代码地址: https://github.com/wzc570738205/smartParsePro 使用方法1,在线API: 特别提 ...

  6. vue - js 智能识别快递地址 电话 收件人

    智能识别收货地址Pro 引用: https://github.com/wzc570738205/smartParsePro引用方式: //1. 下载 npm install address-smart ...

  7. web js智能识别收货地址

    一.直接上干货 <!doctype html> <html lang="en"> <head><meta charset="UT ...

  8. Java 收货地址智能解析

    收货地址智能解析 省市区县文件下载地址:china-area.json TreeUtils 地址:Java 万物皆可 Tree 工具类 BaseEnum 地址:枚举字典管理器 基础类:AreaTree ...

  9. Android智能识别 - 银行卡区域裁剪(原理篇)

    在 Android智能识别 - 银行卡区域裁剪 一文中我们用了如下几行代码,获取发现银行卡的轮廓: // 梯度增强 , x 轴和 y 轴Mat grad_x, grad_y;Scharr(blur, ...

最新文章

  1. html表格立体效果,用HTML实现凸(凹)起的立体效果的表格
  2. 操作系统设计与实现第3版笔记与minix3心得(2)-minix3内核调用
  3. 移动时捕捉不到基点_CAD入门学习攻略:CAD软件中对象捕捉功能使用技巧汇总
  4. 用grep和cut做一些数据统计
  5. Serverless 工程实践 | 自建 Apache OpenWhisk 平台
  6. JS 原生实现复选框全选反选功能
  7. 使用ABAP memory inspector分析product 搜索内存占用
  8. IE6/IE7/Firefox浏览器不兼容原因及解决办法
  9. Hello, Android 快速入门
  10. 51Nod-1015 水仙花数【进制+查表搜索】
  11. Intellij IDEA 使用Debug模式运行非常慢
  12. 华为工业云平台:制造业企业数据平台建设最佳实践分享
  13. 2021年上海第一批高新技术企业上海熙有网络科技集团榜上有名
  14. Git版本控制管理(二)--git配置
  15. 北漂程序员一天的生活
  16. Codeforces Round #835 (Div. 4) B. Lost Permutation
  17. 在线办公的前浪与后浪:输出工具到输出能力
  18. Java无符号数据类型
  19. 监视Oracle ASM磁盘组上的空间使用情况(空闲和已用)
  20. Java显示当前月的日历

热门文章

  1. 【Unity开发小技巧】FMS有限状态机详解
  2. 蓝桥板DS18B20
  3. 牛客 NC201908 小睿睿的伤害(dsu on tree, 启发式合并)
  4. python 利用json获取5天的天气
  5. ENVI:如何自定义beijing54、西安80、国家2000坐标系
  6. addr2line查看死机代码的位置
  7. Java项目:SSH校园报修管理系统
  8. 【tiny4412】按键控制led灯亮灭
  9. 2019-1-30手把手教你怎么用AbaqusGUI二次开发攻略
  10. java wav转amr_AMR和WAV互相转换