我在使用 Google Maps API 时遇到了一些问题;我想确定某个地方的经纬度(例如,根据城市名称),然后将我的地图重点放在它上面。LatLong 部分正在工作,因此将地图集中在该点上。但是,当我只有一个点时,我无法弄清楚如何确定一个好的缩放级别。我不能只是去一些大多数时候看起来不错的标准缩放级别,因为例如,当用户输入“俄罗斯”而不是“阿姆斯特丹”时会发生什么?一些帮助将不胜感激:)
7 回答
我刚刚在 Google IO 上问了这个问题。此功能存在,但未记录在案,并且还没有访问器。您想要做的是获取结构化地址。检查您返回的 json 结构并查找这些新参数。当我有机会尝试这个时,我会发布更多信息。
您的问题缺少输入参数。您说的是 LatLon 点,但实际上您需要 LatLonBounds 来聚焦可用的地图窗口大小。我假设您想模仿官方的 Google 地图行为。除了地理编码之外,它们还依赖于 Gmap API 无法访问的其他数据。所以你必须提供你自己的。
如果您可以为其提供适当的矩形边界对象,则以下调用将为您提供缩放级别:
GMap2.getBoundsZoomLevel(bounds)
但是如何计算边界?
您可以使用地图使用“通过眼睛”确定的矩形手动注释每个源记录,并让某人输入值。
理想情况下,您需要数据,幸运的是 DBPedia 上有大量数据。
我的几何和代数有点生疏,但两者都有一点,我相信你可以根据你想要查看的位置区域计算出一个矩形。(如果假设一个方形城市,可能从平方根开始,或者如果假设一个圆形城市,则重新排列 πr 2 )
试试这个查询来提取区域的面积。
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dbpedia2: <http://dbpedia.org/property/>
SELECT ?url, ?label, ?lat, ?long, ?area WHERE {
?url geo:lat ?lat .
?url geo:lat ?long .
?url rdfs:label ?label . FILTER ( lang(?label) = 'en' ) .
?url dbpedia2:area ?area . FILTER ( datatype(?area) = xsd:double )
} LIMIT 10
您需要缓存结果或将它们加载到更快的本地数据源中,因为 DBPedia 正在搜索数百万个非结构化数据(以及 RDF 数据)的三元组。您可以从 DBPedia下载 Titles、Infobox 和坐标数据集并将它们加载到例如 Jena 中。请记住在加载过程中关闭所有验证选项:-)
您还可以使用具有相当可用的 Web 表单的RESTful API访问此数据,并且可以使用 firefox 下载窗口中的“复制下载链接按钮”或将输出格式设置为 HTML 来提取其生成的 URL。它还生成 XML 和JSON。
不要忘记为摇摆不定的城市添加边距...
我也有同样的问题,尼克·雷塔拉克的回答对我有用。为了提供更多详细信息,未记录属性的名称是“ExtendedData”,其中包含“LatLonBox”,其中包含适当缩放级别的北、南、东和西边界。
例如,如果您要搜索“90210”,这里是输出(为了便于阅读,我已对其进行了格式化):
{
"id":"p1",
"address":"Beverly Hills, CA 90210, USA",
"AddressDetails":{
"Accuracy":5,
"Country":{
"AdministrativeArea":{
"AdministrativeAreaName":"CA",
"SubAdministrativeArea":{
"Locality":{
"LocalityName":"Beverly Hills",
"PostalCode":{"PostalCodeNumber":"90210"}
},
"SubAdministrativeAreaName":"Los Angeles"
}
},
"CountryName":"USA",
"CountryNameCode":"US"
}
},
// This is what you're looking for "ExtendedData":{ "LatLonBox":{ "north":34.13919, "south":34.067018, "east":-118.38971, "west":-118.442796 } },
"Point":{
"coordinates":[-118.4104684,34.1030032,0]
}
}
虽然这是无证的,所以我不确定它是否会在 API 更改后继续存在。最好不要假设它会一直存在,并定义一些合理的默认缩放值。
您是否从地理编码器获取您的位置点?如果是这样,您可以获取该点的准确性并以此为基础进行缩放(更高的准确性 = 更高的缩放)。
我在这里用 Objective-C 实现了 Nick Retallack 的解决方案的一个版本。
Google Maps GMap2.getBoundsZoomLevel(bounds) 的等效 Objective-C 代码?
我在这里遇到了同样的问题,但使用了更新的 API 版本。新的解决方案是map.fitBounds(autocomplete.getPlace().geometry.viewport);
.