项目要实现根据经纬度获取附近的建筑,由于项目在海外运营,谷歌地图首当其冲。
首先说明的是,该功能需要在服务端实现,也就是安卓的SDK不适用。
api文档地址:
https://developers.google.com/places/web-service/search#PlaceSearchResults
获取秘钥key的方法:
https://developers.google.com/places/web-service/get-api-key
api文档地址打不开怎么办,我将文档中的东西复制下来了,如下:
附近的搜索请求
默认情况下,当用户选择某个地点时,“附近搜索”会返回所选地点的所有可用数据字段,您将收到相应的结算费用。没有办法将附近搜索请求限制为仅返回特定字段。要避免请求(并支付)您不需要的数据,请改用 查找位置请求。
通过“附近搜索”,您可以搜索指定区域内的位置。您可以通过提供关键字或指定要搜索的地点类型来优化搜索请求。
附近搜索请求是以下格式的HTTP URL:
1 | https://maps.googleapis.com/maps/api/place/nearbysearch/output?parameters |
其中output
可能是以下任一值:
json
(推荐)表示JavaScript Object Notation(JSON)中的输出xml
表示输出为XML
启动“附近搜索”请求需要某些参数。作为URL中的标准,所有参数都使用ampersand(&
)字符分隔。
必需参数
key
- 您的应用程序的 API密钥。此密钥标识您的应用程序。有关 更多信息,请参阅 获取密钥。location
- 检索地点信息的纬度/经度。必须将其指定为 纬度,经度。radius
- 定义返回位置结果的距离(以米为单位)。允许的最大半径为50 000米。请注意,radius
如果指定rankby=distance
(在下面的可选参数下描述),则不得包括 。- 如果
rankby=distance
(在所描述的可选参数下面)被指定,那么一个或多个keyword
,name
或type
是必需的。
可选参数
keyword
- 与Google为此地点编入索引的所有内容匹配的字词,包括但不限于姓名,类型和地址,以及客户评论和其他第三方内容。language
- 语言代码,如果可能,指示应返回结果的语言。请参阅支持的语言 及其代码列表。请注意,我们经常更新支持的语言,因此此列表可能并非详尽无遗。minprice
和maxprice
(可选) - 仅将结果限制在指定范围内的那些位置。有效值的范围介于0(最实惠)到4(最昂贵)之间。具体值表示的确切数量因地区而异。name
- 与Google为此地点编入索引的所有内容匹配的字词。相当于keyword
。该name
字段不再局限于地名。此字段中的值与keyword
字段中的值组合,并作为同一搜索字符串的一部分传递。我们建议仅对keyword
所有搜索词使用 参数。opennow
- 仅返回在发送查询时为业务开放的那些位置。如果在查询中包含此参数,则不会返回未在Google地方信息数据库中指定营业时间的地点。rankby
- 指定列出结果的顺序。请注意,rankby
如果指定了radius
(在上面的必需参数中描述),则不得包括。可能的值是:prominence
(默认)。此选项根据结果的重要性对结果进行排序。排名将有利于指定区域内的显着位置。地方在Google索引中的排名,全球受欢迎程度以及其他因素都会影响到突出程度。distance
。此选项按照与指定距离的距离按升序对搜索结果进行偏差location
。当distance
被指定时,一个或多个keyword
,name
或type
是必需的。
type
- 将结果限制为与指定类型匹配的位置。只能指定一种类型(如果提供了多种类型,则忽略第一个条目后面的所有类型)。请参阅 支持的类型列表。pagetoken
- 返回先前运行的搜索的后20个结果。设置pagetoken
参数将使用先前使用的相同参数执行搜索 -pagetoken
将忽略除以外的所有参数。
Google Maps API Premium Plan客户注意事项:您必须在请求中包含API密钥。你应该不包括client
或 signature
参数您的要求。
附近的搜索示例
以下示例是澳大利亚悉尼一个1500米半径范围内“餐馆”类型的地点的搜索请求,其中包含“游轮”一词:
1 | https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=-33.8670522,151.1957362&radius=1500&type=restaurant&keyword=cruise&key=YOUR_API_KEY |
注意:在此示例中,您需要key
使用自己的API密钥替换,以使请求在您的应用程序中起作用。
JSON响应最多包含四个根元素:
"status"
包含请求的元数据。请参阅 下面的状态代码"results"
包含一系列地点,包含每个地方的信息。 有关这些结果的信息,请参见搜索结果 Places APIestablishment
每个查询最多返回20个结果。另外,political
可以返回结果,其用于识别请求的区域。html_attributions
可能包含一组关于此列表的归属,必须向用户显示(某些列表可能没有归属)。next_page_token
包含一个令牌,可用于返回最多20个附加结果。next_page_token
如果没有要显示的其他结果,则不会返回A. 可以返回的最大结果数为60.在next_page_token
发布a 和有效之间会有短暂的延迟。
状态代码
该"status"
搜索响应对象中字段包含请求的状态,并且可能会包含调试信息,以帮助您跟踪请求失败的原因。该"status"
字段可能包含以下值:
OK
表示没有发生错误; 成功检测到该地点,并返回至少一个结果。ZERO_RESULTS
表示搜索成功但未返回任何结果。如果搜索是latlng
在远程位置传递的,则可能会发生这种情况 。OVER_QUERY_LIMIT
表示您已超过配额。REQUEST_DENIED
表示您的请求被拒绝,通常是因为缺少无效key
参数。INVALID_REQUEST
通常表示缺少必需的查询参数(location
或radius
)。UNKNOWN_ERROR
表示服务器端错误; 再试一次可能会成功。
错误消息
当Google商家信息服务返回其他状态代码时 OK
,error_message
搜索响应对象中可能还有一个附加字段。该字段包含有关给定状态代码背后原因的更多详细信息。
访问其他结果
默认情况下,每个附近搜索或文本搜索establishment
每个查询最多返回20个结果; 但是,每个搜索可以返回多达60个结果,分为三个页面。如果您的搜索返回超过20,那么搜索响应将包含一个额外的值 - next_page_token
。将值的值传递给新搜索next_page_token
的pagetoken
参数以查看下一组结果。如果 next_page_token
为null,或者未返回,则没有进一步的结果。在next_page_token
发布a 和何时生效之间会有短暂的延迟 。在可用之前请求下一页将返回INVALID_REQUEST
响应。使用相同的方法重试请求 next_page_token
将返回下一页结果。
例如,在下面的查询中,我们搜索澳大利亚悉尼达令港附近的餐馆,并按距离对结果进行排名。您可以看到响应包含next_page_token
属性。
1 | https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=-33.8670522,151.1957362&rankby=distance&type=food&key=YOUR_API_KEY |
1 | { |
要查看下一组结果,您可以提交新查询,并将结果传递next_page_token
给pagetoken
参数。例如:
1 | https://maps.googleapis.com/maps/api/place/nearbysearch/json?pagetoken=CpQCAgEAAFxg8o-eU7_uKn7Yqjana-HQIx1hr5BrT4zBaEko29ANsXtp9mrqN0yrKWhf-y2PUpHRLQb1GT-mtxNcXou8TwkXhi1Jbk-ReY7oulyuvKSQrw1lgJElggGlo0d6indiH1U-tDwquw4tU_UXoQ_sj8OBo8XBUuWjuuFShqmLMP-0W59Vr6CaXdLrF8M3wFR4dUUhSf5UC4QCLaOMVP92lyh0OdtF_m_9Dt7lz-Wniod9zDrHeDsz_by570K3jL1VuDKTl_U1cJ0mzz_zDHGfOUf7VU1kVIs1WnM9SGvnm8YZURLTtMLMWx8-doGUE56Af_VfKjGDYW361OOIj9GmkyCFtaoCmTMIr5kgyeUSnB-IEhDlzujVrV6O9Mt7N4DagR6RGhT3g1viYLS4kO5YindU6dm3GIof1Q&key=YOUR_API_KEY |
设置pagetoken
将导致忽略任何其他参数。查询将执行与之前相同的搜索,但将返回一组新结果。您可以在原始查询后最多两次请求新页面。必须依次显示每页结果。搜索结果的两页或多页不应作为单个查询的结果显示。请注意,每次搜索都会计入针对您的使用限制的单个请求。
但是,比较坑的一点是同一个key一天调用的次数最多150000次,如果用户量较大时,要专门交费调整限制次数 。
代码示例
pom依赖
1 | <dependency> |
测试方法
1 | import de.taimos.httputils.WS; |
得到的返回结果为(有点长,省略了一部分json。。需要什么值 直接解析下面的JSON即可):
1 | resStr=={ |