我需要为任何给定的城市获得一个像样的边界框。截至目前,我知道没有办法做到这一点,而是通过谷歌地图 APIgeocode
功能。但是,也有问题。
例如,考虑一下阿布扎比。
这是代码(使用python googlemaps包):
>>> d = gmaps.geocode('Abu Dhabi, AE')
>>> pp.pprint(d)
{ u'Placemark': [ { u'AddressDetails': { u'Accuracy': 4,
u'Country': { u'AdministrativeArea': { u'AdministrativeAreaName': u'Abu Dhabi',
u'Locality': { u'LocalityName': u'Abu Dhabi'}},
u'CountryName': u'United Arab Emirates',
u'CountryNameCode': u'AE'}},
u'ExtendedData': { u'LatLonBox': { u'east': 54.8789043,
u'north': 24.7912388,
u'south': 24.1412558,
u'west': 53.8544291}},
u'Point': { u'coordinates': [54.3666667, 24.4666667, 0]},
u'address': u'Abu Dhabi - United Arab Emirates',
u'id': u'p1'}],
u'Status': { u'code': 200, u'request': u'geocode'},
u'name': u'Abu Dhabi, AE'}
问题是返回LatLonBox
的东西太大了——它的对角线长度超过 126 公里。恕我直言阿布扎比,我认为这座城市并没有那么大。
有趣的是,JavaScript API 返回两个框。假设results
是调用google.maps.Geocoder.geocode
“阿布扎比”的结果,我们有两个框:
results[0].geometry.bounds = ((24.1776, 54.30012), (24.5413, 54.7751))
results[0].geometry.viewport = ((24.1413, 53.8544), (24.7912, 54.8789))
正是Web 服务 API 返回的viewport
位置。另一方面,在大小和位置方面看起来要好得多 - 下图描绘了两个框
LatLonBox
:bounds
起初,我怀疑 python 包bounds
在最终结果中省略了 ,但检查 google maps web 服务返回的 json 发现 web 服务没有返回任何bounds
框 - 描述结果的 python 字典是返回的 json。
所以,我的问题是如何在使用 Web 服务 API 时获得一个像样的边界框?还是完全有替代 API?有没有人有任何使用非谷歌地图 API 来获取此类信息的经验?
谢谢。
编辑
另一个有趣的转折。虽然有些城市有巨大的边界框(或视口),但有些城市的边界框很小。例如,一个包围阿德莱德,AU 的直径只有 7km,这当然太小了: