it-swarm.com.ru

Текстовые метки на Google Maps v3

Я недавно перешел с v2 на v3 в Google Maps, и одна из сломанных функций заключалась в использовании текстовых меток, которые я реализовывал с помощью сторонней библиотеки (BpLabel)

The text labels in the map

Вопрос :
Как я могу отображать текстовые метки в Google Maps v3, в которых есть такие события, как «наведение мыши», которые запускаются? Примечание : Я не хочу, чтобы маркер был виден вместе с текстовой меткой. Я хочу, чтобы ТОЛЬКО текст был обозначен

Что я попробовал :

  • Использовал InfoWindow, но он слишком загроможден, и оверлей должен быть явно закрыт, тогда как мне нужно, чтобы оверлей был закрыт, когда на него наведен указатель мыши
  • Использовал InfoBox, который не так загроможден, как InfoWindow, но у него также нет триггеров событий, таких как mouseover

Любая помощь от любого, кто сталкивался с подобными проблемами, будет очень признателен.

Ура,
Rohitesh

16
Rohitesh

Я думаю, что единственный способ сделать это - использовать маркеры в качестве меток, то есть изменить форму маркера в соответствии с желаемыми метками. Две идеи, как это сделать:

1) Используйте модифицированные маркеры с пользовательской формой и текстом - например, иконки изображений, созданные с помощью Google Графики изображений и Инфографика (например, здесь или здесь ). Но API Google для создания таких иконок устарела без каких-либо мер! Или нет ?? Существует путаница, см. Мой комментарий здесь.

2) Используйте markerwithlabel library (легко найти путем поиска в Google «текст карт Google в маркер»). С помощью этой библиотеки вы можете определять маркеры с метками с иконками маркеров или без них. Если вам не нужен значок маркера, просто установите icon: {}:

 var marker = new MarkerWithLabel({
   position: homeLatLng,
   draggable: true,
   raiseOnDrag: true,
   map: map,
   labelContent: "$425K",
   labelAnchor: new google.maps.Point(22, 0),
   labelClass: "labels", // the CSS class for the label
   icon: {}
 });

Тогда вы можете работать с ним, как с обычным маркером, то есть добавить InfoWindow для событий наведения мыши!

Вот пример, как использовать эту библиотеку для того, что вам нужно .

Код соревнования:

                             <!DOCTYPE html>
<html>
<head>
 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
 <title>MarkerWithLabel Mouse Events</title>
 <style type="text/css">
   .labels {
     color: red;
     background-color: white;
     font-family: "Lucida Grande", "Arial", sans-serif;
     font-size: 10px;
     font-weight: bold;
     text-align: center;
     width: 40px;
     border: 2px solid black;
     white-space: nowrap;
   }
 </style>
 <script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?v=3&amp;sensor=false"></script>
<!-- <script type="text/javascript" src="http://google-maps-utility-library-v3.googlecode.com/svn/tags/markerwithlabel/1.1.9/src/markerwithlabel.js"></script>-->
 <script type="text/javascript" src="markerwithlabel.js"></script>
 <script type="text/javascript">
   function initMap() {
     var latLng = new google.maps.LatLng(49.47805, -123.84716);
     var homeLatLng = new google.maps.LatLng(49.47805, -123.84716);

     var map = new google.maps.Map(document.getElementById('map_canvas'), {
       zoom: 12,
       center: latLng,
       mapTypeId: google.maps.MapTypeId.ROADMAP
     });

     var marker = new MarkerWithLabel({
       position: homeLatLng,
       draggable: true,
       raiseOnDrag: true,
       map: map,
       labelContent: "$425K",
       labelAnchor: new google.maps.Point(22, 0),
       labelClass: "labels", // the CSS class for the label
       icon: {}
     });

     var iw = new google.maps.InfoWindow({
       content: "Home For Sale"
     });

var ibOptions = {
    content: 'content'
    // other options
};

var ib = new google.maps.InfoWindow(ibOptions);

ib.open(map, this);
     google.maps.event.addListener(marker, "mouseover", function (e) { ib.open(map, this); });
     google.maps.event.addListener(marker, "mouseout", function (e) { ib.close(map, this); });


   }

 </script>
</head>
<body onload="initMap()">
<p>Try interacting with the marker (mouseover, mouseout, click, double-click, mouse down, mouse up, drag) to see a log of events that are fired. Events are fired whether you are interacting with the marker portion or the label portion.</p>
 <div id="map_canvas" style="height: 400px; width: 100%;"></div>
</body>
</html>
18
TMS

Вы можете использовать InfoBox, но вы не можете использовать с ним события при наведении, добавив прослушиватели событий на карту. Вы можете добавить класс в свои информационные поля (класс по умолчанию - infobox), поэтому вы должны иметь возможность добавлять к нему события при наведении курсора, используя jQuery или JavaScript. Вот код, который я использую, чтобы не отображать маркер с меткой:

var regionsMarkerInfo = [{markerLabel: 'Label Name', coordinates: [50, -120], markerTranslation: "Label Name"}, { another object }, etc... ],
    regionsOptions = [],
    regionLabel = [];

for(var r=0; r<regionsMarkerInfo.length; r++){
          regionsOptions[r] = {
           content: "<a href='http://"+window.location.Host+"/Destinations/Regions/" +  regionsMarkerInfo[r].markerLabel + ".aspx'>"+ regionsMarkerInfo[r].markerTranslation + "</a>"
          ,boxStyle: {
            textAlign: "left"
            ,fontSize: "18px"
            ,whiteSpace: "nowrap"
            ,lineHeight: "16px"
            ,fontWeight: "bold"
            ,fontFamily: "Tahoma"
           }
          ,disableAutoPan: true
          ,position: new google.maps.LatLng(regionsMarkerInfo[r].coordinates[0], regionsMarkerInfo[r].coordinates[1])
          ,closeBoxURL: ""
          ,isHidden: false
          ,pane: "floatPane"
          ,enableEventPropagation: true
          ,boxClass: "regionLabel"
          };

          regionLabel[r] = new InfoBox(regionsOptions[r]);
          regionLabel[r].open(map);
        }

Тогда вы сможете сделать это, чтобы создать событие при наведении курсора: 

$('.regionLabel').hover(function(){}, function(){});

или же

document.getElementsByClassName('regionLabel).addEventListener('mouseover', ... )

Если вам нужно увидеть это в действии:

  1. иди сюда: http://travelalaska.dawleyassociates.com/Destitions/Regions.aspx

  2. откройте консоль и введите (копировать/вставить): $ ('. regionLabel'). hover (function () {console.log ('hovered');}, function () {console.log ('unhovered'); }); 

  3. наведите курсор на большие метки, и вы увидите текстовый вывод в консоли.

2
brouxhaha

Вы можете указать Google Maps использовать значок, URL которого является изображением SVG. В большинстве браузеров это также может быть URI данных. Если вы знаете, как сгенерировать соответствующий SVG для маркера, который вы хотите на стороне клиента, то вы можете сделать это, а затем использовать библиотеку Base64 для преобразования строки SVG в данные Base64, добавив к ней префикс 'data: image/svg + xml; base64, 'и тогда его можно использовать как URI данных. 

Обратите внимание, что Internet Explorer кажется немного более суетливым, и я обнаружил, что мне нужно свойство scaledSize, а также обычные свойства size, Origin, anchor и url для отображения любого SVG. 

Этот подход позволяет вам использовать полное изображение SVG, включая стилизованный текст, чтобы затем вы могли создать маркер с меткой с любым стилем, который вам нужен.

1
David Burton