1

概括

我需要能够从当前的地图视图移动到纬度/经度跨度。我希望这一举动以动画的方式发生(类似于animateTo工作方式)。我需要从当前视图开始,放大或缩小以达到目标纬度/经度跨度。下面是我在使用 zoomLevels 时用来执行此操作的代码。但我必须使用跨度,而不是缩放级别来实现这一点。

[编辑]

这就是我正在做的事情animateTo。我需要这个等价物,但是使用 Lat/Lng Span 来结束我的最终视图(我需要缩放和居中,显示提供的 lat/lng 跨度)。您会注意到,我正在使用targetZoomLevelcurrentZoomLevel确定要进行多少缩放...我需要使用 lat/lng 跨度。

public static void smoothZoom(final MapController controller,
        final int currentZoomLevel, final int targetZoomLevel,
        int latitude, int longitude) {

    final Handler handler = new Handler();

    controller.animateTo(new GeoPoint(latitude, longitude), new Runnable() {
        public void run() {

            int currentZoom = currentZoomLevel;
            int zoomTarget = targetZoomLevel;

            // Smooth zoom handler
            // int zoomLevel = _mapView.getZoomLevel();
            // int targetZoomLevel = targetLevel;
            long delay = 0;

            if (zoomTarget > currentZoom) {
                while (currentZoom++ < zoomTarget) {
                    handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            controller.zoomIn();
                        }
                    }, delay);

                    delay += 150; // Change this to whatever is good on the
                                    // device
                }
            } 
        }
    });
}

[编辑]

我现在真的需要这个代码用于我的应用程序,没有办法解决它。第一个帮助我获得工作代码的人获得 250 个代表。

4

4 回答 4

2

这对我有用:

MapController.setCenter(GeoPoint);

您可以从以下位置获取 MapController:

MapView.getController();

并从以下位置获取 GeoPoint:

new GeoPoint( (int) ( LAT * 1e6 ) , (int) ( LONG * 1e6 )  );
于 2012-08-27T16:27:07.003 回答
1

这是您正在寻找的解决方案吗?

public static void zoomSpan(final MapView mapView, int northernLat, int southernLat, int easternLon, int westernLon) {
    final int latSpan = northernLat - southernLat;
    final int lonSpan = easternLon - westernLon;
    latCenter = southernLat + latSpan / 2;
    lonCenter = westernLon + lonSpan / 2;

    final MapController controller = mapView.getController();
    final Handler handler = new Handler();

    final Runnable zoomRunnable = new Runnable() {
        public void run() {
            int viewLatSpan = mapView.getLatitudeSpan();
            int viewLonSpan = mapView.getLongitudeSpan();
            boolean actionTaken = false;
            if (mapView.getZoomLevel() > 1 && (latSpan > viewLatSpan || lonSpan > viewLonSpan)) {
                controller.zoomOut();
                actionTaken = true;
            }
            if (mapView.getZoomLevel() < mapView.getMaxZoomLevel() && latSpan * 2 <= viewLatSpan && lonSpan * 2 <= viewLonSpan) {
                controller.zoomIn();
                actionTaken = true;
            }
            if (actionTaken)
                handler.post(zoomRunnable);
        }
    };

    controller.animateTo(latCenter, lonCenter, zoomRunnable);

}
于 2012-10-21T06:02:01.040 回答
1

在我的地图应用程序中,我需要实现位置搜索功能。如果找到位置,它会移动到该位置,添加叠加层并缩放到预定义的级别。为此,我使用了以下代码:

final int SEARCH_ZOOM_LEVEL = 7;

controller = mMapView.getController();
controller.setZoom(SEARCH_ZOOM_LEVEL );
pointToLocation(s);        // s is the location

pointToLocation() 是这样实现的:

private void pointToLocation(String s) {
    Geocoder gc = new Geocoder(MapDemo.this, Locale.getDefault());
    try {
        List<Address> addresses = gc.getFromLocationName(
                s, 5);
        String add = "";
        if (addresses.size() > 0) {
            point = new GeoPoint(
                    (int) (addresses.get(0).getLatitude() * 1E6), 
                    (int) (addresses.get(0).getLongitude() * 1E6));
            controller.animateTo(point);
        }    
    } catch (IOException e) {
        Toast.makeText(MapDemo.this, "Location not found", Toast.LENGTH_LONG).show();
    }

}
于 2012-08-28T19:27:23.037 回答
1

您正在查看的函数的用法是 zoomToSpan(int latSpanE6, int lonSpanE6)。

您拥有当前跨度(或者可以轻松获得)和目标跨度(正如您所说的那样),那么为什么不简单地开始在 delay 上调用 zoomToSpan ,因为您逐渐将 latSpanE6 和 longSpanE6 移向目标。它不应该那么困难。您已经拥有大部分代码,但是在检查缩放级别时不是 zoomIn,而是在检查 latSpanE6 和 longSpanE6 是否已达到目标跨度时使用 zoomToSpan。

不会打扰编码,因为你可以自己做;)

于 2012-08-30T20:57:01.517 回答