通过普通地址查询标准行政地址街道信息

in 实用资源 with 0 comment

引言

作为政府管理的一个非常非常重要的方面,行政区划、区域编码等,都应该是一个非常非常重要且严谨的事情。不过,在我们现实生活中,却往往非常容易把大家搞懵。今天我就以我的经验,来和大家聊聊关于地址的那些事儿。

现状

之前在工作的项目里,就碰到过这种问题:由于各种原因,普通的居民、各种系统数据库、各个政府单位,所认为的地址,标准都是不统一的。
普通居民,很少会认到街道(镇)、社区(村),特别是城市居民,一般就只知道什么区、什么路、几号,然后就是小区或楼栋名和详细的房屋编号。
各种系统数据库,一般严谨一点的,就使用民政部的相关公开数据:点击访问
2024-05-08T09:01:00.png
或查看2023年发布的编码:点击访问
2024-05-08T09:01:48.png
但这些数据也只到了区(县),往下的街道、社区,这里就没有了。

不严谨的,直接找的一些互联网上公开的,比如各个地图厂家的接口,直接使用。
2024-05-08T09:11:14.png
顺便提一嘴,堂堂国家民政部的网站,挂一个接口规范文档,居然用的是百度网盘?
我实在是。。。。
2024-05-08T11:34:39.png

而各级和各个政府单位,在使用这些数据时,一般都优先以本地的规自的相关接口,或本地各委办局联合搞出的本地数据为准。

不过,更重要的现状是,好像所有人,包括相关单位部门,都不觉得这地址和编码有小小的错误,是什么大事儿。

问题

这就导致了很多问题。

层级信息传达太慢

比如我们同样拿一个地址,去各系统和平台、数据库去查,结果都不一样。
您别不信,打个很简单的比方,深圳的大鹏新区,这个是广东省和深圳这边自己定的,国务院那边还没有这个区。
这就导致,用户说,我就是大鹏新区的,你为什么老是让我选龙岗区才能找到我家的地址?
一个地方的行政区划进行了变更,本地是很容易就能改过来,但这信息可能需要一年或更长时间才能到省里、到国家、然后再到其他地区。这就导致,信息的传递,非常非常缓慢。往往准确来说,没有准确的信息,或多或少总有错误。

各地部门之间的协作效率低下

这个不用多说,之前体制内的人不干活,专门请外包人员来指使人干活,你就别指望他们能有多大的责任心。
比如,划定行政区域这个事,是民政局的活;
制定各个行政区的编码,并与地图相关专业信息结合起来,这是规自的活儿;

各互联网大厂标准不统一

这个是项目中我们发现的实际情况。每个地图厂家,这个行政区域和代码都有可能不一样。
可能主要除了国家层面的标准数据,每个厂家都是根据自己的项目开展,与各地的相关合作,进行了一些不同程度的修正。
但这些结果数据,一般也不怎么准确,不过,一般的用户还真不知道。

电商平台与快递公司纵容

一些电商公司和快递公司,为了用户体验感,一般都使用非常简单的地址录入方式。甚至很多都没有进行地址的二次校验就直接入库了。
这就经常会发生双地址的情况。就是用户在前面选了省市区,后面详细地址里,除了这个地方的详细地址,又写了另一个省市区的详细地址。
我就很好奇,现在快递公司在寄东西时,做了很多很好的设计,比如直接复制地址进行标准化的识别,比如直接输入某个大厦,让你选一下就标准了。为什么平台那边都不做校验的?订单产生的时候,应该可以判断一次地址,不过可能平台认为那不重要,那是商家和快递公司的事,与他无关。
还有各平台与快递公司,地址有的要输到区,有的要输入到街道,有的要到社区。这就导致,普通用户一直搞不清楚到底应该怎么输入才是正确的。
2024-05-08T09:54:33.png

不作为与无担当

最重要的,还是缺乏管理和规范。自己内部都无法做到规范,就更别提民企的规范性了。
就如同我之前谈到过的互联网隐私泄露问题,也是同样的,他们不管,那大家只能各搞各的,搞到后怎么用,会不会出大事,以后再说了。

吐槽到此结束。。。。。

几种没办法的办法

那么,有时候我们收到了一个类似这样的地址:金华市义乌市宾王路1号 义乌市稠州医院
我们要如何找到正确的填写行政区划呢?
这里给出几个办法:

网站,邮编库

这个网站打开这个地址:点击打开
输入老百姓的地址,点击查询就能找到标准地址了。
2024-05-08T10:29:30.png

不过这个网站好像是有限制的,每天好像只能查一条。。。。
2024-05-08T10:30:22.png

网站,开源数据库-有说是用的高德的接口。

这个应该是一个开源的数据库,点击打开
2024-05-08T10:31:37.png
这个的查询就没有限制。不过数据只到了街道,没到社区。

这个就是一个HTML页面,代码如下,有需要可以直接保存在本地,直接用浏览器打开运行。

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
    <title>Amap 高德地图根据地址获取省市区街道</title>
    <!--<link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css"/>-->
    <link rel="stylesheet" href="css/demo-center.css"/>
    <style>
        html,body,#container{
            height:100%;
            width:100%;
        }
        .btn{
            width:10rem;
            margin-left:6.8rem;  
        }
    </style>
</head>
<body>
<div id="container" class="map" tabindex="0"></div>
<div class="input-card" style='width:28rem;'>
    <div class='input-title'  style='color:rgb(0, 0, 0)'>地址街道信息查询</div>
    <div class='input-subtitle' >请输入你需要查询的地址。</div>
    <div class="input-item">
            <div class="input-item-prepend"><span class="input-item-text" >地址</span></div>
            <input id='address' type="text" value='深圳市罗湖区布心路水贝地铁站' >
    </div>
    <div class="input-item">
            <div class="input-item-prepend"><span class="input-item-text">省</span></div>
            <input id='province' disabled type="text">
    </div>
    <div class="input-item">
            <div class="input-item-prepend"><span class="input-item-text">市</span></div>
            <input id='city' disabled type="text">
    </div>
    <div class="input-item">
            <div class="input-item-prepend"><span class="input-item-text">区</span></div>
            <input id='district' disabled type="text">
    </div>
    <div class="input-item">
            <div class="input-item-prepend"><span class="input-item-text">街道/乡镇</span></div>
            <input id='street' disabled type="text">
    </div>
    <input id="geo" type="button" class="btn" value="查询一下" />
     
    <div>
        <div class='output-title'>当前查询地址:</div>
        <div class='output-result' id='address_2'></div>
    </div>
 
</div>
<script src="js/demoutils.js"></script>
<script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.15&key=160cab8ad6c50752175d76e61ef92c50&plugin=AMap.Geocoder"></script>
<script type="text/javascript" src='https://webapi.amap.com/maps?v=1.4.15&key=160cab8ad6c50752175d76e61ef92c50&plugin=AMap.ToolBar'></script>
<script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.15&key=160cab8ad6c50752175d76e61ef92c50&plugin=AMap.Autocomplete"></script>
<script src="https://webapi.amap.com/ui/1.0/main.js?v=1.0.11"></script>
<script type="text/javascript">
         
    AMapUI.loadUI(['misc/PositionPicker'], function(PositionPicker) {
        var map = new AMap.Map('container', {
            zoom: 16,
            scrollWheel: true,
            resizeEnable: true
        })
        var positionPicker = new PositionPicker({
            mode: 'dragMap',
            map: map
        });
 
         
        var auto = new AMap.Autocomplete({
            input: "address"
        });
 
         
 
        function geoCode() {
        var geocoder = new AMap.Geocoder({
        });
        var address  = document.getElementById('address').value;
            geocoder.getLocation(address, function(status, result) {
                if (status === 'complete'&&result.geocodes.length) {
                    var lnglat = result.geocodes[0].location
                    geocoder.getAddress(lnglat, function(status, result) {
                        if (status === 'complete'&&result.regeocode) {
                            var street = result.regeocode.addressComponent.township
                            document.getElementById('province').value = result.regeocode.addressComponent.province;
                            document.getElementById('city').value = result.regeocode.addressComponent.city;
                            document.getElementById('district').value = result.regeocode.addressComponent.district;
                            document.getElementById('street').value = street;
                             
                        }else{
                            log.error('根据地址查询地址失败')
                        }
                    });
                    map.setCenter(lnglat);
                    positionPicker.start(map.getBounds().getCenter())
                }else{
                    log.error('根据地址查询位置失败');
                }
            });
        }
 
        positionPicker.on('success', function(positionResult) {
            var geocoder = new AMap.Geocoder({
            });
             
            document.getElementById('address_2').innerHTML = positionResult.address;
            geocoder.getAddress(positionResult.position, function(status, result) {
                    if (status === 'complete'&&result.regeocode) {
                        var street = result.regeocode.addressComponent.township
                        document.getElementById('province').value = result.regeocode.addressComponent.province;
                        document.getElementById('city').value = result.regeocode.addressComponent.city;
                        document.getElementById('district').value = result.regeocode.addressComponent.district;
                        document.getElementById('street').value = street;
                    }else{
                        log.error('根据地址查询地址失败')
                    }
                });
        });
        positionPicker.on('fail', function(positionResult) {
            document.getElementById('province').value = '超出查询范围';
             
        });
        var getplace = document.getElementById("geo");
        var getAddresskey = document.getElementById('address')
        AMap.event.addDomListener(getplace, 'click', function() {
            geoCode();
        })
        AMap.event.addDomListener(getAddresskey, 'keydown', function(e) {
            if (e.keyCode === 13) {
                geoCode();
                return false;
            }
            return true;
        })
 
         
        positionPicker.start();
        map.panBy(0, 1);
 
        map.addControl(new AMap.ToolBar({
            liteStyle: true
        }))
 
 
    });
    </script>
 
</body>
</html>

使用百度地图的示例代码

打开这里
找到下面的示例代码部分
2024-05-08T11:00:34.png
不过,貌似没有查出来。。。。

使用腾讯地图的智能地址解析API和地址纠正补全API

这个就是收费服务了。不过我之前使用过这个服务,里面的绝大部分数据还是可以的,但也不完整和准确,只能作为参考。
这个服务腾讯好像还卡得很严,除了必须是企业认证,还必须得提工单讲清楚用来干嘛。。。
有需要的时候去看看吧
2024-05-08T11:07:09.png

使用自然资源部的天地图开放接口

这个个人也可以注册使用的,不过数据上,实在。。。。
有兴趣可以去看看

后记

综上,找了一圈,也只有个别民企的服务接口,查到了我上面那个地址的街道层面。应该高德和腾讯都可以查到的,不过腾讯要付费。
可能github上也有一些开源的数据库,我曾经找过,但是数据不权威,也不敢乱用。

如果是比较官方的项目,建议还是从省里的相关部门开始找资源,不一定能解决问题,但如果能对接到每个市里,就应该问题不大了。

Responses