Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用Google Maps API一次仅查看10个标记,而不考虑地图视图/缩放_Javascript_Json_Google Maps_Google Maps Api 3_Google Maps Markers - Fatal编程技术网

Javascript 如何使用Google Maps API一次仅查看10个标记,而不考虑地图视图/缩放

Javascript 如何使用Google Maps API一次仅查看10个标记,而不考虑地图视图/缩放,javascript,json,google-maps,google-maps-api-3,google-maps-markers,Javascript,Json,Google Maps,Google Maps Api 3,Google Maps Markers,我希望在我的web应用程序中改进Google地图。我在地图上有大约200个标记,但显然这在视觉上并不吸引人。我想知道是否有一种方法可以根据摄氏度的变化只显示10个标记?因此,如果地图是基于全世界视图,你会看到记录了10个最高温度的标记。如果您移动到世界地图上的另一部分或放大,我希望标记更新 这可能吗?我试图通过包含最多10个标记来实现这一点,但我无法使其成为动态的,因为当我添加标记时,我会通过JSON文件进行解析。它有以下输出{AA:{摄氏度:32.277778,国家:AA,日:25,纬度:12

我希望在我的web应用程序中改进Google地图。我在地图上有大约200个标记,但显然这在视觉上并不吸引人。我想知道是否有一种方法可以根据摄氏度的变化只显示10个标记?因此,如果地图是基于全世界视图,你会看到记录了10个最高温度的标记。如果您移动到世界地图上的另一部分或放大,我希望标记更新

这可能吗?我试图通过包含最多10个标记来实现这一点,但我无法使其成为动态的,因为当我添加标记时,我会通过JSON文件进行解析。它有以下输出{AA:{摄氏度:32.277778,国家:AA,日:25,纬度:12.5,经度:-70.017,月:03}

这是我最后一个完整的代码

    // Declare map and markers array globally
    var map, markers = [];

    function initMap() {

      var myLatLng = {
        lat: 0,
    lng: 0
  };

  map = new google.maps.Map(document.getElementById('map'), {
    zoom: 2,
    center: myLatLng,
    zoomControl: true
  });

  // Moved this out of the AJAX success and declared variable correctly
  var infowindow = new google.maps.InfoWindow();

  // Listen for zoom change event
  google.maps.event.addListener(map, 'zoom_changed', function() {

    // Handle markers display
    handleMarkersDisplay();
  });

  $.ajax({
    type: 'GET',
    url: 'https://us-central1-cloud-calendar-project.cloudfunctions.net/InfoWindow',
    success: function(data) {

      data = JSON.parse(data);

      for (var element in data) {

       var marker = new google.maps.Marker({
         position: {
           lat: data[element].lat,
           lng: data[element].lon
         },
         map: map,
         title: element,
         visible: false, // Default visibility is false
         marker_celsius: data[element].celsius // Add celsius as marker property
       });

       // Push this marker to the markers array
       markers.push(marker);

       google.maps.event.addListener(marker, 'click', (function(marker, element) {

         return function() {

           var content = 'Country: ' + data[element].country;
           content += '<br>Temperature (°C): ' + data[element].celsius;

           infowindow.setContent(content);
           infowindow.open(map, marker);
          }

        })(marker, element));
      }

      // All markers have been added, sort the markers array by celsius value
      markers.sort(function(a, b) {
        return b.marker_celsius - a.marker_celsius;
      });

      // Handle markers display
      handleMarkersDisplay();
    }
  });
}

function handleMarkersDisplay() {

  // Check if map current zoom <= 2
  if (map.getZoom() <= 2) {

    // Loop through markers array
    for (var i = 0; i < markers.length; i++) {

      // Only show the first 10 markers
      if (i < 10) {
        markers[i].setVisible(true);
      } else {
        markers[i].setVisible(false);
      }
    }
  } else if (map.getZoom() == 3) {

    // Loop through markers array
    for (var i = 0; i < markers.length; i++) {

      // Only show the first 10 markers
      if (i < 10) {
        markers[i].setVisible(true);
      } else {
        markers[i].setVisible(false);
      }
    }
  } else if (map.getZoom() == 4) {

    // Loop through markers array
    for (var i = 0; i < markers.length; i++) {

      // Only show the first 10 markers
      if (i < 10) {
        markers[i].setVisible(true);
      } else {
        markers[i].setVisible(false);
      }
    }
  } else if (map.getZoom() == 5) {

    // Loop through markers array
    for (var i = 0; i < markers.length; i++) {

      // Only show the first 10 markers
      if (i < 10) {
        markers[i].setVisible(true);
      } else {
        markers[i].setVisible(false);
      }
    }
  } else if (map.getZoom() == 6) {

    // Loop through markers array
    for (var i = 0; i < markers.length; i++) {

      // Only show the first 10 markers
      if (i < 10) {
        markers[i].setVisible(true);
      } else {
        markers[i].setVisible(false);
      }
    }
  } else if (map.getZoom() == 7) {

    // Loop through markers array
    for (var i = 0; i < markers.length; i++) {

      // Only show the first 10 markers
      if (i < 10) {
        markers[i].setVisible(true);
      } else {
        markers[i].setVisible(false);
      }
    }
  } else if (map.getZoom() == 8 ) {

    // Loop through markers array
    for (var i = 0; i < markers.length; i++) {

      // Only show the first 10 markers
      if (i < 10) {
        markers[i].setVisible(true);
      } else {
        markers[i].setVisible(false);
      }
    }
  } else if (map.getZoom() == 9) {

    // Loop through markers array
    for (var i = 0; i < markers.length; i++) {

      // Only show the first 10 markers
      if (i < 10) {
        markers[i].setVisible(true);
      } else {
        markers[i].setVisible(false);
      }
    }
  } else if (map.getZoom() == 10) {

    // Loop through markers array
    for (var i = 0; i < markers.length; i++) {

      // Only show the first 10 markers
      if (i < 10) {
        markers[i].setVisible(true);
      } else {
        markers[i].setVisible(false);
      }
    }
  } else {

    // Zoom is greater than 3, show all markers
    for (var i = 0; i < markers.length; i++) {

      markers[i].setVisible(true);
    }
  }
}

您将需要两件事:

将摄氏度值作为特性添加到每个标记对象 将每个标记对象添加到标记数组中,以便保留它们的引用 Google Maps API提供了多个可供监听的功能。其中之一是zoom_changed事件。通过此功能,您可以遵循以下逻辑:

使用AJAX请求数据 创建每个标记对象并将其可见性设置为false 添加摄氏度值作为标记属性 将每个标记添加到标记数组中 完成此操作并创建所有标记后:

按摄氏度值对标记数组排序 检查当前的缩放级别 如果缩放级别低于n,则循环标记并仅显示n个项目 如果缩放级别高于n,则循环标记并显示所有标记 并在用户通过收听zoom_changed事件更改缩放级别时重复该逻辑


下面的工作示例,如果zoom使用您的尝试更新您的问题,则仅显示10个最高摄氏度标记。我不知道您将此代码放置在何处,并且无法将其作为注释阅读。我不理解您试图实现的目标。如果您添加了其他标记,则显示的结果完全相同:仅显示10个最高摄氏度标记v值。有什么意义?如果我放大标记,此时标记只会消失。没有新的标记显示视图中始终有10个标记。因此,如果我从zoom 2移动到zoom 3,我有8个标记,而不是10个。我还希望代码根据特定视图的前10个最高温度添加标记。此时nt这只是在最后一个问题之前删除它们。这并不能解释你想要实现什么+也许你看到了8个标记,但地图上总是有10个标记,只要移动一下就可以了。Upsiddown先生,非常感谢你在这个问题和我的最后一个问题上的帮助和支持。你让我在这个问题出现的时候更容易学习很难联系到我的教授。我想承认这一点,所以谢谢!