【问题标题】:Google Maps Circle radius alternative谷歌地图圆半径替代
【发布时间】:2014-04-04 21:46:22
【问题描述】:

目前我正在使用圆圈在地图上显示一定宽度的对象的路径,以米为单位。这是有问题的,因为即使在 15 英里/小时的速度下,也必须每隔几百毫秒采用一次圆形方法,以便圆圈重叠,这样你就不会在圆圈之间出现间隙。一个小时后,你会得到无数圈,没有记忆。

 CircleOptions circleOptions = new CircleOptions()
        .center(new LatLng(location.getLatitude(), location.getLongitude()));

 circleOptions.radius(radi); // In meters

目前我似乎无法找到 google maps android api v2 支持使用以米为单位设置半径的折线,但仅以像素宽度为单位。随着不同的缩放级别和屏幕条件以及地图的投影,这听起来相当复杂,基本上用折线在地图上突出显示特定宽度的路径。

有没有人看到在 api 中使用圆半径方法的任何替代方法?

【问题讨论】:

  • 使用折线、多边形或其他任何东西都无法解决您的问题。一次在地图上绘制这么多地图对象会给您带来问题。如果它们不在视图中,则需要删除它们或重新考虑您要完成的工作
  • @tyczj 这就是我寻找替代方案的原因。如果使用具有设定宽度的折线,则需要的位置点要少得多。需要使用无数个圆圈进行重叠。一条宽度为 X 的折线会突出显示路径宽度,理论上每隔几英尺就需要一个点,因为一条线只需要 2 个点...感谢您的输入。
  • 你想要完成的不是传统的,所以我不希望有一个传统的解决方案。期待做很多数学,检查这个链接至少一个起点groups.google.com/forum/#!topic/google-maps-js-api-v3/…

标签: android google-maps google-maps-android-api-2


【解决方案1】:

使用android-maps-utils这变得相对简单:

public static PolygonOptions getPolygonOptions(LatLng point1, LatLng point2, float widthInMeters) {

    double heading = SphericalUtil.computeHeading(point1, point2);
    double distance = SphericalUtil.computeDistanceBetween(point1, point2);

    LatLng corner1 = SphericalUtil.computeOffset(point2, widthInMeters / 2, heading + 90);
    LatLng corner2 = SphericalUtil.computeOffset(point2, widthInMeters / 2, heading - 90);
    LatLng corner3 = SphericalUtil.computeOffset(corner2, distance, heading + 180);
    LatLng corner4 = SphericalUtil.computeOffset(corner3, widthInMeters, heading + 90);

    return new PolygonOptions().add(corner1, corner2, corner3, corner4);
}

然后添加连接点的多边形:

map.addPolygon(
        getPolygonOptions(point1, point2, 50)
                .fillColor(Color.BLACK)
);
map.addPolygon(
        getPolygonOptions(point2, point3, 50)
                .fillColor(Color.BLACK)
);

【讨论】:

  • 我对 point1、point2 和 point3 的初始化需要哪些值感到有些困惑?我假设因为我正在从一个固定位置的停靠点移动,所以当前位置说 location.getPosition() 对 point1 来说很好。点2呢。
  • 您将存储最后一个位置(最初为空)并将其与您定期收集的当前位置进行比较,而不是每秒添加多边形。如果最后一个位置为空,则将其设置为当前位置。否则,如果最后一个位置和当前位置之间的距离超过阈值,您将添加一个从最后一个位置到当前位置的新多边形,并将最后一个位置更新为当前位置。阈值越低,您看到的细节越多,但添加到地图中的多边形就越多。因此,根据这种情况持续多长时间,您可能需要更高或更低的阈值。
  • 如果你想进一步优化这个,你可以应用一个轨迹缩减算法,即如果运动是直线的,或者更确切地说是“相对”直线,那么点 A、B、C 和 D 就在一条线上您可以删除内部点 B 和 C。同样,可以使用阈值来确定直线度,从而产生更多细节或更多点。如果您对此感兴趣,请告诉我。
  • 我在处理多边形时遇到了一些困难。它们出现但并不总是垂直于方位或航向。如果你能看看我的另一篇文章,我将不胜感激。谢谢。此外,如果我使用 computeHeading 或 getBearing 我也会遇到同样的问题。 stackoverflow.com/questions/22585189/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-28
  • 1970-01-01
  • 2019-05-24
相关资源
最近更新 更多