谷歌地图信息窗口位置

时间:2015-06-22 04:14:33

标签: javascript google-maps events infowindow

这是一个有三个多边形的sample google map。我正在为每个多边形设置infowindow,

 for (var i in coordinates) {
           arr = [];

   for (var j=0; j < coordinates[i].length; j++) {
              arr.push( new google.maps.LatLng(
                    parseFloat(coordinates[i][j][0]),
                    parseFloat(coordinates[i][j][1])
              ));

              bounds.extend(arr[arr.length-1])
            }

  // Construct the polygon.
  polygons.push(new google.maps.Polygon({
                paths: arr,
                strokeColor: '#FF0000',
                strokeOpacity: 0.8,
                strokeWeight: 2,
                fillColor: '#FF0000',
                fillOpacity: 0.35
            }));
            polygons[polygons.length-1].setMap(map);      

            var infowindow = new google.maps.InfoWindow({
  content:"Hello World!"
  });

google.maps.event.addListener(polygons[polygons.length-1], 'click', function(event) {
  infowindow.open(map);
  infoWindow.setPosition(event.latLng);
  });     

}

但是,infowindow显示在左上角位置。如何在点击多边形的中心设置它?

1 个答案:

答案 0 :(得分:2)

两个问题:

  1. 点击侦听器代码中存在拼写错误,javascript区分大小写,infowindowinfoWindow是不同的对象,因此您无法正确设置infowindow的位置。

    infowindow.open(map);
    infoWindow.setPosition(event.latLng);
    
  2. 您目前将信息窗放在点击infoWindow.setPosition(event.latLng);的地方。

  3. 如果你想让infowindow位于多边形边界的中心,你需要把它放在那里:

    updated fiddle

    代码段

    var map, infoWindow;
    var infoWindow = new google.maps.InfoWindow({
      content: "Hello World!"
    });
    
    function initialize() {
      var mapOptions = {
        zoom: 5,
        center: new google.maps.LatLng(24.886436490787712, -70.2685546875),
        mapTypeId: google.maps.MapTypeId.TERRAIN
      };
    
      var bounds = new google.maps.LatLngBounds();
      var polygons = [];
      var arr = new Array();
      var map = new google.maps.Map(document.getElementById('map-canvas'),
        mapOptions);
    
      for (var i in coordinates) {
        arr = [];
        var polyBounds = new google.maps.LatLngBounds();
        for (var j = 0; j < coordinates[i].length; j++) {
          arr.push(new google.maps.LatLng(
            parseFloat(coordinates[i][j][0]),
            parseFloat(coordinates[i][j][1])));
    
          bounds.extend(arr[arr.length - 1]);
          polyBounds.extend(arr[arr.length - 1]);
        }
        var IWpoint = polyBounds.getCenter();
        // Construct the polygon.
        polygons.push(new google.maps.Polygon({
          paths: arr,
          strokeColor: '#FF0000',
          strokeOpacity: 0.8,
          strokeWeight: 2,
          fillColor: '#FF0000',
          fillOpacity: 0.35,
          IWpoint: IWpoint
        }));
        polygons[polygons.length - 1].setMap(map);
        var centerMark = new google.maps.Marker({
          map: map,
          position: IWpoint,
          icon: {
            url: "https://maps.gstatic.com/intl/en_us/mapfiles/markers2/measle.png",
            anchor: new google.maps.Point(3.5, 3.5),
            size: new google.maps.Size(7, 7)
          },
          title: "polygon " + i
        });
        google.maps.event.addListener(polygons[polygons.length - 1], 'click', function(event) {
          infoWindow.setPosition(this.IWpoint);
          infoWindow.open(map);
        });
    
      }
      map.fitBounds(bounds);
    
    }
    google.maps.event.addDomListener(window, 'load', initialize);
    // Define the LatLng coordinates for the polygon's path.
    var coordinates = {
      "feed1": [
        [25.774252, -80.190262],
        [18.466465, -66.118292],
        [32.321384, -64.75737],
        [25.774252, -80.190262]
      ],
    
      "feed2": [
        [26.774252, -81.190262],
        [19.466465, -67.118292],
        [33.321384, -65.75737],
        [26.774252, -81.190262]
      ],
    
      "feed3": [
        [27.774252, -82.190262],
        [20.466465, -68.118292],
        [34.321384, -66.75737],
        [27.774252, -82.190262]
      ]
    };
    html,
    body,
    #map-canvas {
      height: 100%;
      margin: 0px;
      padding: 0px
    }
    <script src="https://maps.googleapis.com/maps/api/js"></script>
    <div id="map-canvas"></div>

    如果你想把它放在多边形“质心”上,你需要计算并将它放在那里:

    // from http://stackoverflow.com/questions/9692448/how-can-you-find-the-centroid-of-a-concave-irregular-polygon-in-javascript
    function get_polygon_centroid(pts) {
       var first = pts[0], last = pts[pts.length-1];
       if (first.lat() != last.lat() || first.lng() != last.lng()) pts.push(first);
       var twicearea=0,
       x=0, y=0,
       nPts = pts.length,
       p1, p2, f;
       for ( var i=0, j=nPts-1 ; i<nPts ; j=i++ ) {
          p1 = pts[i]; p2 = pts[j];
          f = p1.lat()*p2.lng() - p2.lat()*p1.lng();
          twicearea += f;          
          x += ( p1.lng() + p2.lng() ) * f;
          y += ( p1.lat() + p2.lat() ) * f;
       }
       f = twicearea * 3;
       return new google.maps.LatLng(y/f, x/f);
    }
    

    jsfiddle