6

我在使用 Google Maps API 时遇到了一些问题;我想确定某个地方的经纬度(例如,根据城市名称),然后将我的地图重点放在它上面。LatLong 部分正在工作,因此将地图集中在该点上。但是,当我只有一个点时,我无法弄清楚如何确定一个好的缩放级别。我不能只是去一些大多数时候看起来不错的标准缩放级别,因为例如,当用户输入“俄罗斯”而不是“阿姆斯特丹”时会发生什么?一些帮助将不胜感激:)

4

7 回答 7

2

我刚刚在 Google IO 上问了这个问题。此功能存在,但未记录在案,并且还没有访问器。您想要做的是获取结构化地址。检查您返回的 json 结构并查找这些新参数。当我有机会尝试这个时,我会发布更多信息。

于 2009-05-27T21:03:18.210 回答
1

您的问题缺少输入参数。您说的是 LatLon 点,但实际上您需要 LatLonBounds 来聚焦可用的地图窗口大小。我假设您想模仿官方的 Google 地图行为。除了地理编码之外,它们还依赖于 Gmap API 无法访问的其他数据。所以你必须提供你自己的。

于 2008-11-23T14:03:23.893 回答
1

如果您可以为其提供适当的矩形边界对象,则以下调用将为您提供缩放级别:

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

不要忘记为摇摆不定的城市添加边距...

于 2009-04-21T21:03:27.427 回答
1

我也有同样的问题,尼克·雷塔拉克的回答对我有用。为了提供更多详细信息,未记录属性的名称是“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 更改后继续存在。最好不要假设它会一直存在,并定义一些合理的默认缩放值。

于 2009-08-11T01:31:04.877 回答
0

您是否从地理编码器获取您的位置点?如果是这样,您可以获取该点的准确性并以此为基础进行缩放(更高的准确性 = 更高的缩放)。

于 2009-08-03T15:08:22.787 回答
0

我在这里用 Objective-C 实现了 Nick Retallack 的解决方案的一个版本。

Google Maps GMap2.getBoundsZoomLevel(bounds) 的等效 Objective-C 代码?

于 2010-11-05T18:26:33.207 回答
0

我在这里遇到了同样的问题,但使用了更新的 API 版本。新的解决方案是map.fitBounds(autocomplete.getPlace().geometry.viewport);.

于 2017-06-14T19:43:44.417 回答