收件地址解析成 省+市+区+详细地址的形式

项目中的源代码在我的GitHub:https://github.com/weitw/address-analyzer
先看效果:
image
如上图,address数输入的地址,Address对象是解析后的地址。可以支持逆推上一级,且支持地址白话解析。

一、项目介绍

1、解析规则

  • 将一个用户输入的地址,解析成省、市、区、详细地址的形式。

  • 如果用户输入的不是标准的地址,则需要推测标准地址。例如用户输入:镇江市句容市崇明西路与玉清路交叉路口西侧(玉清小区),没有输入省,但是需要根据镇江市推测出是江苏省的。

  • 由于直辖市比较特殊,所以代码中默认给直辖市增加一个“xx城区”,作为市。例如北京市朝阳区,可以变成北京市北京城区朝阳区。这个可以配置。

    image

    这里面的110000就是北京市的代码,给其增加一个子级即可。这里也可以根据自己项目的要求去修改,比如改成北京辖区等。

  • 用户输入的非完整的省市区,需要解析成完整的。例如内蒙古自治区,大家的习惯可能是直接说内蒙古或者内蒙,所以需要有一个模糊匹配的规则。再比如江苏省南京市雨花台区,用户可能输入的是南京雨花台,此时就需要将南京解析成南京市,雨花台解析成雨花台区,并推算出是江苏省。

    所以大致的一个规则就是,对于常规的xx省,xxx市的,会生成对应的白话集合。例如江苏省,常用的白话集合就是:江苏省或者江苏。南京市常用的白话就是:南京市、南京。这种规则能处理大部分的地址。但是对于特殊的地址还是需要特殊处理的。

    例如:内蒙古自治区,常用的白话集合是:内蒙古自治区、内蒙古、内蒙。所以还增加了一个特殊地址白话JSON文件:vernacularProvinceCityCounty.json

    image
    。这里只列举了一部分,如果遇到其他特殊的地址,在这个地方加上即可。

2、关于性能

解析时,会读取address.json文件,并根据省市区的关系构建相应的map集合。如果频繁的去读取address.json文件,肯定会消耗不小的资源的,所以可以一次读取,放到缓存中,下次要解析时直接从内存中拿出需要的数据即可。代码中只是使用类的静态属性,并采用单例的方式,确保类只会加载一次,保证address.json文件只会读取一次。
image

实际应用时,可以将数据放到Redis中。

二、测试案例

如下是测试案例:

测试地址(以下地址都从地图上随机挑选的,如果地址有涉及到个人隐私,请联系我删除):

  • 贵州省七星关区何官屯镇刘家村2312号

  • 七星关区何官屯镇刘家村2312号

  • 福建省长汀县汀洲镇中心坝竹区8号

  • 福建长汀汀洲镇中心坝竹区8号

  • 毕节市何官屯镇刘家村11号

  • 内蒙古自治区锡林郭勒盟二连浩特市肯特街南、建设路东

  • 锡林郭勒盟二连浩特市肯特街南、建设路东

  • 内蒙锡林郭勒盟二连浩特市肯特街南、建设路东

  • 河北省廊坊市大城县xxxxxxxxxx

  • 镇江市句容市崇明西路与玉清路交叉路口西侧(玉清小区)

  • 北京朝阳方恒国际中心A座2601号

image

三、使用方法及注意事项

1、使用方法

  • clone项目到你的环境

  • 使用AddressAnalyzer.analyzer.addressResolution(address),address就是需要解析的源地址。得到的是一个包含省市区的对象。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大骨熬汤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值