Search code examples
javascriptjsongoogle-mapsgoogle-maps-api-3infowindow

add infoWindow to map marker using json


I have a simple script that adds a markers on a map, data have been taken from json. I want to add a basic infoWindow to all markers, so that when you click on it, it says "Cartier". Could you tell me what i'm doing wrong with InfoWindow code? The code is below.

<!DOCTYPE html>
    <html>
    <head>
    <style>
    html, body, #map-canvas {
      margin: 0;
      padding: 0;
      height: 100%;
    }
    </style>
<script src="https://maps.googleapis.com/maps/api/js"></script>
<script>

var map;

function initialize() {
  var mapOptions = {
        zoom: 2,
        center: {lat: 37.275, lng: 22.549},
        mapTypeId: google.maps.MapTypeId.TERRAIN
      };

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

  // Create a <script> tag and set the USGS URL as the source.
  var script = document.createElement('script');

  script.src = 'http://pastebin.com/raw.php?i=7X956uB3';
  document.getElementsByTagName('head')[0].appendChild(script);

  map.data.setStyle(function(feature) {
    var jstores = feature.getProperty('jstores');
    return {
      icon: getCircle(jstores),
      title: (jstores)
    };
  });

  var contentString = '<div id="content">Cartier</div>';

  var infowindow = new google.maps.InfoWindow({
        content: contentString
      });

  google.maps.event.addListener(marker, 'click', function() {
    infowindow.open(map,marker);
  });
}

function getCircle(jstores) {
  var circle = {
        path: google.maps.SymbolPath.CIRCLE,
        fillColor: 'red',
        fillOpacity: .2,
        scale: Math.sqrt(jstores) * 2,
        strokeColor: 'white',
        strokeWeight: .5
      };
  return circle;
}

function jewellery_stores(results) {
  map.data.addGeoJson(results);
}

google.maps.event.addDomListener(window, 'load', initialize);
</script>
</head>
 <body>
   <div id="map-canvas"></div>
 </body>
</html>

Sample JSON:

jewellery_stores({ "type": "FeatureCollection","features": [
{"type": "Feature","geometry": {"type": "Point", "coordinates": [139.730407, 35.70883]},"properties": {"jstores": 106 }},
{"type": "Feature","geometry": {"type": "Point", "coordinates": [37.615556, 55.752222]},"properties": {"jstores": 94 }},
{"type": "Feature","geometry": {"type": "Point", "coordinates": [2.3524282, 48.8564528]},"properties": {"jstores": 89 }},
{"type": "Feature","geometry": {"type": "Point", "coordinates": [55.277067, 25.176594]},"properties": {"jstores": 66 }},
{"type": "Feature","geometry": {"type": "Point", "coordinates": [-0.1276597, 51.5072759]},"properties": {"jstores": 64 }},
{"type": "Feature","geometry": {"type": "Point", "coordinates": [114.169551, 22.285261]},"properties": {"jstores": 63 }}]

Thank you in advance, Andrey


Solution

  • You are using the Google Maps Javascript API v3 Data Layer

    That supports click listeners which allow you to open infowindows containing properties included in the JSON.

    map.data.addListener('click', function (e) {
        infowindow.setPosition(e.latLng);
        infowindow.setContent("hello world<br>jstores="+e.feature.getProperty("jstores")+"<br>"+e.latLng.toUrlValue(6));
        infowindow.open(map);
    });
    

    Working code snippet:

    var map;
    var infowindow = new google.maps.InfoWindow({});
    
    function initialize() {
      var mapOptions = {
        zoom: 2,
        center: {
          lat: 37.275,
          lng: 22.549
        },
        mapTypeId: google.maps.MapTypeId.TERRAIN
      };
    
      map = new google.maps.Map(document.getElementById('map-canvas'),
        mapOptions);
    
      // Create a <script> tag and set the USGS URL as the source.
      var script = document.createElement('script');
    
      script.src = 'https://pastebin.com/raw.php?i=7X956uB3';
      document.getElementsByTagName('head')[0].appendChild(script);
    
      map.data.setStyle(function(feature) {
        var jstores = feature.getProperty('jstores');
        return {
          icon: getCircle(jstores),
          title: (jstores)
        };
      });
    }
    
    function getCircle(jstores) {
      var circle = {
        path: google.maps.SymbolPath.CIRCLE,
        fillColor: 'red',
        fillOpacity: 0.2,
        scale: Math.sqrt(jstores) * 2,
        strokeColor: 'white',
        strokeWeight: 0.5
      };
      return circle;
    }
    
    function jewellery_stores(results) {
      map.data.addGeoJson(results);
      map.data.addListener('click', function(e) {
        infowindow.setPosition(e.latLng);
        infowindow.setContent("hello world<br>jstores=" + e.feature.getProperty("jstores") + "<br>" + e.latLng.toUrlValue(6));
        infowindow.open(map);
      });
    }
    
    google.maps.event.addDomListener(window, 'load', initialize);
    html,
      body,
      #map-canvas {
        margin: 0;
        padding: 0;
        height: 100%;
      }
    <script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk"></script>
    <div id="map-canvas"></div>