获取mapView的像素距离(以米为单位)

时间:2012-11-27 14:59:13

标签: android android-mapview

我想知道在给定的缩放级别,某个像素距离是多少米。

原因:我想知道mapView中圆的半径(以米为单位),它完全适合mapView - > radiusPixels = mapView.getWidth()/2;

我找到了方法mapView.getProjection().metersToEquatorPixels(radiusMeters),它与我需要的方法相反。但是这种方法或其他任何有用的方法都没有反转。

我的(可能是天真的)解决方法如下:

private double getFittingRadiusInMeters() {
    return getMeters(mapView.getWidth() / 2);
}

private double getMeters(int pixels) {
    Projection proj = mapView.getProjection();
    Point mapCenterPixels = new Point(mapView.getWidth() / 2, mapView.getHeight() / 2);

    //create 2 geopoints which are at pixels distance
    GeoPoint centerGeoPoint = proj.fromPixels(mapCenterPixels.x, mapCenterPixels.y);
    GeoPoint otherGeoPoint = proj.fromPixels(mapCenterPixels.x + pixels, mapCenterPixels.y);

    Location loc = new Location("");
    loc.setLatitude(centerGeoPoint.getLatitudeE6() / 1E6);
    loc.setLongitude(centerGeoPoint.getLongitudeE6() / 1E6);

    Location loc2 = new Location("");
    loc2.setLatitude(otherGeoPoint.getLatitudeE6() / 1E6);
    loc2.setLongitude(otherGeoPoint.getLongitudeE6() / 1E6);

    return loc.distanceTo(loc2);
}

但它效果不佳。我总是得到比mapView小得多的圆圈 - 半径太小了。

我知道distanceTo方法表示“近似”,但半径与预期大小明显不同。不应该是近似值的影响。

感谢。

1 个答案:

答案 0 :(得分:0)

你的方法存在一个小错误。

您正在屏幕中心级别计算屏幕半部的值。找到的距离仅对以相同的纬度值绘制圆形有效(经度可能没有问题地改变)。

由于地球是粗糙的,因此在不同纬度级别计算的相同像素数的距离会产生不同的结果。从Equador水平移动到更接近极点水平的位置,相同数量的像素导致以米为单位的更小距离。

但是,如果您使用地图位于距您绘制圆圈的遥远纬度范围内来调用getFittingRadiusInMeters(),这只会是显而易见的。

否则,它应该可以正常工作。

<强>解决方案

方法getMeters()应该作为参数接收应该用于计算距离的GeoPoint(或至少是纬度)。

问候。