golang 调用高德地图接口,查询客户公司名称对应的经纬度坐标

文章目录

    为了做公司大堂的数据展示大屏,需要将客户公司展示在中国地图上。
    而目前的 Excel 清单中并没有这些公司的经纬度信息,而且客户清单太长,靠手动查询是不现实的。
    于是我决定使用高德地图的接口来自动查询这些公司的经纬度坐标。

    返回数据格式

    一个示例,例如:

    查询“烟台毓璜顶医院”对应的经纬度坐标,执行发送 HTTP GET 请求到下面 URL

    https://restapi.amap.com/v3/geocode/geo?address=烟台毓璜顶医院&key=xxx

    返回数据结构

    {
        "status": "1",
        "info": "OK",
        "infocode": "10000",
        "count": "2",
        "geocodes": [
            {
                "formatted_address": "山东省烟台市芝罘区烟台毓璜顶医院(公交站)",
                "country": "中国",
                "province": "山东省",
                "citycode": "0535",
                "city": "烟台市",
                "district": "芝罘区",
                "township": [
    
                ],
                "neighborhood": {
                    "name": [
    
                    ],
                    "type": [
    
                    ]
                },
                "building": {
                    "name": [
    
                    ],
                    "type": [
    
                    ]
                },
                "adcode": "370602",
                "street": [
    
                ],
                "number": [
    
                ],
                "location": "121.391666,37.535800",
                "level": "公交地铁站点"
            },
            {
                "formatted_address": "山东省烟台市莱山区烟台毓璜顶医院(莱山院区)",
                "country": "中国",
                "province": "山东省",
                "citycode": "0535",
                "city": "烟台市",
                "district": "莱山区",
                "township": [
    
                ],
                "neighborhood": {
                    "name": [
    
                    ],
                    "type": [
    
                    ]
                },
                "building": {
                    "name": [
    
                    ],
                    "type": [
    
                    ]
                },
                "adcode": "370613",
                "street": [
    
                ],
                "number": [
    
                ],
                "location": "121.419456,37.456387",
                "level": "兴趣点"
            }
        ]
    }
    

    接口文档

    https://lbs.amap.com/api/webservice/guide/api/georegeo

    报错 USERKEY_PLAT_NOMATCH

    最初,我使用同事的高德地图 API key 调用,发现报错:

    {
        "info": "USERKEY_PLAT_NOMATCH",
        "infocode": "10009",
        "status": "0",
        "sec_code_debug": "xxx",
        "key": "xxx",
        "sec_code": "xxx"
    }
    

    从官方文档看,USERKEY_PLAT_NOMATCH 是指请求中使用的 key 与绑定平台不符。
    例如:开发者申请的是 js api 的 key,却用来调 web 服务接口。

    于是重新注册了高德开发者账号,新建了一个应用,类型改成了 WEB 服务。

    高德地图 API 平台类型

    然后就可以了。

    免费配额

    地理编码接口:

    • 日配额(次/日): 5000 次
    • 并发量上限(次/秒): 3 次

    提高准确率

    可以通过可选参数 city 指定查询的城市

    可选输入内容包括:指定城市的中文(如北京)、指定城市的中文全拼(beijing)、citycode(010)、adcode(110000),不支持县级市。当指定城市查询内容为空时,会进行全国范围内的地址转换检索。

    json 解析失败

    错误信息:json: cannot unmarshal array into Go struct field .geocodes.district of type string

    惊呆了。。。高德地图真草台班子。。。

    里面的字段正常情况下返回字符串,而查询不到的时候,返回空数组。。。下面是两个空数组的例子:

    {
        "status": "1",
        "info": "OK",
        "infocode": "10000",
        "count": "2",
        "geocodes": [
            {
                "formatted_address": "山东省济南市",
                "country": "中国",
                "province": "山东省",
                "citycode": "0531",
                "city": "济南市",
                "district": [],
                "township": [],
                "neighborhood": {
                    "name": [],
                    "type": []
                },
                "building": {
                    "name": [],
                    "type": []
                },
                "adcode": "370100",
                "street": [],
                "number": [],
                "location": "117.120128,36.652069",
                "level": "市"
            },
            {
                "formatted_address": "宁夏回族自治区银川市永宁县第四",
                "country": "中国",
                "province": "宁夏回族自治区",
                "citycode": "0951",
                "city": "银川市",
                "district": "永宁县",
                "township": [],
                "neighborhood": {
                    "name": [],
                    "type": []
                },
                "building": {
                    "name": [],
                    "type": []
                },
                "adcode": "640121",
                "street": [],
                "number": [],
                "location": "106.251830,38.229392",
                "level": "村庄"
            }
        ]
    }
    

    另一例:

    json: cannot unmarshal array into Go struct field .geocodes.city of type string

    {
        "status": "1",
        "info": "OK",
        "infocode": "10000",
        "count": "1",
        "geocodes": [
            {
                "formatted_address": "澳门特别行政区花王堂区镜湖医院",
                "country": "中国",
                "province": "澳门特别行政区",
                "city": [],
                "district": "花王堂区",
                "township": [],
                "neighborhood": {
                    "name": [],
                    "type": []
                },
                "building": {
                    "name": [],
                    "type": []
                },
                "adcode": "820002",
                "street": [],
                "number": [],
                "location": "113.547896,22.196142",
                "level": "兴趣点"
            }
        ]
    }
    

    只能将这些可能出现空数组的字段改成 golang any 类型,解析时判断是 string 还是空数组,然后赋值。

    ENGINE_RESPONSE_DATA_ERROR

    39 个查询不到的数据的,返回:

    {
        "status": "0",
        "info": "ENGINE_RESPONSE_DATA_ERROR",
        "infocode": "30001"
    }
    

    ENGINE_RESPONSE_DATA_ERROR 代表服务响应失败。

    出现3开头的错误码,建议先检查传入参数是否正确。
    我检查了一下,感觉参数也没有问题,就是查询不到。罢了,我只能手动查询了。

    参考

    https://github.com/xvill/xutil/blob/57ba8486eabf542caf3ea367a3a3375d48fc90d7/map.go#L45

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式