javascript - 在通过 loadGeoJson() 加载的要素上创建信息窗口

标签 javascript google-maps-api-3 infowindow geojson

如果这是基本的,我很抱歉,但我的 javascript 知识非常有限。

我正在制作一张 map ,用于加载我在 ArcGIS 中创建的 GeoJSON 数据,这些数据使用 ogr2ogr 重新格式化为 GeoJSON。我已经加载了 map 并显示了我的 GeoJSON 文件中的点标记,我什至有一个 styleFeature() 函数来根据要素的属性设置要素的样式。

我遇到的问题是尝试在单击点要素时弹出信息窗口。

我已经成功地使用代码设置了一个事件监听器,并使用点击功能的信息更新了一个 div 的内容:

map.data.loadGeoJson('http://www.myurl.com/file.json');

map.data.setStyle(styleFeature);

map.data.addListener('click', function(event) {
    var myHTML = event.feature.getProperty('Description');
    document.getElementById('info-box').innerHTML = myHTML;
});

我想做的是有一个事件来启动这样的信息窗口,但这是行不通的:

map.data.loadGeoJson('http://www.myurl.com/file.json');

map.data.setStyle(styleFeature);

map.data.addListener('click', function(event) {
    var myHTML = event.feature.getProperty('Description');
    var infowindow = new google.maps.InfoWindow({content: myHTML});
});

我的数据集由一千多个点组成,因此对信息窗口进行硬编码是行不通的,而且我还没有看到任何示例来说明如何创建信息窗口数组,因为这些功能在调用的函数中循环setStyle() 或者。

我知道这与我对作用域、事件和对象数组缺乏了解有关,但我只是碰壁了。

如有任何帮助,我们将不胜感激。

最佳答案

要让信息窗口在点击时显示,您需要调用 open()。

  // global infowindow
  var infowindow = new google.maps.InfoWindow();

  // When the user clicks, open an infowindow
  map.data.addListener('click', function(event) {
      var myHTML = event.feature.getProperty("Description");
      infowindow.setContent("<div style='width:150px; text-align: center;'>"+myHTML+"</div>");
      infowindow.setPosition(event.feature.getGeometry().get());
      infowindow.setOptions({pixelOffset: new google.maps.Size(0,-30)});
      infowindow.open(map);
  });  

working fiddle

代码片段:

var infowindow = new google.maps.InfoWindow();
function gotoFeature(featureNum) {
    var feature = map.data.getFeatureById(features[featureNum].getId());
    if (!!feature) google.maps.event.trigger(feature, 'changeto', {feature: feature});
    else alert('feature not found!');
}

function initialize() {
  // Create a simple map.
  features=[];
  map = new google.maps.Map(document.getElementById('map-canvas'), {
    zoom: 4,
    center: {lat: -28, lng: 137.883}
  });
    google.maps.event.addListener(map,'click',function() {
        infowindow.close();
    });
    map.data.setStyle({fillOpacity:.8});
  // Load a GeoJSON from the same server as our demo.
  var featureId = 0;
  google.maps.event.addListener(map.data,'addfeature',function(e){
      if(e.feature.getGeometry().getType()==='Polygon'){
          features.push(e.feature);
          var bounds=new google.maps.LatLngBounds();
          
          e.feature.getGeometry().getArray().forEach(function(path){
          
             path.getArray().forEach(function(latLng){bounds.extend(latLng);})
          
          });
          e.feature.setProperty('bounds',bounds);
          e.feature.setProperty('featureNum',features.length-1);
          
          
        
        }
  });
  // When the user clicks, open an infowindow
  map.data.addListener('click', function(event) {
          var myHTML = event.feature.getProperty("Description");
      infowindow.setContent("<div style='width:150px; text-align: center;'>"+myHTML+"</div>");
          infowindow.setPosition(event.feature.getGeometry().get());
      infowindow.setOptions({pixelOffset: new google.maps.Size(0,-30)});
          infowindow.open(map);
  });    
   map.data.addGeoJson(googleJSON);
  
  
}

google.maps.event.addDomListener(window, 'load', initialize);
var googleJSON = {
  "type": "FeatureCollection",
  "features": [
    {
      "id":0,
      "type": "Feature",
      "properties": {
        "letter": "G",
        "color": "blue",
        "rank": "7",
        "ascii": "71",
        "Description": "the letter G"
      },
      "geometry": {
        "type": "Point",
        "coordinates": [123.61, -22.14]
         
      }
    },
    {
      "id":1,
      "type": "Feature",
      "properties": {
        "letter": "o",
        "color": "red",
        "rank": "15",
        "ascii": "111",
        "Description": "the first letter o"          
      },
      "geometry": {
        "type": "Point",
        "coordinates": [128.84, -25.76]
      }
    },
    {
      "id":2,
      "type": "Feature",
      "properties": {
        "letter": "o",
        "color": "yellow",
        "rank": "15",
        "ascii": "111",
        "Description": "the second letter o"
      },
      "geometry": {
        "type": "Point",
        "coordinates": [131.87, -25.76]
      }
    },
    {
      "id":3,
      "type": "Feature",
      "properties": {
        "letter": "g",
        "color": "blue",
        "rank": "7",
        "ascii": "103",
        "Description": "the letter g"
      },
      "geometry": {
        "type": "Point",
        "coordinates": [138.12, -25.04]
      }
    },
    {
      "id":4,
      "type": "Feature",
      "properties": {
        "letter": "l",
        "color": "green",
        "rank": "12",
        "ascii": "108",
        "Description": "the letter l"
      },
      "geometry": {
        "type": "Point",
        "coordinates": [140.14,-21.04]
      }
    },
    {
      "id":5,
      "type": "Feature",
      "properties": {
        "letter": "e",
        "color": "red",
        "rank": "5",
        "ascii": "101",
        "Description": "the letter e"
      },
      "geometry": {
        "type": "Point",
        "coordinates": [144.14, -27.41]
      }
    }
  ]
};
html, body, #map-canvas {
        height: 100%;
        margin: 0px;
        padding: 0px
}
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk"></script>
<div id="map-canvas"></div>

关于javascript - 在通过 loadGeoJson() 加载的要素上创建信息窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23814197/

相关文章:

javascript - Google Maps API InfoWindow 绑定(bind)到最后一个标记

javascript 在 Firefox 中不起作用

javascript - 多个组的 jQuery 数据表总和/小计

php - 查明给定点是否在 "area of polygon"- GoogleMaps API 内

google-maps - 使用 Google Maps API 获取中途停留城镇(路线)

javascript - Google Maps InfoWindow -(单击)触发 Angular 2 函数

javascript - 通过 JavaScript 从 Outlook 获取通讯组列表

javascript - 禁用具有给定类的网格单元的简洁方法

javascript - 当标记位置更改时,react-google-maps MapWithAMarker 无法重新呈现

javascript - Google map API InfoWindows