有没有办法使用 API 从 Google 检索地图,以便显示带有标记的当地教堂列表?
我有基本的语法,并且有基本的 API 帐户设置,但我不知道如何/是否可以使用类型字段。
var mapOptions = {
center: new google.maps.LatLng("-33.8670522", "151.1957362"),
zoom: 11,
scrollwheel: false,
streetViewControl: false,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById("googlemaps"), mapOptions);
是的,您可以使用 Google Places API 来完成此操作。
我将使用 JavaScript API,因为看起来你正在使用 JS。
如文档中所述:
地点服务是一个独立的库,独立于主要的 Maps API JavaScript 代码。要使用此库中包含的功能,您必须首先使用 Maps API 引导 URL 中的库参数加载它:
<script src="https://maps.googleapis.com/maps/api/js?libraries=places"></script>
此后,使用 JavaScript Places API,您可以按类型和半径(以米为单位)请求地点。允许的最大半径为 50.000 米。
这里有一段代码演示了这一点:
var request = {
location: sydney,
radius: 5000,
types: ['church']
};
var service = new gm.places.PlacesService(map);
service.nearbySearch(request, handlePlaceResponse);
Obs.:在此示例中,
handlePlaceResponse
是处理响应并创建标记的回调。在完整的示例中查看它是如何工作的。
这将请求距悉尼点 5 公里半径范围内的教堂(
lat:
-33.8670522,lng:
151.1957362)。
要覆盖标记,您需要处理响应。在示例中,我仅使用
name
作为 InfoWindow
的内容。您可以在此处查看有关回复的详细信息:地点详细信息回复
因此,创建标记的函数如下所示:
/**
* Creates marker with place information from the response
*/
function createMarker(place) {
var marker = new google.maps.Marker({
map: map,
position: place.geometry.location
});
var infowindow = new google.maps.InfoWindow();
google.maps.event.addListener(marker, 'click', function() {
infowindow.setContent(place.name);
infowindow.open(map, this);
});
}
有关 API 支持的类型,请查看此链接:地点类型
这是一个示例,使用您问题中的点作为中心点,并使用 5000 米作为
radius
:
<html>
<head>
<title>Google Maps - Places Sample</title>
<style>
body {
margin: 0;
}
#map {
height: 100%;
width: 100%;
}
</style>
<script src="https://maps.googleapis.com/maps/api/js?key=${YOUR_API_KEY}&libraries=places"></script>
<script>
var gm = google.maps;
var map;
var bounds;
var service;
var infowindow;
var sydney = new gm.LatLng(-33.8670522, 151.1957362);
function initialize() {
var options = {
zoom: 15,
center: sydney,
mapTypeId: gm.MapTypeId.ROADMAP,
streetViewControl: false,
scrollwheel: false
};
map = new gm.Map(document.getElementById("map"), options);
var request = {
location: sydney,
radius: 5000,
types: ['church']
};
bounds = new gm.LatLngBounds();
infowindow = new gm.InfoWindow();
service = new gm.places.PlacesService(map);
service.nearbySearch(request, handlePlaceResponse);
}
/**
* Handle place response and call #createMarker to creat marker for every place returned
*/
function handlePlaceResponse(results, status) {
if (status == gm.places.PlacesServiceStatus.OK) {
for (var i = 0; i < results.length; i++) {
createMarker(results[i]);
}
}
map.fitBounds(bounds);
map.setCenter(bounds.getCenter());
}
/**
* Creates marker with place information from response
*/
function createMarker(place) {
var location = place.geometry.location;
var marker = new gm.Marker({
map: map,
position: location
});
bounds.extend(location);
gm.event.addListener(marker, 'click', function() {
infowindow.setContent(place.name);
infowindow.open(map, this);
});
}
gm.event.addDomListener(window, 'load', initialize);
</script>
</head>
<body>
<div id="map"></div>
</body>
</html>
P.S.:请务必将
${YOUR_API_KEY}
替换为您自己的密钥。