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

更新日期: 2024-10-24 阅读次数: 410 字数: 689 分类: 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 聊聊, 查看更多联系方式