android - 如何处理谷歌地图上具有相同位置的多个标记?

标签 android ios objective-c google-maps google-maps-markers

我在应用程序中使用 Google map ,很可能多个标记附加到同一位置,每个标记代表一个人。在这种情况下,用户不会知道这个特定标记后面还有其他标记/人。

我环顾四周以处理这种情况,关于 SO 的一个问题表明我可以显示一个标记并将所有人与该单个标记相关联。当用户点击该标记时,我应该显示与该标记关联的所有用户的列表。这是一个很好的解决方法,但我想避免显示大部分隐藏 Google map 的 View 。

有没有人在类似情况下使用过任何解决方法?

最佳答案

我使用的解决方法是在 map 上显示具有相同位置的标记稍微分开,以便用户对多个标记略有了解。

我会跟踪 map 上的标记及其在 map 上的位置,并且每当我想在 map 上添加标记时,我都会确保没有其他标记显示在同一位置。如果是,那么我在要添加的新标记的位置添加一个偏移量。

static final float COORDINATE_OFFSET = 0.00002f; // You can change this value according to your need

以下方法返回必须用于新标记的位置。此方法将新标记的当前纬度和经度作为参数。

// Check if any marker is displayed on given coordinate. If yes then decide
// another appropriate coordinate to display this marker. It returns an
// array with latitude(at index 0) and longitude(at index 1).
private String[] coordinateForMarker(float latitude, float longitude) {

    String[] location = new String[2];

    for (int i = 0; i <= MAX_NUMBER_OF_MARKERS; i++) {

        if (mapAlreadyHasMarkerForLocation((latitude + i
                * COORDINATE_OFFSET)
                + "," + (longitude + i * COORDINATE_OFFSET))) {

            // If i = 0 then below if condition is same as upper one. Hence, no need to execute below if condition.
            if (i == 0)
                continue;

            if (mapAlreadyHasMarkerForLocation((latitude - i
                    * COORDINATE_OFFSET)
                    + "," + (longitude - i * COORDINATE_OFFSET))) {

                continue;

            } else {
                location[0] = latitude - (i * COORDINATE_OFFSET) + "";
                location[1] = longitude - (i * COORDINATE_OFFSET) + "";
                break;
            }

        } else {
            location[0] = latitude + (i * COORDINATE_OFFSET) + "";
            location[1] = longitude + (i * COORDINATE_OFFSET) + "";
            break;
        }
    }

    return location;
}

// Return whether marker with same location is already on map
private boolean mapAlreadyHasMarkerForLocation(String location) {
    return (markerLocation.containsValue(location));
}

在上面的代码中,markerLocation 是一个HashMap。

HashMap<String, String> markerLocation;    // HashMap of marker identifier and its location as a string

此答案包含适用于 android 的代码,但同样的逻辑适用于 iOS。

关于android - 如何处理谷歌地图上具有相同位置的多个标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19704124/

相关文章:

android - 更改搜索栏颜色

c++ - 从文件的特定部分(复制到文档目录中)初始化 NSInputStream?

android - 如何检测 Action 模式是否已经存在

ios - 如何知道您的短信过滤器扩展是否在 iOS 设置中启用?

ios - 当前点的图像大于其余点的自定义页面控件不起作用

ios - 替换 NSAttributedString 上的字符时发生崩溃

ios - 如何从 iOS 类 "CAEAGLLayer"获取 _CAEAGLNativeWindow

iphone - 在 TableView 中显示图像

android - 如何控制通知组点击

720x720 BlackBerry 屏幕的 Android 布局