摘要
我需要能够从当前的mapview移动到纬度/经度范围。我希望这种动作以动画的方式发生(类似于animateTo
的工作方式)。我需要从当前视图开始,放大或缩小以达到目标纬度/经度范围。下面是我使用zoomLevels时用来执行此操作的代码。但是我必须使用跨度而不是缩放级别才能实现这一目标。
[编辑]
以下是我为animateTo
所做的事情。我需要相当于此,但使用Lat / Lng Span结束我的最终视图(我需要缩放和居中,显示提供的纬度/经度范围)。正如您将注意到的那样,我正在使用targetZoomLevel
和currentZoomLevel
来确定要进行多少缩放...我需要使用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个代表。
答案 0 :(得分:2)
这对我有用:
MapController.setCenter(GeoPoint);
您可以从以下地址获取MapController:
MapView.getController();
从以下地址获取GeoPoint:
new GeoPoint( (int) ( LAT * 1e6 ) , (int) ( LONG * 1e6 ) );
答案 1 :(得分: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();
}
}
答案 2 :(得分:1)
您正在查看的函数的用法是zoomToSpan(int latSpanE6,int lonSpanE6)。
你有当前的跨度(或者可以很容易地得到它)和目标跨度(正如你所知道的那样),所以你为什么不在延迟时开始调用zoomToSpan,因为你逐步将latSpanE6和longSpanE6移向目标。应该不那么困难。您已经拥有了大部分代码,但在检查缩放级别时,不是使用zoomIn,而是在检查latSpanE6和longSpanE6是否已达到目标范围时进行zoomToSpan。
不会打扰它,因为你可以自己做;)
答案 3 :(得分: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);
}