如何在同一张地图上使用带有多个标记的谷歌地图 API

Posted

技术标签:

【中文标题】如何在同一张地图上使用带有多个标记的谷歌地图 API【英文标题】:How to use google maps API with multiple markers on the same map 【发布时间】:2010-10-10 23:38:36 【问题描述】:

所以,我有以下脚本来使用谷歌地图 API,一切都很好,但我需要创建一个具有多个标记(指向某物的气球形图标)的地图,并且我需要这些标记中的每一个指向地图的不同区域(即不同的坐标),我该怎么做?

<script type="text/javascript">

         function load() 

        var map = new GMap2(document.getElementById("map"));
        var marker = new GMarker(new GLatLng(<%=coordinates%>));

        var html="<img src='simplemap_logo.jpg' width='20' height='20'/> " +
             "<%=maptitle%><br/>" +
             "<%=text%>";



        map.setCenter(new GLatLng(<%=coordinates%>), <%=zoom%>)
        map.setMapType(G_HYBRID_MAP);
        map.addOverlay(marker);
        map.addControl(new GLargeMapControl());
        map.addControl(new GScaleControl());
        map.addControl(new GMapTypeControl());


        marker.openInfoWindowHtml(html);
        

        //]]>
        </script>

还有一个问题,如果我将脚本文本作为变量传递,我们可以这样说:

<script type="text/javascript">
<%=ScriptText%>
</script>

我的 将是一个字符串,我将构建它并将其值分配给一个名为 ScriptText 的 Friend 或公共变量,它还能正常运行和工作吗? (我这样做是为了使我的脚本动态和不同,这取决于我如何将它构建为一个字符串,因为我在 javascripting 方面的文盲;P)

【问题讨论】:

【参考方案1】:

obeattie 和 gregers 都是对的。通常,您需要将标记参数存储在某种数组中,以后至少会使用两次:

    将叠加层添加到地图时 将其添加到 GLatLngBounds 对象以计算中心点和缩放级别时

数组或标记看起来像一个对象数组,类似于:

var latlng1 = [
    new GLatLng( 48.1234, -120.1234 ),
    new GLatLng( 48.5678, -120.5678 ),
    new GLatLng( 48.9101, -120.9112 ),
    new GLatLng( 48.1121, -120.1314 ),
    new GLatLng( 48.3145, -120.1516 ),
    new GLatLng( 48.1617, -120.1718 ),
    new GLatLng( 48.1819, -120.1920 ),
    new GLatLng( 48.2021, -120.2122 )
];

添加标记的代码类似于:

  // assume that map1 is an instance of a GMap2 object

  // #0 -- google maps api requires us to call setCenter first before calling any other operation on the map
  map1.setCenter( new GLatLng( 0, 0 ), 0 );

  // #1 -- add markers
  for ( var i = 0; i < latlng1.length; i++ )
  
    var marker = new GMarker( latlng1[ i ] );
    map1.addOverlay( marker );
  

  // #2a -- calculate center
  var latlngbounds = new GLatLngBounds( );
  for ( var i = 0; i < latlng1.length; i++ )
  
    latlngbounds.extend( latlng1[ i ] );
  

  // #2b -- set center using the calculated values
  map1.setCenter( latlngbounds.getCenter( ), map1.getBoundsZoomLevel( latlngbounds ) );

关于在客户端 javascript 中使用服务器端脚本的问题,是的,您可以将它们混合在一起。从你的描述来看,我认为这是你需要做的:

<script type="text/javascript">
    var latlng1 = new Array( );
</script>
<script type="text/javascript">
    <%
        do until rs.eof
            %>
            latlng1.push( new GLatLng( parseFloat( '<%= rs( "Lat" ) %>' ), parseFloat( '<%= rs( "Lng" ) %>' ) ) );
            <%
            rs.movenext
        loop
    %>
</script>

我在http://salman-w.blogspot.com/2009/03/zoom-to-fit-all-markers-polylines-or.html发了一篇文章

【讨论】:

既然你要通过同一个 latlng1 数组两次,为什么要有一个 for 循环并在同一个循环中调用 map1.addOverlay 和 latlngbounds?【参考方案2】:

您需要为要在地图上标记的每个地点创建一个新的GMarker。 here 为 GMarkers 提供了相当不错的文档。

要创建GMarker,您将从文档中看到,您首先需要创建一个GLatLng,表示您要放置标记的位置。您没有提到想要气球中的任何内容,所以我假设它只是您所追求的标记。在您的情况下,代码可能如下所示:

var markerCoords = [
    new GLatLng(<latitude>, <longitude>),
    new GLatLng(<latitude>, <longitude>),
    [...]
];

for (coord in markerCoords)
    map.addOverlay(new GMarker(coord));
;

我相信您可能可以确切地知道这里发生了什么,但为了以防万一,我创建了一个 GLatLng 对象数组(这可以是任意长度 [在界限内哈哈]),然后对其进行迭代,为数组中定义的每个GLatLng 添加标记。

如果您计划创建大量标记,您可能会发现使用Marker Manager 很有用,这将加速同时渲染大量标记(通过不渲染屏幕外标记并在-如果屏幕的一个区域有很多,则筛选它们)。

【讨论】:

谢谢,我的问题的最后一部分怎么样???是否可以将脚本构建为字符串,然后将其作为变量传递?【参考方案3】:

obeattie 很好地回答了你的问题。但从您的示例代码来看,您似乎还希望地图缩放到包含标记的区域。要使用多个标记执行此操作,您可以创建为每个标记扩展的 GLatLngBounds。然后,您可以从边界对象中获取适合您的标记集合的中心和缩放。

var markersBounds = GLatLngBounds(); var coord = null; for (coord in markerCoords) coord = new GMarker(coord); map.addOverlay(); markersBounds.extend(coord); ;

var markersCenter = markersBounds.getCenter();
var markersZoom = G_HYBRID_MAP.getBoundsZoomLevel(markersBounds);

map.setCenter(markersCenter, markersZoom);

我不是 100% 确定 G_HYBRID_MAP.getBoundsZoomLevel,但如果我没记错的话,G_HYBRID_MAP 是 GMapType 的一个实例。

【讨论】:

【参考方案4】:

我有类似的东西,但事件不起作用。我可以在对象的构造函数中添加侦听器吗?

//Localization object onstructor
function Localization(width, height, description, img_source)
    this.point = new GLatLng(width, height);
    this.marker = new GMarker(this.point);
    this.description = description;
    this.img_source = img_source;
    GEvent.addListener(this.marker, "click", function()marker.openInfoWindowHtml(this.description););


//map localizations to show on map
var localizations = [
    new Localization( 52.9015797, 15.2602200, 'Poznań1', 'eye1' ),
    new Localization( 52.9025797, 15.1602200, 'Poznań2', 'eye2' ),
    new Localization( 52.9035797, 15.2702200, 'Poznań3', 'eye3' ),
    new Localization( 52.9045797, 15.2102200, 'Poznań4', 'eye4' ),
]

var map = new GMap2(document.getElementById("mapa"));
map.setCenter(localizations[3].point, 13);
map.setUIToDefault();


for(i=0; i < localizations.length; i++)
    localization=localizations[i];
    map.addOverlay(localization.marker);
    localization.marker.openInfoWindowHtml(localization.description);

【讨论】:

以上是关于如何在同一张地图上使用带有多个标记的谷歌地图 API的主要内容,如果未能解决你的问题,请参考以下文章

如何在圆形语音气泡内制作带有照片的谷歌地图标记?

带有来自服务器的数字标记的谷歌地图

如何在android中的谷歌地图上绘制路线并计算多个标记之间的距离

如何在谷歌地图android上设置多个标记?

带有标记的谷歌地图没有出现地图

带有css圆角的谷歌地图自定义标记