高德地图API之获取定位

标签: 无 分类: 未分类 创建时间:2023-04-26 02:29:36 更新时间:2025-01-17 10:39:24

1.前言

我是用 高德API 获取定位,如下的代码获取的定位,理论上是没有问题的,但是中间还是经过了很长时间的探索,其中的主要有几点:

  • 1.需要配置js安全密钥
  • 2.需要使用 Web端 的key,而不是 Web服务的key
  • 3.获取到的ip地址并不准确,甚至是没有。

2.使用AMap.CitySearch

(1) 安装高德jsapi

1
pnpm add @amap/amap-jsapi-loader --save

(2) 配置js密钥
这个按照官方的例子进行就可以了,JS API 安全密钥使用

(3) 边写代码
准备工作做好了之后,就可以进行编码了,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 加载密钥
window._AMapSecurityConfig = {
serviceHost: "xxx"
}
// 获取定位
AMapLoader.load({
key: "xxx", // 申请好的Web端开发者Key,需要使用 Web端 key
plugins: ["AMap.CitySearch"] // 需要使用的的插件列表,
}).then((AMap) => {
const city = new AMap.CitySearch()
console.log(city)
city.getLocalCity((status:any, result:any) => {
console.log(result)
console.log(status)
console.log("sddkkkjkkkkkk")
if (status === "complete" && result.info === "OK") {
// 查询成功,result即为当前所在城市信息
console.log(result)
}
})
}).catch(e => {
console.log(e)
})

(4) 获取结果
我在百度上直接输入 ip 地址,可以查询到我的ip地址归属,但是使用高德的API竟然无法获取到我的ip地址归属,这个让我非常的费解。我同时发现了,使用官方的测试示例 也无法获取到定位地址,但是昨天我使用的时候,还是能获取到地址的啊。我使用高德地图打开,还是能获取到定位的。

3.使用AMap.Geolocation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
window._AMapSecurityConfig = { // 加载密钥
serviceHost: "xxx"
}
AMapLoader.load({
key: "xxx", // 申请好的Web端开发者Key,首次调用 load 时必填
version: "2.0", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
plugins: ["AMap.Geolocation"] // 需要使用的的插件列表,如比例尺'AMap.Scale'等
}).then((AMap) => {
const geolocation = new AMap.Geolocation({
enableHighAccuracy: true, // 是否使用高精度定位,默认:true
timeout: 10000, // 设置定位超时时间,默认:无穷大
offset: [10, 20], // 定位按钮的停靠位置的偏移量
zoomToAccuracy: true, // 定位成功后调整地图视野范围使定位位置及精度范围视野内可见,默认:false
position: "RB" // 定位按钮的排放位置, RB表示右下
})

geolocation.getCurrentPosition(function(status:any, result:any) {
console.log(status)
console.log(result)
})
}).catch(e => {
console.log(e)
})

3.过程

我是用 高德API 获取定位,如下的代码获取的定位,理论上是没有问题的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
AMapLoader.load({
key: "xxx", // 申请好的Web端开发者Key,首次调用 load 时必填
version: "2.0", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
plugins: ["AMap.CitySearch,AMap.Weather"] // 需要使用的的插件列表,如比例尺'AMap.Scale'等
}).then((AMap) => {
const city = new AMap.CitySearch()
console.log(city)
city.getLocalCity((status:any, result:any) => {
console.log(result)
console.log("sddkkkjkkkkkk")
if (status === "complete" && result.info === "OK") {
// 查询成功,result即为当前所在城市信息
console.log(result)
}
})
}).catch(e => {
console.log(e)
})

问题就是这个 city.getLocalCity 函数无法执行,没有输出,没有报错。真是奇了大怪了。

【解决方法】
(1) 后来官方指导说是看下网络请求,结果显示的是 INVALID_USER_KEY。

(2) 我尝试申请了一个 “Web服务” 的key,替换上,结果网络请求里面显示:USERKEY_PLAT_NOMATCH,意思就是 用户的key 不匹配,这就让我很不理解了,到底是用基础服务的key呢,还是使用 Web服务 的key呢?

(3) 去掉 version 参数之后,虽然可以执行下去了,也能输出结果了,但是还是显示:USERKEY_PLAT_NOMATCH,我的可就是 Web服务的 key。

我配置的明明就是 Web服务的key,但是显示的却是 USERKEY_PLAT_NOMATCH

(4) 配置了两个key的时候
配置多个key 的时候,也是会出现问题的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
AMapLoader.load({
key: "73492768ed63ce5506f574b936361f24", // 申请好的Web端开发者Key,首次调用 load 时必填
version: "2.0" // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
}).then((AMap) => {
console.log("sdfsd")
}).catch(e => {
console.log(e)
})
AMapLoader.load({
key: "c884e5b3f6ca52da18925699ab2f502d", // 申请好的Web端开发者Key,首次调用 load 时必填
plugins: ["AMap.CitySearch,AMap.Weather"] // 需要使用的的插件列表,如比例尺'AMap.Scale'等
}).then((AMap) => {
const city = new AMap.CitySearch()
console.log(city)
city.getLocalCity((status:any, result:any) => {
console.log(result)
console.log(status)
console.log("sddkkkjkkkkkk")
if (status === "complete" && result.info === "OK") {
// 查询成功,result即为当前所在城市信息
console.log(result)
}
})
}).catch(e => {
console.log(e)
})

(5) 重新配置key
我按照官方大佬的说法,我要用jsweb的key进行调用,而不是使用web服务的key进行调用,而且我的key写成了密钥。于是我修改成了 key,结果显示:INVALID_USER_SCODE

按照官方人员的说法,就是说要用到安全密钥,最后终于算是没有报错了,但是还是查不到位置。

官方的说法就是说ip地址没有覆盖到,但是我在百度中直接输入ip之后,查询到自己的ip归属的,甚至可以查到哪个区的。

参考文章:
1.Geolocation定位失败的原因是什么?
2.高德地图部分组件无效和key无效问题 这里有类似的问题,但是没有给出解决方案。
3.web H5 调用高德地图 通过ip定位获取当前城市 这个就是使用的 script 标签的形式,引入的 plugin 插件。
4.JSAPI 加载器 这是官方的例子,就是使用多个 loader 的方式
5.获取Key 成为开发者并创建 key
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。