谷歌地图Android:圆圈上方的标记

Posted

技术标签:

【中文标题】谷歌地图Android:圆圈上方的标记【英文标题】:Google Map Android : Marker above Circle 【发布时间】:2019-02-18 05:50:41 【问题描述】:

我想在我的应用程序中实现这样的效果,我知道要画一个圆圈,但我需要在下图中的圆圈右侧上方显示标记

如果有人知道,我想显示圆圈上方 10 公里,请帮助我。

我知道this question,但请找到任何解决方案。

如果你知道圆(外边缘)的 lat lng 绘制,这对我也有帮助。

【问题讨论】:

在你发的问题的答案中,可以清楚的看到step 2中圆的各个点的经纬度 我认为 SphericalUtil.computeOffset(from,distance,heading) 是您想要的 - 给定圆心(从)、圆半径(距离)和您选择的方向,然后您可以在返回的位置添加标记.见 - github.com/googlemaps/android-maps-utils。 @Andy 感谢您的评论让我检查一下 @Greggz 在第 2 步中给定的 lat long 非常不同 【参考方案1】:

@Adny 是对的,我也在使用 SphericalUtil 类来解决这类问题,

您可以在这个 git https://github.com/googlemaps/android-maps-utils

中使用这个 SphericalUtil

您可以使用此方法绘制10Km的标记

/**
 * Returns the location of origin when provided with a LatLng destination,
 * meters travelled and original heading. Headings are expressed in degrees
 * clockwise from North. This function returns null when no solution is
 * available.
 * @param to       The destination LatLng.
 * @param distance The distance travelled, in meters.
 * @param heading  The heading in degrees clockwise from north.
 */
public static LatLng computeOffsetOrigin(LatLng to, double distance, double heading) 
    heading = toRadians(heading);
    distance /= EARTH_RADIUS;
    // http://lists.maptools.org/pipermail/proj/2008-October/003939.html
    double n1 = cos(distance);
    double n2 = sin(distance) * cos(heading);
    double n3 = sin(distance) * sin(heading);
    double n4 = sin(toRadians(to.latitude));
    // There are two solutions for b. b = n2 * n4 +/- sqrt(), one solution results
    // in the latitude outside the [-90, 90] range. We first try one solution and
    // back off to the other if we are outside that range.
    double n12 = n1 * n1;
    double discriminant = n2 * n2 * n12 + n12 * n12 - n12 * n4 * n4;
    if (discriminant < 0) 
        // No real solution which would make sense in LatLng-space.
        return null;
    
    double b = n2 * n4 + sqrt(discriminant);
    b /= n1 * n1 + n2 * n2;
    double a = (n4 - n2 * b) / n1;
    double fromLatRadians = atan2(a, b);
    if (fromLatRadians < -PI / 2 || fromLatRadians > PI / 2) 
        b = n2 * n4 - sqrt(discriminant);
        b /= n1 * n1 + n2 * n2;
        fromLatRadians = atan2(a, b);
    
    if (fromLatRadians < -PI / 2 || fromLatRadians > PI / 2) 
        // No solution which would make sense in LatLng-space.
        return null;
    
    double fromLngRadians = toRadians(to.longitude) -
            atan2(n3, n1 * cos(fromLatRadians) - n2 * sin(fromLatRadians));
    return new LatLng(toDegrees(fromLatRadians), toDegrees(fromLngRadians));

【讨论】:

【参考方案2】:

onMapReady()方法中添加如下代码:

【讨论】:

以上是关于谷歌地图Android:圆圈上方的标记的主要内容,如果未能解决你的问题,请参考以下文章

带有 3D 标记的 Android 谷歌地图?

城市范围内的限制标记android谷歌地图

谷歌地图:在markerclusterer上方渲染标记

如何在谷歌地图上显示圆圈?

如何更改谷歌地图标记上方的标题和片段设计

有没有办法在谷歌地图的叠加层上方添加标记反应?