从 Google Maps API 中的单个 LatLong 确定缩放级别
Posted
技术标签:
【中文标题】从 Google Maps API 中的单个 LatLong 确定缩放级别【英文标题】:Determining zoom level from single LatLong in Google Maps API 【发布时间】:2008-11-23 13:26:30 【问题描述】:我在使用 Google Maps API 时遇到了一些问题;我想确定某个地方的经纬度(例如,根据城市名称),然后将我的地图重点放在它上面。 LatLong 部分正在工作,因此将地图集中在该点上。但是,当我只有一个点时,我无法弄清楚如何确定一个好的缩放级别。我不能只是去一些大多数时候看起来不错的标准缩放级别,因为例如,当用户输入“俄罗斯”而不是“阿姆斯特丹”时会发生什么?一些帮助将不胜感激:)
【问题讨论】:
【参考方案1】:我刚刚在 Google IO 上问过这个问题。此功能存在,但未记录在案,并且还没有访问器。你想要做的是得到Structured Address。检查您返回的 json 结构并查找这些新参数。当我有机会尝试时,我会发布更多信息。
【讨论】:
【参考方案2】:我也有同样的问题,Nick Retallack 的回答对我有用。为了提供更多详细信息,未记录属性的名称是“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 更改后继续存在。最好不要假设它会一直存在,并定义一些合理的默认缩放值。
【讨论】:
【参考方案3】:您的问题缺少输入参数。您说的是 LatLon 点,但实际上您需要 LatLonBounds 来聚焦可用的地图窗口大小。我假设您想模仿官方的 Google 地图行为。除了地理编码之外,它们还依赖于 Gmap API 无法访问的其他数据。所以你必须提供你自己的。
【讨论】:
【参考方案4】:如果您可以为其提供适当的矩形边界对象,则以下调用将为您提供缩放级别:
GMap2.getBoundsZoomLevel(bounds)
但是如何计算边界呢?
您可以使用地图使用“通过眼睛”确定的矩形手动注释每个源记录,并让某人输入值。
理想情况下,您需要数据,幸运的是,DBPedia 上有大量数据。
我的几何和代数有点生疏,但我相信你可以根据你想要查看的位置的面积计算出一个矩形。 (如果假设是方形城市,可能从平方根开始,或者如果假设圆形城市,则重新排列 πr2)
Try out这个查询提取区域的面积。
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 中download the Titles, Infobox and coordinates data sets 并将它们加载到例如耶拿。请记住在加载过程中关闭所有验证选项:-)
您还可以使用RESTful API 访问此数据,它具有相当可用的 Web 表单,并且可以使用 firefox 下载窗口中的“复制下载链接按钮”拉取其生成的 URL,或将输出格式设置为 html .它还生成 XML 和 JSON。
不要忘记为摇摆不定的城市添加边距...
【讨论】:
【参考方案5】:您是否从地理编码器获取您的位置点?如果是,您可以获取该点的精度并以此为基础进行缩放(更高的精度 = 更高的缩放)。
【讨论】:
【参考方案6】:我在这里用 Objective-C 实现了 Nick Retallack 的解决方案的一个版本。
Equivalent Objective-C code for Google Maps GMap2.getBoundsZoomLevel(bounds)?
【讨论】:
【参考方案7】:我遇到了同样的问题here,但使用了更新的 API 版本。新的解决方案是map.fitBounds(autocomplete.getPlace().geometry.viewport);
。
【讨论】:
以上是关于从 Google Maps API 中的单个 LatLong 确定缩放级别的主要内容,如果未能解决你的问题,请参考以下文章
WMS 作为 Google Maps v3 中的单个平铺图像
在 google maps api v3 中隐藏方向服务中的标记