【已解决】调用百度地图API将城市转换为经纬度问题

先获取城市名,如:安徽合肥、上海...,再通过调取百度地图的API来获取相应的经纬度。


url 正确格式应该为:

url = 'http://api.map.baidu.com/geocoder/v2/?address=%s&output=json&ak=你的密钥匙(AK)' % (name)


注意 3 点:

1、在百度地图开放端申请 ak 时,准备用浏览器访问,应用类型就选用 “ 浏览器端 ” ,“启用服务”这一项默认情况下没有全选,所以,打开 url 时若报错,如:{ status  240 message "APP 服务器被禁用" },那你一定要去看看这一项,检查相关的服务有没有打开。


2、url 格式一定要对。

格式不对,会报错:

 INVALID_PARAMETERS 非法参数,参数错误时候给出。
 最后,打开 url 后,输出的形式为:
{"status":0,"result":{"location":{"lng":117.28269909168304,"lat":31.86694226068694},"precise":0,"confidence":12,"level":"城市"}}


3、对于url 中文混搭

如果 name是中文,那么在用urllib.request请求时会报错:

# url 含中文时
url = 'http://api.map.baidu.com/geocoder/v2/?address=安徽合肥市s&output=json&ak=uYr0vs7KOcs8I5y6e4Y479CyW6xOC3GV'
req = urllib.request.Request(url)
print(req)
html = urllib.request.urlopen(req)  # 获取页面
jsons = html.read().decode('utf-8') #转化为str类型

#会报错:
UnicodeEncodeError: 'ascii' codec can't encode characters

解决:对中文部分进行编码  parse.quote()

####  处理混合中文的 url,先用 parse.quote()
from urllib import parse
s='安徽合肥市'
h = parse.quote(s)
url = 'http://api.map.baidu.com/geocoder/v2/?address=%s&output=json&ak=uYr0vs7KOcs8I5y6e4Y479CyW6xOC3GV' % (h)
req = urllib.request.urlopen(url)
# print(req)
html=req.read().decode('UTF-8')  #转为 str
# html=req.read()   #<class 'bytes'>
# print(type(html))
## 输出为:{"status":0,"result":{"location":{"lng":117.28269909168304,"lat":31.86694226068694},"precise":0,"confidence":12,"level":"城市"}}
hjson = json.loads(html)  # 转化为dict类型

lng_lat = ['', '']
if hjson['result']:
    lng = hjson['result']['location']['lng']  # 经度
    print(type(lng))  #<class 'float'>
    # print(lng)
    lat = hjson['result']['location']['lat']  # 纬度
    lng_lat = [lng, lat]
    print(lng_lat)   #  如 :[117.28269909168304, 31.86694226068694]
else:
   print('error')


另:论坛里会有百度地图的相关技术人员发的技术贴,各类错误解释,可以逛逛。

官方介绍


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用百度地图API的地理编码服务实现该功能,具体步骤如下: 1. 创建百度开发者账号并申请地图API权限。 2. 在Java项目中引入百度地图API的Java SDK。 3. 调用地理编码服务的API,传入地址参数即可获取对应的经纬度信息。 以下是Java代码示例: ``` import com.baidu.mapapi.SDKInitializer; import com.baidu.mapapi.model.LatLng; import com.baidu.mapapi.utils.CoordinateConverter; import com.baidu.mapapi.utils.CoordinateConverter.CoordType; import com.baidu.mapapi.utils.HttpUtil; public class GeoCoder { private static final String GEOCODER_URL = "http://api.map.baidu.com/geocoder/v2/"; private static final String AK = "your_ak"; // 替换成申请的AK public static LatLng getLatLng(String address) { String url = GEOCODER_URL + "?address=" + address + "&output=json&ak=" + AK; String response = HttpUtil.get(url, "utf-8"); JSONObject jsonObject = JSONObject.parseObject(response); int status = jsonObject.getInteger("status"); if (status == 0) { JSONObject result = jsonObject.getJSONObject("result"); JSONObject location = result.getJSONObject("location"); double lat = location.getDouble("lat"); double lng = location.getDouble("lng"); // 将百度地图坐标转换为GPS坐标 LatLng baiduLatLng = new LatLng(lat, lng); CoordinateConverter converter = new CoordinateConverter(); converter.from(CoordType.COMMON); converter.coord(baiduLatLng); LatLng gpsLatLng = converter.convert(); return gpsLatLng; } else { return null; } } } ``` 其中,AK是百度地图API的密钥,需要替换成您自己申请的密钥。该代码实现了将百度地图坐标转换为GPS坐标,如果不需要转换可以去掉相应的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值