可视区

可视区域操作

可视区域的位置(CameraPosition)

移动可视区域

示例代码

设置可视区域边界

高德地图的 Android SDK 允许您通过修改地图可视区域,改变用户的观看视角。

可视区域的位置(CameraPosition)

可视区域的位置由以下属性组成:

  • 目的地(target)
  • 缩放级别(zoom)
  • 方向(bearing)
  • 倾斜角度(tilt)

屏幕当前可视区域的位置可以通过 AMap.getCameraPosition() 方法获取。

目的地(target)

地图的中心位置。位置使用经度和纬度说明。

1
2
// 获取当前地图中心点的坐标
LatLng mTarget = aMap.getCameraPosition().target;

缩放级别(zoom)

可视区域的缩放级别决定了地图的比例。地图缩放级别为4-20级,缩放级别不必是一个整数。

缩放级别较低时,您可以看到更多地区的地图;缩放级别高时,您可以查看地区更加详细的地图。

下面的图像显示出不同的缩放级别:

高德地图缩放级别 高德地图缩放级别

1
2
// 获取当前地图的缩放级别
float mZoom = aMap.getCameraPosition().zoom;

方向(bearing)

默认情况下,地图的方向为0度,屏幕正上方指向北方。当您逆时针旋转地图时,地图正北方向与屏幕正上方的夹角度数为地图方向,范围是从0度到360度。例如,一个90度的查询结果,在地图上的向上的方向指向正东。

1
2
// 获取当前地图的旋转角度
float mBearing = aMap.getCameraPosition().bearing;

倾斜角度(tilt)

可视区域的位置在地图的中心位置和地球的表面之间的圆弧上,从最低点以度测量(方向直接指向下方的可视区域)。当您改变视角,地图显示的角度来看,远方的建筑变小,附近的建筑则变大,产生立体效果。

地图倾角范围为0-45度。

高德地图倾斜角度

1
2
// 获取当前地图的倾斜角度
float mTilt = aMap.getCameraPosition().tilt;

移动可视区域

高德地图 Android SDK 允许您在屏幕上切换显示的地图区域。这是通过改变可视区域的位置实现的。改变可视区域的位置,需要您明确想要把可视区域移动到哪里。您可使用 CameraUpdateFactory 创建不同类型的 CameraUpdate。以下的选项可供使用。

仅更改缩放级别

CameraUpdateFactory.zoomIn() 和 CameraUpdateFactory.zoomOut() 可以改变缩放级别放大或缩小1,同时保持其他相同的属性。

CameraUpdateFactory.zoomTo(float) 改变缩放级别为一个定值,同时保持其他相同的属性。

CameraUpdateFactory.zoomBy(float x) 和 CameraUpdateFactory.zoomBy(float, Point) 通过定值,增加或降低x(如果值为负数)缩放级别。后者根据地图上指定坐标点,放大或缩小地图,为了实现这一点,所以它可能会改变可视区域的中心位置。

这些方法返回一个 CameraUpdate 对象,使用 AMap.moveCamera(CameraUpdate update) 方法更新可视区域显示在地图上。

仅更改视图中心点

有三个简便的方法可以改变位置:

  • CameraUpdateFactory.changeLatLng(LatLng),仅改变可视区域中心点的坐标,其他属性不变。
  • CameraUpdateFactory.newLatLng(LatLng),可以改变可视区域的经纬度,缩放级别默认为固定值4,保留其他属性。
  • CameraUpdateFactory.newLatLngZoom(LatLng, float),可以改变可视区域的经纬度、缩放级别,并且保留其他属性。

返回一个 CameraUpdate 对象,使用 AMap.moveCamera(CameraUpdate update) 方法更新可视区域显示在地图上。

仅更改旋转角度

使用 CameraUpdateFactory.changeBearing(float bearing) 方法可以改变可视区域的方向并且保留其他属性。返回一个 CameraUpdate 对象,使用 AMap.moveCamera(CameraUpdate update) 方法更新可视区域显示在地图上。

仅更改倾斜角度

使用 CameraUpdateFactory.changeTilt(float tilt) 方法可以改变可视区域的倾斜角度并且保留其他属性。返回一个 CameraUpdate 对象,使用 AMap.moveCamera(CameraUpdate update) 方法更新可视区域显示在地图上。

更改可视区域

为了改变可视区域的位置更加灵活,可以使用 CameraUpdateFactory.newCameraPosition(CameraPosition) 移动可视区域到指定位置。CameraPosition 可以用以下方法直接获取:使用 new CameraPosition() 或使用 new CameraPosition.Builder()。

返回一个 CameraUpdate 对象,使用 AMap.moveCamera(CameraUpdate update) 方法更新可视区域显示在地图上。

示例代码如下(详细信息,请参考示例工程“Camera 功能”案例 / com.amapv2.apis.basic.CameraActivity.java):

示例代码

详细信息,请参考示例工程“Camera 功能”案例 / com.amapv2.apis.basic.CameraActivity.java 。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
public class CameraActivity extends Activity implements OnClickListener,
        CancelableCallback {
 
    /**
     * 根据动画按钮状态,调用函数animateCamera或moveCamera来改变可视区域
     */
    private void changeCamera(CameraUpdate update, CancelableCallback callback) {
        boolean animated = ((CompoundButton) findViewById(R.id.animate))
                .isChecked();
        if (animated) {
            aMap.animateCamera(update, 1000, callback);
        else {
            aMap.moveCamera(update);
        }
    }
 
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        /**
         * 点击停止动画按钮响应事件
         */
        case R.id.stop_animation:
            aMap.stopAnimation();
            break;
        /**
         * 点击“去中关村”按钮响应事件
         */
        case R.id.Zhongguancun:
            changeCamera(
                    CameraUpdateFactory.newCameraPosition(new CameraPosition(
                            Constants.ZHONGGUANCUN, 18030)), null);
            break;
 
        /**
         * 点击“去陆家嘴”按钮响应事件
         */
        case R.id.Lujiazui:
            changeCamera(
                    CameraUpdateFactory.newCameraPosition(new CameraPosition(
                            Constants.SHANGHAI, 18300)), this);
            break;
        /**
         * 点击向左移动按钮响应事件,camera将向左边移动
         */
        case R.id.scroll_left:
            changeCamera(CameraUpdateFactory.scrollBy(-SCROLL_BY_PX, 0), null);
            break;
        /**
         * 点击向右移动按钮响应事件,camera将向右边移动
         */
        case R.id.scroll_right:
            changeCamera(CameraUpdateFactory.scrollBy(SCROLL_BY_PX, 0), null);
            break;
        /**
         * 点击向上移动按钮响应事件,camera将向上边移动
         */
        case R.id.scroll_up:
            changeCamera(CameraUpdateFactory.scrollBy(0, -SCROLL_BY_PX), null);
            break;
        /**
         * 点击向下移动按钮响应事件,camera将向下边移动
         */
        case R.id.scroll_down:
            changeCamera(CameraUpdateFactory.scrollBy(0, SCROLL_BY_PX), null);
            break;
        /**
         * 点击地图缩小按钮响应事件
         */
        case R.id.zoom_in:
            changeCamera(CameraUpdateFactory.zoomIn(), null);
            break;
        /**
         * 点击地图放大按钮响应事件
         */
        case R.id.zoom_out:
            changeCamera(CameraUpdateFactory.zoomOut(), null);
            break;
        default:
            break;
        }
    }
 
    @Override
    public void onCancel() {
        ToastUtil.show(CameraActivity.this"Animation to 陆家嘴 canceled");
    }
 
    @Override
    public void onFinish() {
        ToastUtil.show(CameraActivity.this"Animation to 陆家嘴 complete");
    }
}

设置可视区域边界

在最大可能缩放级别下,移动可视区域保证所有兴趣点都是可见的,这种情况下,就需要设置可视区域边界。例如:显示用户当前位置5公里范围内的所有加油站,您想要移动可视区域保证所有的加油站都可以在屏幕上显示。

使用 CameraUpdateFactory.newLatLngBounds(LatLngBounds bounds, int padding) 获取一个 CameraUpdate 对象,改变可视区域(使用 Projection.getVisibleRegion() 方法可以计算屏幕区域 LatLngBounds 的大小)。注意:地图的方向和倾斜角都应该为0度。

重载方法 CameraUpdateFactory.newLatLngBounds(LatLngBounds bounds, int width, int height, int padding) 允许您指定矩形区域的长和宽(像素为单位)。

说明

1.newLatLngBounds(LatLngBounds bounds, int padding) 方法需要在地图初始化完成之后使用。

2.在 onCreate 时设置可视区域边界,需要使用接口 AMap.OnMapLoadedListener。当地图载入成功后回调 onMapLoaded() 方法。

示例代码如下(详细信息,请参考示例工程“Markers 功能”案例 / com.amapv2.apis.overlay.MarkerActivity.java):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MarkerActivity extends FragmentActivity implements
    OnMapLoadedListener {
 
    /**
     * 监听amap地图加载成功事件回调
     */
    @Override
    public void onMapLoaded() {
        // 设置所有maker显示在View中
        LatLngBounds bounds = new LatLngBounds.Builder()
                .include(Constants.XIAN).include(Constants.CHENGDU)
                .include(marker1).include(marker2).include(marker3)
                .include(marker4).include(marker5).include(marker6)
                .include(marker7).include(marker8).include(marker9)
                .include(marker10).build();
        // 移动地图,所有marker自适应显示。LatLngBounds与地图边缘10像素的填充区域
        aMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 10));
    }
}
posted @ 2017-11-22 10:53  飞教主  阅读(993)  评论(0编辑  收藏  举报