Откройте InfoWindow для каждого полигона google maps V3
Надеюсь, что кто-то может помочь мне в этом вопросе. Я пытаюсь открыть информационное окно по щелчку для каждого полигона, созданного моими пользователями. Я использовал тот же код для маркера и хорошо работает, но я не мог заставить его работать для каждого полигона.
Есть мысли о том, как решить эту проблему?
Спасибо.
var contentString = '<div id="content">'+
'<div id="siteNotice">'+
'</div>'+
'<h2>Test</h2>'+
'</div>';
var infowindow = new google.maps.InfoWindow({
content: contentString
});
/ / Показать Области
<?php foreach ($field->result() as $f):?>
// Create an array with the coordanates of each area
var field<?=$f->id?>Coords = [
<?php $latlng=$this->resources_data->field_latlng($f->id);?>
<?php foreach ($latlng->result() as $point):?>
new google.maps.LatLng(<?=$point->lat?>, <?=$point->lng?>),
<?php endforeach;?>
];
// Create a polygon with the points of the area
var area<?=$f->id?>=new google.maps.Polygon({
paths: area<?=$f->id?>Coords,
strokeColor: '#FF0000',
strokeOpacity: 0.8,
strokeWeight: 2,
fillColor: '#FF0000',
fillOpacity: 0.35
});
// Add the area to the map.
area<?=$f->id?>.setMap(map);
google.maps.event.addListener(area<?=$f->id?>,'click',function(){
infowindow.open(map,area<?=$f->id?>)
});
<?php endforeach;?>
2 ответа:
Вы не можете использовать ту же форму InfoWindow.откройте для полигона, как вы используете для маркера (нет маркера для передачи).
Из документации
Открыть (карта?: Карта / StreetViewPanorama, якорь?:MVCObject)
Возвращаемое Значение: None
Открывает это информационное окно на данной карте. По желанию, информационное окно может быть связано с якорем. в основном API единственным якорем является класс Marker. однако, якорь может быть любым MVCObject, который предоставляет свойство LatLng position и необязательно свойство Point anchorPoint для вычисления pixelOffset (см. InfoWindowOptions). Точка привязки-это смещение от положения якоря к верхушке информационного окна.)
Вам нужно специально задать место, которое вы хотите, чтобы он открылся, когда вы вызываете метод open (latlng щелчка, как правило, хороший выбор) с InfoWindow.setposition для().
Код фрагмент:
var infowindow = new google.maps.InfoWindow({ size: new google.maps.Size(150, 50) }); function initialize() { var geolib = google.maps.geometry.spherical; var myOptions = { zoom: 20, center: new google.maps.LatLng(32.738158, -117.14874), mapTypeControl: true, mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.DROPDOWN_MENU }, navigationControl: true, mapTypeId: google.maps.MapTypeId.ROADMAP } map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); google.maps.event.addListener(map, 'click', function() { infowindow.close(); }); bounds = new google.maps.LatLngBounds(); var polygon1 = new google.maps.Polygon({ map: map, path: [geolib.computeOffset(new google.maps.LatLng(32.737355, -117.148719), 100, 0), geolib.computeOffset(new google.maps.LatLng(32.737355, -117.148719), 100, 120), geolib.computeOffset(new google.maps.LatLng(32.737355, -117.148719), 100, -120) ], name: "polygon1" }); google.maps.event.addListener(polygon1, 'click', function(event) { var contentString = "name:" + this.name + "<br>" + event.latLng.toUrlValue(6); infowindow.setContent(contentString); infowindow.setPosition(event.latLng); infowindow.open(map); }); for (var i = 0; i < polygon1.getPath().getLength(); i++) { bounds.extend(polygon1.getPath().getAt(i)); } var polygon2 = new google.maps.Polygon({ map: map, path: [geolib.computeOffset(new google.maps.LatLng(32.739341, -117.148912), 90, 180), geolib.computeOffset(new google.maps.LatLng(32.739341, -117.148912), 90, 60), geolib.computeOffset(new google.maps.LatLng(32.739341, -117.148912), 90, -60) ], name: "polygon2" }); google.maps.event.addListener(polygon2, 'click', function(event) { var contentString = "name:" + this.name + "<br>" + event.latLng.toUrlValue(6); infowindow.setContent(contentString); infowindow.setPosition(event.latLng); infowindow.open(map); }); for (var i = 0; i < polygon2.getPath().getLength(); i++) { bounds.extend(polygon2.getPath().getAt(i)); } map.fitBounds(bounds); } google.maps.event.addDomListener(window, 'load', initialize); function createClickablePoly(poly, html, label, point) { gpolys.push(poly); if (!point && poly.getPath && poly.getPath().getLength && (poly.getPath().getLength > 0) && poly.getPath().getAt(0)) { point = poly.getPath().getAt(0); } var poly_num = gpolys.length - 1; if (!html) { html = ""; } else { html += "<br>"; } var length = poly.Distance(); if (length > 1000) { html += "length=" + poly.Distance().toFixed(3) / 1000 + " km"; } else { html += "length=" + poly.Distance().toFixed(3) + " meters"; } for (var i = 0; i < poly.getPath().getLength(); i++) { html += "<br>poly[" + poly_num + "][" + i + "]=" + poly.getPath().getAt(i); } html += "<br>Area: " + poly.Area() + " sq meters"; // html += poly.getLength().toFixed(2)+" m; "+(poly.getLength()*3.2808399).toFixed(2)+" ft; "; // html += (poly.getLength()*0.000621371192).toFixed(2)+" miles"; var contentString = html; google.maps.event.addListener(poly, 'click', function(event) { infowindow.setContent(contentString); if (event) { point = event.latLng; } infowindow.setPosition(point); infowindow.open(map); // map.openInfoWindowHtml(point,html); }); if (!label) { label = "polyline #" + poly_num; } label = "<a href='javascript:google.maps.event.trigger(gpolys[" + poly_num + "],\"click\");'>" + label + "</a>"; // add a line to the sidebar html // side_bar_html += '<input type="checkbox" id="poly'+poly_num+'" checked="checked" onclick="togglePoly('+poly_num+');">' + label + '<br />'; }
body, html { height: 100%; width: 100%; }
<script src="http://maps.google.com/maps/api/js?libraries=geometry"></script> <table border="1" style="height:100%; width:100%"> <tr> <td> <div id="map_canvas" style="width:100%; height:100%"></div> </td> <td width="200"> <div id="report"></div> </td> </tr> </table>
<script> function initMap() { var map = new google.maps.Map(document.getElementById('map'), { zoom: 12, center: {lat: 45.15492713361847, lng: 15.40557861328125} }); var polygons = [{name: 'first name', coordinates:[{lat:45.15492713361847,lng:15.40557861328125},{lat:45.07933920973809,lng:15.5291748046875},{lat:45.01918507438175,lng:15.43304443359375},{lat:45.07933920973809,lng:15.3204345703125}]}]; // foreach your polygons for (var i = 0; i < polygons.length; i++) { var item = polygons[i]; var coors = item["coordinates"]; var name = item["name"]; var Polygon = new google.maps.Polygon({ path: coors, strokeColor: '#66b3ff', strokeOpacity: 0.8, strokeWeight: 5, editable: false, fillColor: 'blue', fillOpacity: 0.5, }); Polygon.setMap(map); // call function to set window attachPolygonInfoWindow(Polygon, coors, name); } } function attachPolygonInfoWindow(polygon, coors, html) { polygon.infoWindow = new google.maps.InfoWindow({ content: html }); polygon.infoWindow.setPosition(getHighestWindowPosition(coors)); google.maps.event.addListener(polygon, 'mouseover', function () { polygon.infoWindow.open(map, polygon); }); google.maps.event.addListener(polygon, 'mouseout', function () { polygon.infoWindow.close(); }); } // function to get highest position of polygon to show window nice on top function getHighestWindowPosition(coors) { var lat = -5000, lng = 0, i = 0, n = coors.length; for (; i !== n; ++i) { if (coors[i].lat > lat) { lat = coors[i].lat; lng = coors[i].lng; } } return {lat: lat, lng: lng}; } </script>