从 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 确定缩放级别的主要内容,如果未能解决你的问题,请参考以下文章

Google maps api v3,定义用户当前位置

Google Maps API门牌号码未显示

WMS 作为 Google Maps v3 中的单个平铺图像

在 google maps api v3 中隐藏方向服务中的标记

Google Maps API V3 中的 API 密钥是啥?

Google Maps Api v3:如何更改方向(设置)面板中的默认航点标记?