百度地图中如何获取某个经纬度附近的地址

我们在网页版中使用百度地图的时候,可以发现点击一下定位以后会定位到现在自己这里的位置来,并且显示自己的位置大概是什么地方。

但是查阅api的时候,当我们调用定位api的时候却经常做不到这个,虽然返回值里面有街道级别。但是并不是我们想要的大概地址。

这个的原因是因为,我们查阅的是js的api

http://lbsyun.baidu.com/cms/jsapi/reference/jsapi_reference.html


我们以为的是,我们进行定位,然后返回一个地址,但是,实际上并不在这里。而是在

http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding-abroad

web服务的api中。。。

当我们传递一个定位经纬度,然后再返回这个经纬度对应的大致地址。。。

以前的时候使用过高德地图的时候有一个地图组件,可以实现通过一条url就跳转到外部的浏览器来实现地图功能,而这个的也是一个url,所以一开始的时候也会跟人感觉是跳到外面去。但是并不是这样的。

当我们调用这个url的时候,他会给我们返回数据,然后我们可以通过回调函数来获取这个数据。

           // 逆地址解析
            function _parseAddress(point) {
                return new Promise((resolve) => {
                    // geoc.getLocation(point, (rs) => {
                    //   resolve(rs.addressComponents)
                    // })
                    $window.renderReverse = function (rs) {
                        resolve(rs.result)
                        document.body.removeChild($script)
                    }
                    const $script = document.createElement('script')
                    $script.src = encodeURI(`https://api.map.baidu.com/geocoder/v2/?callback=renderReverse&location=${point.lat},${point.lng}&output=json&pois=1&ak=${bMapAk}`)
                    document.body.appendChild($script)

                })
            }

这个上面的代码中,我们通过定位获取到我们当前的百度坐标,传入函数。

随后异步加载script,加载完成后会返回一个json数据,并且调用我们的renderReverse回调函数。而我们这里使用了Promise,把状态设置成resolve,这里的难度其实不大。


但是问题的关键点在于,很多时候我们只会去web js的文档中去找解决方案。

而是百度地图的机制。现在jsonp用的越来越少了,看到这个代码有的时候会不是很懂。同样跟jsonp有关的还有白名单设置。以前的时候我一直不懂为啥要进行白名单设置,或者说这个白名单设置到底是怎么实现。因为我以为,用户在进行定位的时候,其实是像百度发送了一个请求,然后实现的定位。那么referrer永远是当前用户的ip,那么白名单就做不到限制了啊。

这里其实是因为我对这个的理解不对吧。用户进行定位的时候,其实访问的是加载好的js api脚本,而这个脚本的获取,是在服务器传递给用户的之前获取到的。

也就是说,当用户进入这个页面的时候,先向服务器进行请求,这个时候服务器想百度请求jsapi文件,随后把这个文件给用户,这样第一个referrer就永远是服务器的域名与地址,因此别人使用我们的key的时候,是从自己的域名或者ip上发送的请求,就获取不到api了。也就无法实现定位操作。



猜你喜欢

转载自blog.csdn.net/aboyl/article/details/79777458