如何在Android MapView中计算一个点周围的半径?

12

我有一个地图视图,其中显示了“有用半径”(类似于坐标的准确性)。使用 MapView 投影metersToEquatorPixels(仅适用于赤道距离)并不能给出足够准确的距离(以像素为单位)。如果您想在坐标周围显示圆圈,该如何计算半径?


2
这也可以这样说:我有一个GPS坐标和一个距离,如何绘制一个圆形,使其包含来自GPS点的半径? - Jeremy Logan
我不确定我理解问题了 - 当你说它没有给出足够准确的距离时,你是什么意思?是指你本来想让它显示100米,但它只显示50米左右的圆形吗? - Dan Lew
是的,它偏差很大。 - Jeremy Logan
实际上,metersToRadius函数失败得很厉害,我通过使用mapview并在单击位置时绘制圆来测试它。我不擅长数学,这个公式需要专家;) - user688488
3个回答

29

所以,谷歌地图使用Mercator投影。这意味着你离赤道越远,距离就越扭曲。根据这个讨论,正确的距离转换方法大概是这样的:

public static int metersToRadius(float meters, MapView map, double latitude) {
    return (int) (map.getProjection().metersToEquatorPixels(meters) * (1/ Math.cos(Math.toRadians(latitude))));         
}

谢谢您的回答。但我对这个方程式有一个疑问。这个方程式是否足够复杂,会减慢应用程序的性能?只是好奇。 - Ahmed Faisal
2
公式中唯一可能耗时的部分是Math.cos()。您可以使用android.util.FloatMath.cos()函数来加速计算,或者甚至保留一个预先计算好的因子表,例如每个完整度数。然后,您只需编写以下代码: return (int) (map.getProjection().metersToEquatorPixels(meters) * factor[(int)latitude]。 - Ridcully

0
mMap.addCircle(
    new CircleOptions().center(
        new LatLng(
            bounds.getCenter().latitude, 
            bounds.getCenter().longitude
        )
    )
    .radius(50000)
    .strokeWidth(0f)
    .fillColor(0x550000FF)
);

2
答案需要格式化,并添加更多上下文,说明您的代码如何工作以及如何解决OP的问题! - abhiarora

-2
projection.toPixels(GeoP, pt);
float radius = projection.metersToEquatorPixels(50);

试试这个...我在我的MapRadius上使用它,看起来是有效的


如果您看到我的答案,您将会明白为什么这种方法在所有情况下都不可行。 - Jeremy Logan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接