【问题标题】:More than one marker on same place - MarkerClusterer同一个地方有多个标记 - MarkerClusterer
【发布时间】:2013-12-27 17:52:23
【问题描述】:

我正在使用 MarkerClusterer。当我在完全相同的位置有两个或多个标记时,API 仅显示 1 个标记 - 顶部的一个。但不知何故,我想显示所有标记,因为每个标记都会打开不同的弹出窗口。 我搜索了几个解决方案,但似乎没有一个有效 有人有类似的问题,请分享解决方案吗??

【问题讨论】:

  • @geocodezip 有没有办法让它在不使用 OverlappingMarkerSpiderfier 的情况下工作,因为它不能满足需要。以很小的空间显示两个标记只是为了知道有两个或更多标记就可以了。谢谢。
  • 当然有。只需对其进行编码即可。或者更改输入数据,使之没有重复。
  • 我和格里什在一起。这不是重复的,因为它没有提及或打算使用 OverlappingMarkerSpiderfier。
  • 我的解决方案只是在我的地图上的每个标记上添加少量随机噪声(可能在任一方向 +-50 英尺),而不是尝试确定哪些位于彼此之上并且只移动那些。像魅力一样工作。

标签: google-maps google-maps-api-3 markerclusterer


【解决方案1】:

那些在 ANDROID 中寻找相同解决方案的人 -

或者,如果您只想在单击标记时显示一个列表,请执行以下操作 -

clusterManager.setOnClusterClickListener {
            if (googleMap?.maxZoomLevel == googleMap?.cameraPosition?.zoom) {
                val items = it.items.map { assetItem -> assetItem.title }
                MaterialAlertDialogBuilder(requireContext())
                    .setTitle("Choose an asset")
                    .setItems(items.toTypedArray()) { dialog, which ->
                        dialog.dismiss()
                        onItemClicked(it.items.elementAt(which))
                    }
                    .show()
                return@setOnClusterClickListener true
            }
            return@setOnClusterClickListener false
        }

【讨论】:

    【解决方案2】:

    MarkerClusterer 可以选择定义 maxZoom 到哪个集群应该在地图中可见。您可以将其值设置为 18,这样当用户放大到最大时它不会显示集群:

     const markerCluster = new MarkerClusterer(map, markers,{maxZoom: 18});
    

    【讨论】:

    • 这感觉比对我应用随机噪声要好
    • 这对我来说也比随机化解决方案更好,但它只解决了问题,即从某个缩放级别显示标记而不是集群。但是,如果您希望将标记显示为单独的(和可点击的)标记以显示信息窗口,那么随机化解决方案就是要走的路。
    • 所以,在使用这个之后,我看到一个标记而不是集群。我只能点击第一个,其他的都是隐藏的。不是解决方案。
    【解决方案3】:

    仅供参考 - 精度

    decimal places  decimal degrees N/S or E/W at equator
    2   0.01    1.1132 km
    3   0.001   111.32 m
    4   0.0001  11.132 m
    5   0.00001 1.1132 m
    

    【讨论】:

      【解决方案4】:

      终于搞定了。这适用于所有尚未找到解决方案的人。下面的代码为同一位置的标记添加偏移量:

      在您的 createMarker 函数中添加以下代码:

      //get array of markers currently in cluster
      var allMarkers = namespace.mapParams.mapMarkersArray;
      
      //final position for marker, could be updated if another marker already exists in same position
      var finalLatLng = latlng;
      
      //check to see if any of the existing markers match the latlng of the new marker
      if (allMarkers.length != 0) {
          for (i=0; i < allMarkers.length; i++) {
              var existingMarker = allMarkers[i];
              var pos = existingMarker.getPosition();
      
              //if a marker already exists in the same position as this marker
              if (latlng.equals(pos)) {
                  //update the position of the coincident marker by applying a small multipler to its coordinates
                  var newLat = latlng.lat() + (Math.random() -.5) / 1500;// * (Math.random() * (max - min) + min);
                  var newLng = latlng.lng() + (Math.random() -.5) / 1500;// * (Math.random() * (max - min) + min);
                  finalLatLng = new google.maps.LatLng(newLat,newLng);
              }
          }
      }
      

      Refer this

      现在为每个标记更新您的 google.maps.Marker 对象,使用新的位置值 - finalLatLng

      var marker = new google.maps.Marker({
          map: msf_namespace.mapParams.resultmap,
          position: finalLatLng,
          title: name,
          icon: markericon
      });
      
      //add each generated marker to mapMarkersArray
      namespace.mapParams.mapMarkersArray.push(marker);
      

      【讨论】:

      • 我更喜欢你的方法而不是爬虫技巧,但我想知道你正在使用多少个标记,你是否注意到放置速度变慢了?
      猜你喜欢
      • 1970-01-01
      • 2012-05-01
      • 2014-05-18
      • 1970-01-01
      • 2011-12-24
      • 2018-12-13
      • 2016-07-27
      • 2015-01-05
      • 2021-12-19
      相关资源
      最近更新 更多