中国大陆地址智能解析省、市、县、详细地址

477 阅读4分钟

获取到一条 收货地址需要将其解析成 省、市、县、详细地址

通过寻找到开源项目“address-pars

但是这个项目已经停很旧了,只能手动针对性更新(省市县)源码

image.png

原文件前端具体地址文件路径:github.com/akebe/addre…

顺便介绍一下我使用到的该脚本方法:

<script src="./bundle.js"></script>
<script>
 var results = AddressParse.parse('福建省福州市福清市石竹街道义明综合楼3F,15000000000,asseek');
 console.log(results);
</script>

还有充字数的一些方法

image.png

以下是每个方法的参数及其说明,以及相应的例子:

  1. parseByProvince:

    • 参数:地址字符串(address)
    • 说明:一个包含省份信息的完整地址。
    • 例子:输入 "江苏省南京市鼓楼区汉中门大街",将返回 { province: "江苏省", city: "南京市", area: "鼓楼区" }。
  2. parseByCity:

    • 参数:地址字符串(address)
    • 说明:一个包含城市信息的完整地址。
    • 例子:输入 "北京市朝阳区建国门外大街",将返回 { province: "", city: "北京市", area: "朝阳区" }。
  3. parseByArea:

    • 参数:代码字符串(code)
    • 说明:代表具体地区的代码(如市或区的缩写)。
    • 例子:输入 "BJ001"(北京的区代码),将返回 { province: "", city: "", area: "东城区" }。
  4. parse_city_by_province:

    • 参数:省份代码字符串(provinceCode)和地址字符串(address)
    • 说明:一个地址字符串和一个与之对应的省份代码。
    • 例子:输入 "BJ001"(北京的区代码)和地址 "北京市朝阳区建国门外大街",将返回 { city: "北京市" }。
  5. parse_area_by_city:

    • 参数:城市代码字符串(cityCode)和地址字符串(address)
    • 说明:一个地址字符串和一个与之对应的城市代码。
    • 例子:输入 "BJ12345"(北京的某区域代码)和地址 "北京市朝阳区建国门外大街",将返回 { area: "朝阳区" }。
  6. getTargetAreaListByCode:

    • 参数:地区代码字符串(code)
    • 说明:需要查询的地区代码。
    • 例子:输入 "BJ001"(北京的区代码),将返回包含所有与该代码匹配的区域列表,例如 ["东城区", "西城区"]。

再次寻找如何更新全国最新的省市县 开源项目

被我找到了这个开源项目【AreaCity-JsSpider-StatsGov】,超厉害的加入了规则导出数据,我直接

d9a26f9a397edb656e4c7213a9d58b99.gif

此处就需要使用到该开源项目的自定义导出数据功能了。【Web数据格式在线转换工具】

我就按照大佬给的方法重新编译了一份

function UserFormat(list, mapping) {
/***********************
    修改此方法实现自定义格式(剪切本代码到你的编辑器中修改),可参考JsonArrayFormat的实现
    参数list:为所有城市平铺列表,[{id,pid,deep,name,pinyin_prefix,pinyin,ext_id,ext_name,child:[]},...]
    参数mapping:为id城市映射,0索引的是省级0:{child:[]},其他为id:{id,pid,deep,name,pinyin_prefix,pinyin,ext_id,ext_name,child:[]}
*************************/

/**导出的json key配置**/
var Settings = {
    ID: "id",
    IDMinLen: 2 // id最少要这么长,取值2,4,6,尽量不要超过2,因为部分城市没有下级,数据中添加了00结尾的ID作为下级,因此恢复6位时就会冲突。如过调整,生成的数据需要自行处理冲突ID
    ,Childs:"childs"
};

var exec = function(obj, dist) { // 写个函数,递归处理数据
    if (!obj.childs.length) {
        return;
    }
    for (var i = 0; i < obj.childs.length; i++) {
        var itm = obj.childs[i];
        
        var id = (itm.id + "");
        var formattedId = id.length < Settings.IDMinLen ? (id + "000000000000").substr(0, Settings.IDMinLen) : id;
        
        dist[formattedId] = itm.ext_name; // 将ID和名称添加到结果中
        
        exec(itm, dist); // 递归处理子节点
    }
};

var data = {};
exec(mapping[0], data); // 从根节点开始处理

// 生成 JSON 字符串,并去掉 ID 的双引号
var code = "{\n\t\"area_list\": {\n";
for (var key in data) {
    if (data.hasOwnProperty(key)) {
        code += `\t\t${key}: "${data[key]}",\n`;
    }
}
code = code.slice(0, -2); // 去掉最后一个逗号和换行符
code += "\n\t}\n}";

var codeLen = new Blob([code], { "type": "text/plain" }).size + 3;

return Result("", code, "area_format_user.json", codeLen + "字节");
}

带出数据分了省市县,但是还要手动加工一下数据原因【因此恢复6位时就会冲突。如过调整,生成的数据需要自行处理冲突ID】

image.png

一顿处理后,终于实现了效果:

输入:湖北省武汉市江岸区二七街道32坊1号

输出

image.png


5cd3ad3998a039648b23e1a2a6eb711f.gif

发现这个新功能就整一下。