【问题标题】:Android maps show marker only at specific zoom levelAndroid 地图仅在特定缩放级别显示标记
【发布时间】:2017-10-01 11:04:14
【问题描述】:

我想在谷歌地图上显示公交车站的位置。问题是有很多,当我缩小它变得非常混乱。我不能只显示特定缩放级别以上的标记或使它们随地图调整大小吗?

【问题讨论】:

    标签: android google-maps android-activity google-maps-markers


    【解决方案1】:

    也许这不是你想要的,但它可以帮助你。它对我有用。

    根据 Paul Trebilcox Ruiz 在this web 中创建的教程:

    当一张地图在一个小区域内有很多数据点时,它可以得到 当用户缩小时,很快就会变得混乱。不仅如此,而且 一次显示太多标记可能会导致某些设备 速度大大减慢。

    为了帮助减轻一些由这些引起的挫败感 问题,您可以使用 Google Maps Utils 库为您的 标记成簇。您需要做的第一件事是创建一个新的 实现ClusterItem 接口的模型对象。该型号 需要从ClusterItem 实现getPosition 方法 接口以返回一个有效的LatLng 对象。

    public class ClusterMarkerLocation implements ClusterItem 
    {
         private LatLng position;
    
         public ClusterMarkerLocation( LatLng latLng ) 
         {
             position = latLng;
         }
    
         @Override
         public LatLng getPosition() 
         {
             return position;
         }
    
         public void setPosition( LatLng position ) {
             this.position = position;
         }
     }
    

    创建模型后,您可以创建一个名为 ClusterMarkerActivity 并将其添加到您的清单中。当你初始化 您的地图,您需要创建一个ClusterManager,将其与您的 GoogleMap,并将您的 LatLng 职位添加为 ClusterMarkerLocationsClusterManager 让实用程序知道要集群什么。拿一个 查看initMarkers 的实现以更好地了解如何 这行得通。

    private void initMarkers() 
    {
         ClusterManager<ClusterMarkerLocation> clusterManager = new ClusterManager<ClusterMarkerLocation>( this, mGoogleMap);
         mGoogleMap.setOnCameraChangeListener(clusterManager);
    
         double lat;
         double lng;
         Random generator = new Random();
    
         for(int i = 0; i < 1000; i++) 
         {
             lat = generator.nextDouble() / 3;
             lng = generator.nextDouble() / 3;
    
             if(generator.nextBoolean()) 
             {
                 lat = -lat;
             }
    
             if(generator.nextBoolean()) 
             {
                 lng = -lng;
             }
    
             clusterManager.addItem( new ClusterMarkerLocation(new LatLng( mCenterLocation.latitude + lat, mCenterLocation.longitude + lng)));
         }
     }
    

    在这个示例中,我们创建了 1000 个随机点来显示并添加它们 到地图。 Google Maps Utils 库处理其他所有内容 我们。

    【讨论】:

      【解决方案2】:

      这就是你要找的东西。

      • 创建一个全局变量来存储标记。

        List&lt;Marker&gt; list = new ArrayList&lt;&gt;();

      • 像这样添加所有标记。

            Marker marker = googleMap.addMarker(new MarkerOptions().position(latlng).title(name).snippet(snippet));
            list.add(marker);
        
      • 然后设置OnCameraChangeListener

            googleMap.setOnCameraChangeListener(new 
            GoogleMap.OnCameraChangeListener() {
            @Override
            public void onCameraChange(CameraPosition cameraPosition) {
            for(Marker m:list){
                m.setVisible(cameraPosition.zoom>8);
            //8 here is your zoom level, you can set it as your need.
            }
            }
            });
        

      查看我的完整答案here

      【讨论】:

        【解决方案3】:

        您可以将Marker Clustering 添加到您的地图中。

        当用户缩小时,制造商被组合成集群,这使得查看地图更容易。当用户放大时,标记会显示在地图上。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-06-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多