天道酬勤,学无止境

放大时集群标记不隐藏(Cluster Marker not hiding when zoom in)

问题

我正在尝试在我的地图上实现一个集群标记,但它的行为有点奇怪,首先,它向我显示了集群标记,但也向我显示了不应该发生的点标记,当我放大群集标记仍在显示,我将添加一些图像以更好地解释它。

在此处输入图片说明

在此处输入图片说明

public class MapaViagem extends FragmentActivity {

    private GoogleMap googleMap;
    private String rm_IdViagem;
    private List<ClienteModel> mClienteModel = new ArrayList<ClienteModel>();
    private List<EnderecoModel> mEnderecoModel = new ArrayList<EnderecoModel>();
    private ViagemModel mViagemModel = new ViagemModel();
    private ClusterManager<MyItem> mClusterManager;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        setContentView(R.layout.maps);
         ArrayList<LatLng> coordList = new ArrayList<LatLng>();

        try {

            Bundle parametros = getIntent().getExtras();
            rm_IdViagem = parametros.getString("id_viagem");

            Repositorio ca = new Repositorio(this);
            mViagemModel = ca.getViagemPorId(Integer.valueOf(rm_IdViagem));

            Repositorio cl = new Repositorio(this);
            mClienteModel = cl.getClientesViagem(Integer.valueOf(rm_IdViagem));


            System.out.println("TEM CLIENTE " + mClienteModel.size());

            if(mClienteModel != null) {

                for (int i = 0; i < mClienteModel.size(); i++) {


                    Repositorio mRepositorio = new Repositorio(this);
                    mEnderecoModel = mRepositorio.getListaEnderecosDoCliente(Integer.valueOf(mClienteModel.get(i).getClientes_id()));


                    for (int j = 0; j < mEnderecoModel.size(); j++) {
                        // Loading map
                        initilizeMap();
                        // Changing map type
                        googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);

                        // Showing / hiding your current location
                        googleMap.setMyLocationEnabled(true);

                        // Enable / Disable zooming controls
                        googleMap.getUiSettings().setZoomControlsEnabled(true);

                        // Enable / Disable my location button
                        googleMap.getUiSettings().setMyLocationButtonEnabled(true);

                        // Enable / Disable Compass icon
                        googleMap.getUiSettings().setCompassEnabled(true);

                        // Enable / Disable Rotate gesture
                        googleMap.getUiSettings().setRotateGesturesEnabled(true);

                        // Enable / Disable zooming functionality
                        googleMap.getUiSettings().setZoomGesturesEnabled(true);


                        final float latitude = Float.parseFloat(mEnderecoModel.get(j).getLatitude());
                        final float longitude = Float.parseFloat(mEnderecoModel.get(j).getLongitude());


                        coordList.add(new LatLng(latitude, longitude));


                        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latitude, longitude), 10));



                        mClusterManager = new ClusterManager<MyItem>(MapaViagem.this, googleMap);


                        mClusterManager.setRenderer(new MyClusterRenderer(MapaViagem.this, googleMap, mClusterManager));

                        googleMap.setOnCameraChangeListener(mClusterManager);
                        googleMap.setOnMarkerClickListener(mClusterManager);


                        addItems(coordList);

                    }


                }
            }


        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public class MyClusterRenderer extends DefaultClusterRenderer<MyItem> {

        public MyClusterRenderer(Context context, GoogleMap map,
                                 ClusterManager<MyItem> clusterManager) {
            super(context, map, clusterManager);
        }

        @Override
        protected void onBeforeClusterItemRendered(MyItem item, MarkerOptions markerOptions) {
            super.onBeforeClusterItemRendered(item, markerOptions);



//            item.setTitle(mClienteModel.get(i));
            markerOptions.title(item.getTitle());
        }

        @Override
        protected void onClusterItemRendered(MyItem clusterItem, Marker marker) {
            super.onClusterItemRendered(clusterItem, marker);

            //here you have access to the marker itself
        }

 @Override
        protected boolean shouldRenderAsCluster(Cluster<MyItem> cluster) {
            return cluster.getSize() > 3; // when count of markers is more than 3, render as cluster
        }
    }


    private void addItems(List<LatLng> markers) {

        for (int i = 0; i < markers.size(); i++) {
            MyItem offsetItem = new MyItem(markers.get(i));
            mClusterManager.addItem(offsetItem);

        }
        mClusterManager.cluster();
    }



    private void initilizeMap() {
        if (googleMap == null) {
            googleMap = ((MapFragment) getFragmentManager().findFragmentById(
                    R.id.map)).getMap();

            // check if map is created successfully or not
            if (googleMap == null) {
                Toast.makeText(getApplicationContext(),
                        "Não foi possível carregar o mapa", Toast.LENGTH_SHORT)
                        .show();
            }
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        initilizeMap();
    }


}

模型:

public class MyItem implements ClusterItem {

    private LatLng mPosition;
    private String title;

    public MyItem(LatLng position){
        mPosition = position;
    }

    @Override
    public LatLng getPosition() {
        return mPosition;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}
回答1

首先,您需要定义ClusterManager何时应该进行集群化,因此MyClusterRenderer有一个您应该覆盖的方法:

@Override
protected boolean shouldRenderAsCluster(Cluster<MyItem> cluster) {
    return cluster.getSize() > 3; // when count of markers is more than 3, render as cluster
}

其次,当您对标记进行一些更改时,例如添加、删除、更改标题、图标、位置,您应该调用cluster()方法。 所以你的addItems方法应该是这样的:

private void addItems(List<LatLng> markers) {

    for (int i = 0; i < markers.size(); i++) {
        MyItem offsetItem = new MyItem(markers.get(i));
        mClusterManager.addItem(offsetItem);
    }
    mClusterManager.cluster();
}

编辑:

刚才又看了一下你的代码,发现你忘记设置聚类算法了,应该是:

    ...
    mClusterManager = new ClusterManager<MyItem>(MapaViagem.this, googleMap);
    mClusterManager.setAlgorithm(new GridBasedAlgorithm<MyItem>());

    mClusterManager.setRenderer(new MyClusterRenderer(MapaViagem.this, googleMap, mClusterManager));
    ...
回答2

我遇到了这个问题,并通过确保只创建 ClusterManager 并将其分配给地图一次来解决它,尝试在 create 方法中放置和 if 语句。 最有可能的是,当您在导致问题的 onResume 中再次初始化地图时。

    public void onMapReady(GoogleMap googleMap) {
    map = googleMap;

    //only create one instance of cluster manager, 
    // if created again in onResume then click listeners don't work on reload and 
    //some markers don't disappear correctly on Zoom
    if (clusterManager == null){
    clusterManager =new ClusterManager(this, map);
     }

    map.setOnMarkerClickListener(clusterManager);
    map.setOnInfoWindowClickListener(clusterManager.getMarkerManager());
    map.setBuildingsEnabled(true);
    //noinspection MissingPermission
    map.setMyLocationEnabled(true);
    map.setOnCameraIdleListener(clusterManager);


    clusterManager.setOnClusterItemInfoWindowClickListener(this);


    clusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<MyItem>() {
                @Override
                public boolean onClusterItemClick(MyItem item) {
                    return false;
                }
            });
回答3

我知道这是一个旧帖子,但今天我遇到了同样的问题。

在花了一个小时试图解决之后,我终于知道我的应用程序发生了什么:问题是集群管理器工作正常,问题是我填充地图的方法被调用了两次。

要解决这个问题,只需添加mMap.clear(); 在添加标记之前。 在这里工作就像一个魅力!

再见。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Google Maps API V3-多个标记完全相同(Google maps API V3 - multiple markers on exact same spot)
    问题 有点卡在这一个。 我正在通过JSON检索地理坐标列表,并将其弹出到Google地图上。 除了在我完全相同的位置上有两个或多个标记的情况下,其他所有程序都运行良好。 该API仅显示1个标记-最上面的一个。 我想这很公平,但是我想找到一种以某种方式显示它们的方法。 我已经搜索过google并找到了一些解决方案,但它们似乎主要用于API的V2或不是那么好。 理想情况下,我想要一个解决方案,其中您单击某种组标记,然后显示聚集在所有标记周围的标记。 任何人都有这个问题或类似问题,是否愿意分享解决方案? 回答1 看看OverlappingMarkerSpiderfier。 有一个演示页面,但它们没有显示完全位于同一位置的标记,而仅显示彼此非常靠近的标记。 但是可以在http://www.ejw.de/ejw-vor-ort/上看到一个标记完全相同的现实示例(向下滚动查看地图,然后单击一些标记以查看蜘蛛效应)。 这似乎是解决您问题的完美解决方案。 回答2 如果标记位于同一建筑物中,则偏移标记不是真正的解决方案。 您可能想要做的就是像这样修改markerclusterer.js: 在MarkerClusterer类中添加一个原型click方法,如下所示-我们稍后将在地图initialize()函数中重写此方法: MarkerClusterer.prototype.onClick =
  • 如何在谷歌地图中隐藏和显示 MarkerClusterer(How to hide and show MarkerClusterer in google maps)
    问题 当用户单击某些按钮时,我试图隐藏/显示 markerClusterer: 这是我想要做的: map = new google.maps.Map(document.getElementById("mappa"),mapOptions); var marker_tmp = []; var markers_tmp = []; $.each(json,function(index,value){ var latLng = new google.maps.LatLng(value.lat,value.lng); var marker = new google.maps.Marker({'position': latLng}); if((value.candidato in markers_tmp)==false){ markers_tmp[value.name]=[]; } markers_tmp[value.name].push(marker); }); for(var name in markers_tmp){ markers[name]= new MarkerClusterer(map,markers_tmp[name]); } 我创建了多个 markerClusterer,每个都与一个特定的名称相关联。 所以我有一些与这些特定名称相关联的按钮,我需要隐藏
  • ClusterManager 重绘 Google 地图 v2 实用程序的标记(ClusterManager repaint markers of Google maps v2 utils)
    问题 我正在发出服务器请求,当我收到来自服务器的响应时,我在 UI 线程上执行ClusterManager.addItem()但这些项目没有在地图中绘制,只有当我进行缩放更新 (+,- ) 新添加的项目开始出现。 我还尝试调试渲染器,但在我更新放大地图之前,不会调用onBeforeClusterRendered / onBeforeClusterItemRendered 。 任何想法如何刷新地图/集群管理器/标记? MarkerManager markerManager = new MarkerManager(map); clusterManager = new ClusterManager<TweetClusterItem>(getActivity(), map, markerManager); clusterManager.setRenderer(new TweetClusterRenderer(getActivity(), map, clusterManager, defaultMarker)); clusterManager.setOnClusterClickListener(this); clusterManager.setOnClusterInfoWindowClickListener(this); clusterManager
  • 集群上的 Google Maps InfoWindow(Google Maps InfoWindow on Clusters)
    问题 我有一张地图,上面有很多标记。 所有这些标记都有一个信息窗口。 使用 Markers Cluster Lib (http://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/src/markerclusterer.js),我得到点击时放大的集群。 一些标记具有完全相同的坐标,因此即使我达到最大缩放,它们也会变成一个簇。 到目前为止,这一切都很好,除了我还想在单击群集时打开一个 InfoWindow,该群集在缩放时永远不会拆分为标记。 在这个 InfoWindow 中,我想根据它包含的标记显示信息。 到目前为止,这是我的代码。 它适用于标记上的 InfoWindow,但在单击集群时不显示 InfoWindow。 function initialize(lat, lng) { var myLatlng = new google.maps.LatLng(lat,lng); var mapOptions = { mapTypeControl: false, center: myLatlng, zoom: 14, maxZonn:15 }; map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions)
  • Google Maps MarkerClusterer 要么不起作用,要么隐藏了所有标记(Google Maps MarkerClusterer either doesn't work or hides all markers)
    问题 ...取决于我把线放在哪里 var mc = new markerclusterer(map); 如果它出现在示例似乎建议的位置 - 在引入“var map”之后 - 所有标记都会消失(示例在此处运行)。 没有 mc 变量的版本在所有标记都可见的情况下运行。 当在 google.maps.event.addListener 函数之后引入 mc 变量时,如下所示,它似乎也取消了它的效果并显示了标记。 location 变量是一个数组,其中包含地图上所有点的地理定位数据和已格式化的 HTML(在电子表格中生成),这些 HTML 将传递给标记以放置它们。 我认为问题可能是与标记集群一起使用时,数组指的是地理定位数据,什么时候应该指的是标记? 我见过其他人使用变量标记数组,但我担心如果我弄乱了它,我会破坏代码的 html 和地理定位提取部分。 谁能帮助解释为什么 var mc 失败? 我已经在标头中加载了 http://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/src/markerclusterer.js,所以它应该可以工作,我看不到任何语法错误在我的代码中。 这是我用 JS 做的第一件事,它很棒,但我现在只想用标记集群来完成它! 帮助将不胜感激。 编辑:我也试过玩这个
  • 如何在谷歌地图 v3 中为相同的纬度/经度添加标记集群而不影响另一个元素?(how to add marker cluster in google maps v3 for the same lat/long without influenting another element?)
    问题 我制作了traceroute地图。 我对一些应该在同一纬度/经度上的标记有问题,但地图上只显示一个标记。 我读到有办法做到。 它是标记簇。 但我不知道如何添加 javascript。 另外,我担心这是否会影响我添加的另一个标记元素,例如带有标签、信息窗口和折线的自定义标记。 这是我的代码: <script type="text/javascript"> var pinImage = new google.maps.MarkerImage ("http://chart.apis.google.com/chart?chst=d_map_xpin_letter_withshadow&chld=pin_star|%E2%80%A2|CC3300|000000|FF9900", new google.maps.Size (70, 83), new google.maps.Point (0,0), new google.maps.Point (10,34)); var pinShadow = new google.maps.MarkerImage ("http://chart.apis.google.com/chart?chst=d_map_pin_shadow", new google.maps.Size (89, 85), new google.maps.Point (0, 0)
  • 关于在vue2.6+ts技术栈下高德地图API的使用方法
    最近公司某个项目用上了vue2.6+typescript的技术栈,整个工程都是用vue-cli3直接生成的,自带了ts-loader来解析ts文件,非常方便。但是对于一些没有没有声明文件的第三方模块,用起来会比较麻烦,过程中,我们用到的高德地图就是其中之一,虽然官方推荐使用vue-amap,但是想追求粒度更细的操作,还是原生的api更为方便,下面来记录一下全程的配置过程。 一、引入api文件 这里推荐使用script标签引入,因为这种地图类型的资源普遍都是运行时才用到的,在生产环境中加载也不慢,没必要放进去一起打包,所以用script标签引入会是不错的选择: 在你工程的html模版中: <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width,initial-scale=1.0"> <link rel="icon" href="<%= BASE_URL %>favicon.ico"> <script src="https://webapi.amap.com/maps?v=1.4.15&key=你的key"></script> <title>xxx</title> </head
  • 百度地图自定义聚合点方法拓展
    效果图 介绍 这是一个百度地图自定义聚合样式和图层控制拓展方法的API。 在百度官方版本的基础上拓展了自定义方法,具体见下方说明。 百度地图聚合原理 百度的点聚合算法 是基于方格和距离的聚合算法,即开始的时候地图上没有任何已知的聚合点,然后遍历所有的点,去计算点的外包正方形(由gridSize指定),若此点的外包正方形与现有的聚合点的外包正方形不相交,则新建聚合点,若相交就把该点加到该聚合点,巨日如下图: 实现源码 /** * 根据所给定的标记,创建聚合点 * @return 无返回值 */ MarkerClusterer.prototype._createClusters = function(){ var mapBounds = this._map.getBounds(); var extendedBounds = getExtendedBounds(this._map, mapBounds, this._gridSize); for(var i = 0, marker; marker = this._markers[i]; i++){ if(!marker.isInCluster && extendedBounds.containsPoint(marker.getPosition()) ){ this._addToClosestCluster(marker); } } };
  • 如何在 Google 地图中隐藏群集标记上的数字?(How to hide the numbers on a cluster marker in Google Maps?)
    问题 所以我有这个: 但我想要的是这个: 我很确定应该有一个我可以在这里指定的选项: var options = { gridSize: 80, imagePath: imagePath , someOption : iAmMissing ?? } var mc = new MarkerClusterer(map, mapmarkers, options); google.maps.event.addListener(mc, 'clusteringend', function(){ setTimeout(fixMyPageOnce, 1); }); 但我似乎找不到选项。 这是正确的地方还是有另一种方法可以摆脱圆圈中的数字? 回答1 创建一个自定义“计算器”函数,将返回值的“文本”属性设置为“”。 calculator: function(markers, numStyles) { var index = 0; var count = markers.length.toString(); var dv = count; while (dv !== 0) { dv = parseInt(dv / 10, 10); index++; } index = Math.min(index, numStyles); return { text: "", index: index, title
  • Gmap.Net 标记位置不正确,但当地图放大时,标记会转到正确的位置(Gmap.Net Marker at incorrect position but when the map is zoomed the marker goes to right place)
    问题 我有一个带有Gmap.Net控制器的Windows 窗体应用程序,我想要做的是基于提供位置的外部源添加标记。 问题是,当我添加一个标记时,它最初是在不正确的位置绘制的,但是在我缩小后它会转到正确的位置。 所以这就是我到目前为止所得到的: 我的地图控制器声明位于巴拿马的巴拿马。 private void button2_Click(object sender, EventArgs e) { //Layer count is just a variable to add new OverLays with different names var markersOverlay = new GMapOverlay("markers" + layerCount); //Marker far away in Quebec, Canada just to check my point in discussion var marker = new GMarkerGoogle(new PointLatLng(58.0032, -79.4957), GMarkerGoogleType.red_small); markersOverlay.Markers.Add(marker); gmap.Overlays.Add(markersOverlay); layerCount++; }
  • 地图聚类算法(Map Clustering Algorithm)
    问题 我当前的代码非常快,但是我需要使其更快,以便我们可以容纳更多的标记。 有什么建议么? 笔记: 当按标记名称对SQL语句进行排序时,代码将以最快的速度运行-它本身在标记标记的聚类方面做了很局部的工作(同一位置的标记名称经常,但并不总是相似)。 我无法预先对标记进行聚类,因为可以动态搜索和过滤标记。 我已经尝试过基于网格的聚类-但是结果通常不是很好。 我知道这些星团在墨卡托投影上略有倾斜。 我对商业集群服务不感兴趣。 编码: $singleMarkers = array(); $clusterMarkers = array(); while (count($markers)) { $marker = array_pop($markers); $cluster = array(); // Compare marker against all remaining markers. foreach ($markers as $key => $compareMarker) { // This function returns the distance between two markers, at a defined zoom level. $pixels = pixelDistance($marker['lat'], $marker['lng'], $compareMarker[
  • 如何在Javascript中使用传单滑块和markercluster?(How to use leaflet slider along with markercluster in Javascript?)
    问题 我正在制作一个使用滑块来显示或隐藏标记的地图,我想添加聚类功能,每个单独工作完美,但我希望滑块显示标记,并且在标记非常接近的情况下使用集群. 问题是,个体和标记集群都在显示,我希望显示的标记集群而不是一直存在的集群 <script type="text/javascript"> var sliderControl = null; //creating layers var cities = new L.LayerGroup(); var mbAttr = 'Map data © <a href="http://openstreetmap.org">OpenstreetMap</a> contributors, ' + '<a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, ' + 'Imagery © <a href="http://mapbox.com">Mapbox</a>', mbUrl = 'https://{s}.tiles.mapbox.com/v3/{id}/{z}/{x}/{y}.png'; var grayscale = L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access
  • 当同一位置有多个标记时,重叠标记 Spiderfier 标记图标(Overlapping Marker Spiderfier Marker Icon When There are Multiple Markers at Same Location)
    问题 Google 地图不提供拆分位于同一位置的多个标记的方法。 这可能发生在多个居住地点的个人或企业中,例如公寓楼或专业服务大楼。 根据缩放级别,它也可能发生在购物中心等。 解决这个问题的方法是“蜘蛛化”它们:当点击第一个时,它会用一条线将它们分开。 这是在 Google Earth 中完成的,George MacKerron 为 Google Maps 编写了一个包。 (https://github.com/jawj/OverlappingMarkerSpiderfier) 它可以与markerclusterer 集成,尽管它不支持marker clusterer 批量创建标记。 我的问题是我正在开发的应用程序想要为不同类型的活动提供特定的图标。 Spiderfier 将其中一个标记放在顶部。 查看地图的人无法知道顶部标记下方可能还有 10 个或更多其他标记。 理想情况下,有一种方法可以放置一个顶部标记,当有多个标记与标记集群中的不同图标相似时显示。 它不是直接的 1 对 1,因为当它们靠近但不完全在同一位置(默认为 20 像素)时,spiderfier 也可以工作,并且标记集群无法访问完全相同位置的多个标记。 理想的行为是有一个特殊的蜘蛛图标,点击时会闯入蜘蛛化的单个图标。 类似于markerclusterer,但没有缩放更改和处理相同的位置。 理想情况下
  • Google Maps V3 在确切位置上重叠标记(Google Maps V3 Overlapping Markers on exact Location)
    问题 我遇到了标记重叠的问题,请不要投反对票,因为我在 javascript 方面没有受过高等教育,我也看过 stackoverflow 上提供的不同答案,但无法使用它们来找到解决方案,所以请帮忙! 代码根据我给出的静态点抓取 php 纬度和经度 我只想在同一个标​​记中列出所有信息,而不是让它重叠标记任何帮助都将受到高度赞赏,这里是代码: <head> <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> <META HTTP-EQUIV="refresh" > <title>Operations</title> <script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?key=APIKEY&sensor=false"></script> <script src="oms.min.js"></script> <script type="text/javascript"> //<![CDATA[ var customIcons = { restaurant: { icon: 'mm_20_blue.png' }, bar: { icon: 'mm_20_blue.png' } }; function
  • 地图聚类-最大缩放标记仍聚类(Map clustering - max zoom markers still clustered)
    问题 我正在使用android maps utils对Google Maps api v2上的标记进行聚类。 它工作正常,但是当我添加2000多个标记时,在最大缩放上它仍然是聚类的(标记仍然具有数字): 这是我用标记填充地图的方法: public void getRiverData(String state, String type) { URL = getResources().getString(R.string.base_url) + state + "/" + type + getResources().getString(R.string.end_url); SimpleXmlRequest<XMLData> simpleRequest = new SimpleXmlRequest<XMLData>( URL, XMLData.class, new Response.Listener<XMLData>() { @Override public void onResponse(XMLData response) { // Initialize the manager with the context and the map. // (Activity extends context, so we can pass 'this' in // the constructor.)
  • 在 Google Maps API v3 中使用 MarkerClusterer 限制缩放级别时出错(Error when restricting zoom levels using MarkerClusterer in Google Maps API v3)
    问题 我正在使用此处找到的代码:将 Spiderfier JS 集成到 markerClusterer V3 中,在单击 MarkerClusterer 创建的包含同一位置点的集群时,爆炸具有完全相同的长/纬度的多标记以限制缩放级别。 现场示例在这里:http://www.adultlearnersfestival.com/newsite/yourarea/map.html 但是,我在 Firebug 中遇到错误: Error: TypeError: markers is undefined 并且无法弄清楚是什么原因造成的。 具体代码为: var minClusterZoom = 14; mc.setMaxZoom(minClusterZoom); gm.event.addListener(mc, 'clusterclick', function(cluster) { map.fitBounds(cluster.getBounds()); // Fit the bounds of the cluster clicked on if( map.getZoom() > minClusterZoom+1 ) // If zoomed in past 15 (first level without clustering), zoom out to 15 map.setZoom
  • 默认情况下,点击标记集群想要打开具有完全相同位置标记的蜘蛛(Clicking on marker cluster wants to open spider with exact same location markers by default)
    问题 我试图用重叠标记集群 (OMS) 实现 MarkerCluster (MS)。 一切似乎都很好。 但是,我希望修改 OMS 的工作方式,以便如果我单击下面有 2 个点的集群 当我单击具有完全相同地理位置的 2 个点的任何集群时,它会打开一个标记,当我单击该标记时,它会打开带有 2 个标记的蜘蛛。 当我点击集群时我想要什么,直接打开带有 2 个标记的蜘蛛,已经花费了很多时间,但仍然没有任何效果。 我已经尝试了很多解决方案,比如 1. 当我添加到 OMS(oms.addMarker) 时,我可以跟踪标记,并且可以根据 google 地图的 zoom_changed 事件点击,但它不会触发 Spiderfy,而是触发我们添加到标记的点击事件.... . 2.我看到了一个事件spiderfy,所以我试图用一个标记对象(oms.trigger('spiderfy',marker);)触发该事件,但没有任何效果...... 在这里,我也添加了代码片段: mc = new MarkerClusterer(map, markers.locations, mcOptions); google.maps.event.addListener(mc, 'clusterclick', function(cluster) { mc = new MarkerClusterer(map, markers
  • Google Maps Android v2中的群集标记(Cluster markers in Google Maps Android v2)
    问题 我必须通过Google Maps Android v2 API在GoogleMap上放置不同的标记。 问题在于,多个标记设置在同一位置(经/纬度),因此用户只能看到“最新”标记。 是否有可能(最好是图书馆)将来自同一区域(相对于缩放级别)的不同标记进行聚类? 我已经阅读了MarkerClusterer ,但这是为JavaScript API设计的。 回答1 Google在其Google Maps Android API实用程序库中提供了用于执行此操作的实用程序: https://developers.google.com/maps/documentation/android/utility/marker-clustering 来源在: https://github.com/googlemaps/android-maps-utils 回答2 我还没有机会尝试一下,但是看起来很有希望: http://code.google.com/p/android-maps-extensions/ 从这篇文章 这是另一个带有一些很酷的群集动画的库: https://github.com/twotoasters/clusterkraf 回答3 对于正在寻求实现自己的集群代码的其他人。 请非常快速地检查我的聚类算法,并且效果非常好。 我查看了各种库,发现它们是如此的复杂以至于无法理解一个单词
  • IllegalArgumentException:使用 gms.maps.model.Marker.setIcon 的非托管描述符(IllegalArgumentException: Unmanaged descriptor using gms.maps.model.Marker.setIcon)
    问题 我有一个使用 android-maps-utils 和滑动标记图标的应用程序。 我收到了一个使用 Firebase 崩溃报告的错误报告,我无法在源代码中跟踪该错误报告,因为gms.maps.model.Marker.setIcon是私有的,所以我请求帮助解决这个问题。 问题的以下部分分为: 用户在做什么向我报告了什么 firebase 崩溃一些项目配置我尝试/发现试图理解/修复它 用户在做什么他正在放大和缩小地图(使用com.google.android.gms.maps.SupportMapFragment Fragment ) 向我报告了什么 firebase 崩溃 异常 java.lang.IllegalArgumentException: 非托管描述符 com.google.maps.api.android.lib6.common.kb (:com.google.android.gms.DynamiteModulesB:162) com.google.maps.api.android.lib6.impl.oc (:com.google.android.gms.DynamiteModulesB:75) com.google.maps.api.android.lib6.impl.db.a (:com.google.android.gms.DynamiteModulesB
  • Google Maps v3 fitBounds()缩放太近,无法标记单个标记(Google Maps v3 fitBounds() Zoom too close for single marker)
    问题 有没有办法为fitBounds()设置最大缩放级别? 我的问题是,当地图仅被馈送到一个位置时,它会尽可能放大,这实际上使地图脱离了上下文,并使其变得无用。 也许我采用了错误的方法? 提前致谢! 回答1 我喜欢mrt的解决方案(尤其是当您不知道要映射或调整多少个点时),除了它会抛弃标记使其不再位于地图中心。 我只是简单地将其扩展了一个点,即从经度和经度中也减去了.01,因此它将标记保持在中心。 太棒了,谢谢! // Pan & Zoom map to show all markers function fitToMarkers(markers) { var bounds = new google.maps.LatLngBounds(); // Create bounds from markers for( var index in markers ) { var latlng = markers[index].getPosition(); bounds.extend(latlng); } // Don't zoom in too far on only one marker if (bounds.getNorthEast().equals(bounds.getSouthWest())) { var extendPoint1 = new google.maps.LatLng