为了做公司大堂的数据展示大屏,需要将客户公司展示在中国地图上。 而目前的 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 服务。
然后就可以了。
免费配额
地理编码接口:
- 日配额(次/日): 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 聊聊, 查看更多联系方式