Javascript 调整窗口大小时在屏幕上保留谷歌地图标记

Javascript 调整窗口大小时在屏幕上保留谷歌地图标记,javascript,google-maps,google-maps-api-3,Javascript,Google Maps,Google Maps Api 3,我有一个包含多个标记的地图的网页,我希望我能找到一种方法,在调整窗口大小或在不同的视口中查看时,将所有这些标记保留在屏幕上 我已经尝试了我找到的不同的解决方案,但是它以不同的方式破坏了代码 这是我的密码: function draw_map($id, $mark, $lat, $long, $zoom, $width, $height, $control, $map_type, $geo_codes) { #intialize output $output = '';

我有一个包含多个标记的地图的网页,我希望我能找到一种方法,在调整窗口大小或在不同的视口中查看时,将所有这些标记保留在屏幕上

我已经尝试了我找到的不同的解决方案,但是它以不同的方式破坏了代码

这是我的密码:

    function draw_map($id, $mark, $lat, $long, $zoom, $width, $height, $control, $map_type, $geo_codes) {
    #intialize output
    $output = '';
    #put together array
   // print_r($geo_codes);exit;

  $output .= "    
    <div id='truckmap' ></div>
    <script>
      function initMap() {
        var myLatLng = {lat: ".$lat.", lng: ".$long."};

        // Create a map object and specify the DOM element for display.
        var map = new google.maps.Map(document.getElementById('truckmap'), {
          center: myLatLng,
          scrollwheel: false,
          zoom: ".$zoom."
        }); ";

   foreach ($geo_codes as $key => $stop) {
     $output .= "
        var infowindow = new google.maps.InfoWindow({
          content: '".$stop['text']."'
        });
        var marker = new google.maps.Marker({
          map: map,
          position: {lat: ".$stop['latitude'].", lng: ".$stop['longitude']."},
          title: '".$stop['opts']['title']."'
        });
        marker.addListener('click', function() {
          infowindow.open(map, marker);
        });";

   }

    $output .= "}</script><script src='https://maps.googleapis.com/maps/api/js?key=AIzaSyCmXYC5YlrqIQXuJwfYe2xiyZjswOKxsZE&callback=initMap' async defer></script>  ";

    #return output
    return $output;
} #end function
函数绘制地图($id、$mark、$lat、$long、$zoom、$width、$height、$control、$map\u type、$geo\u code){
#初始化输出
$output='';
#组合阵列
//打印($geo_代码);退出;
$output.=”
函数initMap(){
var myLatLng={lat:.$lat.”,lng:.$long.};
//创建贴图对象并指定要显示的DOM元素。
var map=new google.maps.map(document.getElementById('truckmap'){
中心:myLatLng,
滚轮:错误,
缩放:“.$zoom。”
}); ";
foreach($geo_代码为$key=>$stop){
$output.=”
var infowindow=new google.maps.infowindow({
内容:““$stop['text']””
});
var marker=new google.maps.marker({
地图:地图,
位置:{lat:'.$stop['纬度].],lng:'.$stop['经度].},
标题:“$stop['opts']['title']”
});
marker.addListener('click',function()){
信息窗口。打开(地图、标记);
});";
}
$output.=“}”;
#返回输出
返回$output;
}#结束函数

我对javascript和PHP的知识有限,因此我可以利用我能得到的所有帮助

当窗口调整大小时,需要在中添加事件侦听器。您尝试过所提出的解决方案吗

我已经把他们的小提琴简化了一点,以帮助你计算出让地图正常工作所需的基本要素

代码段:

var geocoder;
var map;
var bounds = new google.maps.LatLngBounds();

function initialize() {
  firstB = new google.maps.LatLng(38.9395799,-104.7168500999999);
  secondB = new google.maps.LatLng(38.9382571,-104.71727069999997);
  thirdB = new google.maps.LatLng(38.9382571,-99.71727069999997);
    bounds.extend(firstB);
    bounds.extend(secondB);
    bounds.extend(thirdB);

  geocoder = new google.maps.Geocoder();
  var mapOptions = {
    disableDefaultUI:true
  }

  map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
  map.fitBounds(bounds);


  var marker = new google.maps.Marker({
      position: firstB,
      map: map,
      title: 'AVS',     
  }); 

  var smarker = new google.maps.Marker({
      position: secondB,
      map: map,
      title: 'AVS',
      icon:'http://maps.google.com/mapfiles/ms/icons/blue-dot.png'
  }); 

  var tmarker = new google.maps.Marker({
      position: thirdB,
      map: map,
      title: 'AVS',
      icon:'http://maps.google.com/mapfiles/ms/icons/red-dot.png'
  }); 
 }

google.maps.event.addDomListener(window, 'load', initialize);

google.maps.event.addDomListener(window, "resize", function() {
 google.maps.event.trigger(map, "resize");
 map.fitBounds(bounds);
});
我建议您稍微重新处理地图,以便使用标记的边界初始化它,而不是在函数中传递缩放和中心。我想,如果你有多张地图或者需要添加标记,那么这将是一个比计算出要传递的缩放效果更好的解决方案。您也可以在选项中省略latlng,因为fitBounds方法可以确定中心的位置

您需要为每个生成器创建更多的变量,如firstB、secondB,并扩展bounds对象以包含它们中的每一个。您可以在initMap函数的开头使用类似的foreach函数添加所有这些内容

更新: 试试这个,它应该适合你:

        function draw_map($id, $mark, $lat, $long, $zoom, $width, $height, $control, $map_type, $geo_codes) {
$i = 1;
$output = '';
$output .= "    
<div id='truckmap' ></div>
<script>
function initMap() {
        var bounds = new google.maps.LatLngBounds();
        var myLatLng = {lat: ".$lat.", lng: ".$long."};
        // Create a map object and specify the DOM element for display.
        var map = new google.maps.Map(document.getElementById('truckmap'), {
        center: myLatLng,
        scrollwheel: false,
        zoom: ".$zoom."
    }); ";

    foreach ($geo_codes as $key => $stop) {
    $output .= "
    var marker".$i." = new google.maps.LatLng(".$stop['latitude'].",".$stop['longitude'].");
    bounds.extend(marker".$i.");
    var infowindow".$i." = new google.maps.InfoWindow({
    content: '".$stop['text']."'
    });
    var marker".$i." = new google.maps.Marker({
    map: map,
    position: {lat: ".$stop['latitude'].", lng: ".$stop['longitude']."},
    title: '".$stop['opts']['title']."'
    });
    marker".$i.".addListener('click', function() {
    infowindow".$i.".open(map, marker".$i.");
    });";
    $i++;   
    }

    $output .= "map.fitBounds(bounds); google.maps.event.addDomListener(window, 'resize', function() {
 google.maps.event.trigger(map, 'resize');
 map.fitBounds(bounds);
});}</script><script src='https://maps.googleapis.com/maps/api/js?key=AIzaSyCmXYC5YlrqIQXuJwfYe2xiyZjswOKxsZE&callback=initMap' async defer></script>  ";

    #return output
return $output;
} #end function
函数绘制地图($id、$mark、$lat、$long、$zoom、$width、$height、$control、$map\u type、$geo\u code){
$i=1;
$output='';
$output.=”
函数initMap(){
var bounds=new google.maps.LatLngBounds();
var myLatLng={lat:.$lat.”,lng:.$long.};
//创建贴图对象并指定要显示的DOM元素。
var map=new google.maps.map(document.getElementById('truckmap'){
中心:myLatLng,
滚轮:错误,
缩放:“.$zoom。”
}); ";
foreach($geo_代码为$key=>$stop){
$output.=”
var标记“$i.”=新的google.maps.LatLng(“.stop['latitude']”,“$stop['longitude']”);
扩展(标记“$i.”);
var infowindow.“$i.”=新的google.maps.infowindow({
内容:““$stop['text']””
});
var marker.“$i.”=新的google.maps.marker({
地图:地图,
位置:{lat:'.$stop['纬度].],lng:'.$stop['经度].},
标题:“$stop['opts']['title']”
});
标记“$i.”.addListener('click',function(){
信息窗口“$i.”。打开(地图、标记“$i.”);
});";
$i++;
}
$output.=“map.fitBounds(bounds);google.maps.event.addDomListener(窗口,'resize',函数(){
google.maps.event.trigger(映射,'resize');
映射边界(bounds);
});}  ";
#返回输出
返回$output;
}#结束函数

恐怕我不明白你的答案。我没有写这里发布的原始代码,我只知道基本的Javascipt,所以我不知道如何使您的解决方案适应我现有的代码…尝试我在更新中添加的代码,看看是否对您有效。好的,刚刚发现一个问题-如果我单击地图上的某个pin,它将始终打开列表中的第一个pin,不管你点击了哪一个。啊,那是一个疏忽。重新编辑它,以便它现在可以工作。弹出窗口现在可以在所有标记上工作,但弹出窗口中显示的信息仍然是来自第一个地图插针的数据。