gpt4 book ai didi

javascript - 位置基于 Google Place Service 附近搜索结果的正确 map 中心

转载 作者:行者123 更新时间:2023-12-03 06:57:40 29 4
gpt4 key购买 nike

此代码成功获取从自动完成字段传递的 localStorage 位置 id 变量(可以单击“映射它”并在出现的弹出窗口中输入一个位置,在 roadtripsharing.com 进行测试),并创建一个标记、信息窗口、 和圆圈。我添加了默认位置 {lat: 39, lng: -105},以防用户直接访问该页面而不使用任何 localStorage。然而,即使当我从主页进入并将某些内容存储在本地存储中时,出现的位置(在本例中为 ATM 机)也都以美国科罗拉多斯普林斯为中心,即 {lat: 39, lng: -105 }。

我相信在宣布这一点

var request = {
location: mapit.getCenter(),
radius: 5000,
// query: 'atm'
types: ['atm']
};

mapit.getCenter() 应该是 results[0].geometry.location (基于从主页传递的 localStorage Place ID 的标记位置)。如何使地点服务附近搜索结果使用此位置而不是始终使用 {lat: 39, lng: -105}?

function initMapIt() {    
var mapit = new google.maps.Map(document.getElementById('mapitmap'), {
center: {lat: 39, lng: -105},
zoom: 11,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var rtscircle = new google.maps.Circle({
radius:document.getElementById("rtsfader").value*1609.34,
strokeWeight: 2,
strokeColor: "blue",
strokeOpacity: 0.9,
fillColor: "red",
fillOpacity: 0.15,
clickable: false,
map: mapit
});
if (localStorage.placetopass !== null){
var rtsgeocoder = new google.maps.Geocoder;
var newplace = localStorage.getItem('placetopass');
rtsgeocoder.geocode({'placeId': newplace}, function(results, status) {
if (status === google.maps.GeocoderStatus.OK) {
if (results[0]) {
mapit.setZoom(11);
mapit.setCenter(results[0].geometry.location);
var rtsmarker = new google.maps.Marker({
map: mapit,
position: results[0].geometry.location
});
var rtsinfowindow = new google.maps.InfoWindow;
rtsinfowindow.setContent(results[0].formatted_address+'<p><a href="http://roadtripsharing.com/rate-place">Rate this place?</a></p>');
rtsinfowindow.open(mapit, rtsmarker);
rtsmarker.addListener('click', function() {
rtsinfowindow.open(mapit, rtsmarker);
});
rtscircle.setCenter(results[0].geometry.location);
jQuery("#rtsfader").change(function(){
rtscircle.setRadius(document.getElementById("rtsfader").value*1609.34);
});
}
else {
rtscircle.setCenter({lat: 39, lng: -105});
}
} else {
rtscircle.setCenter({lat: 39, lng: -105});
}
});
document.getElementById("rts-aahs").play();
}
var request = {
location: mapit.getCenter(),
radius: 5000,
// query: 'atm'
types: ['atm']
};
var infowindow = new google.maps.InfoWindow();
var service = new google.maps.places.PlacesService(mapit);
service.nearbySearch(request, callback);

function callback(results, status) {
if (status == google.maps.places.PlacesServiceStatus.OK) {
for (var i = 0; i < results.length; i++) {
createMarker(results[i]);
console.log(results[i]);
}
}
else
alert("Status not OK");
}

function createMarker(place) {
// alert("createMarker function");
var placeLoc = place.geometry.location;
var marker = new google.maps.Marker({
map: mapit,
position: place.geometry.location
});
console.log(marker);
google.maps.event.addListener(marker, 'click', function() {
infowindow.setContent(place.name);
infowindow.open(mapit, this);
});
}

}

最佳答案

问题是您在调用 mapit.setCenter(results[0].geometry.location) 之前调用 mapit.getCenter() >。发生这种情况是因为您在 rtsgeocoder.geocode(...) 的回调中更新了 map 中心,但您没有等到该操作运行后再继续执行 nearbySearch.您可以通过在 getCenter/setCenter 调用之前添加几个 console.log 调用并观察它们发生的顺序来轻松验证这一点。

要解决此问题,您可以尝试以下方法之一:

  1. 在调用 getCenter(以及 nearbySearch以此为基础)。这不是很可靠,例如,缓慢的网络链接可能意味着需要超过 2 秒的时间,而与此同时,您没有标记可以向用户显示。
  2. rtsgeocoder.geocode 回调中立即调用 nearbySearch,甚至在每次 map 中心发生更改时调用。由于向 map 添加大量标记会消耗内存并减慢页面速度,因此您可能希望在获得新标记时删除旧标记。例如,通过保留由 createMarker 函数添加的标记数组,并对每个标记调用 marker.setMap(null)

我认为选项 2 通常是更好的选择。

关于javascript - 位置基于 Google Place Service 附近搜索结果的正确 map 中心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37200650/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com