use*_*307 8 python google-api google-earth python-3.x
我想根据纬度和经度从Google地球获取高程数据,但我无法做到这一点.我不确定我做错了什么,但我的代码如下所示.
def getElevation(locations,sensor="true", **elvtn_args):
elvtn_args.update({
'locations': locations,
'sensor': sensor
})
url = ELEVATION_BASE_URL
params = urllib.parse.urlencode(elvtn_args)
baseurl = url +"?"+ params;
req = urllib.request.urlopen(str(baseurl));
response = simplejson.load(req);
Run Code Online (Sandbox Code Playgroud)
而我得到的错误是:
Traceback (most recent call last):
File "D:\GIS\Arctools\ElevationChart - Copy.py", line 85, in <module>
getElevation(pathStr)
File "D:\GIS\Arctools\ElevationChart - Copy.py", line 45, in getElevation
response = simplejson.load(req);
File "C:\Python32\lib\json\__init__.py", line 262, in load
parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
File "C:\Python32\lib\json\__init__.py", line 307, in loads
return _default_decoder.decode(s)
File "C:\Python32\lib\json\decoder.py", line 351, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
TypeError: can't use a string pattern on a bytes-like object
Run Code Online (Sandbox Code Playgroud)
任何帮助赞赏.
jds*_*ojr 11
邮政有点晚了,但最近遇到了同样的问题.下面的解决方案对我有用.基本上是Lennart所说的.
from urllib import request
import json
req = request.urlopen('https://someurl.net/api')
encoding = req.headers.get_content_charset()
obj = json.loads(req.read().decode(encoding))
Run Code Online (Sandbox Code Playgroud)
在Python 3中,二进制数据(例如http请求的原始响应)存储在字节对象中.json/simplejson期待字符串.解决方案是使用适当的编码将字节数据解码为字符串数据,您可以在标头中找到该编码.
你找到编码:
encoding = req.headers.get_content_charset()
Run Code Online (Sandbox Code Playgroud)
然后,您通过以下方式将内容设为字符串
body = req.readall().decode(encoding)
Run Code Online (Sandbox Code Playgroud)
然后你可以将这个主体传递给json加载器.
(另外,请停止调用响应"req".这令人困惑,并使它听起来像是一个请求,但事实并非如此.)