《ArcGIS Runtime SDK for Android开发笔记》——(9)、空间数据的容器-地图MapView
1、前言
在上一篇内容里介绍了 关于ArcGIS Android开发的未来(“Quartz”版Beta)相关内容,期间也提到了关于API接口的重构,开发思路的调整,根据2015UC资料也可以知道新版预计将在明年的时候推出。届时在开发思路上将会往新版迁移。
总的来说,虽然“Quartz”版的开发思路有所变化,但总体变化不大,这里我将继续以现有正式发布版本为主梳理ArcGIS Runtime SDK for Android 开发内容。
参考API版本号:version 10.2.7。后续内容若不做特殊说明,均为此版本。
转载请注明出处: http://www.cnblogs.com/gis-luq/p/4941715.html
2、空间数据的容器
2.1、地图组件MapView概述
地图组件是所有空间数据的容器,是ArcGIS Runtime SDK的核心组件,也是所有GIS应用开发中的入口和基础。在ArcGIS Runtime SDK for Android中,地图组件的类名是MapView,它是Android中ViewGroup的子类,它与很多ArcGIS API中的Map、MapControl类作用是一样的。
MapView提供了完善的地图显示与控制功能:
- MapView具有呈现数据的能力,它可以添加一个或多个图层,所有图层只有添加到MapView容器中才能进行显示;
- MapView可以设置地图的显示范围和比例尺、旋转角度、地图背景、地图的最大/最小分辨率,以及指定当前显示的分辨率/比例尺;
- MapView提供了丰富的手势监听接口,通过这些监听可以实现各种手势动作,如点击、双击、移动或长按等操作。
特殊说明:MapView默认空间参考及空间范围为所添加的第一个图层的相关信息。
2.2、地图组件MapView的使用
有两种方式可以将MapView添加到应用当中:一个是XML方式,另一个是硬编码方式;一般多采用XML方式,方便调整布局及其属性相关设置。
2.2.1、XML方式添加MapView及初始化底图
<!-- MapView with MapOptions settings for Topo basemap,zoom level, and centered in Costa Mesa, CA. --> <com.esri.android.map.MapView android:id="@+id/map" android:layout_width="fill_parent" android:layout_height="fill_parent" mapoptions.MapType="topo" mapoptions.ZoomLevel="13" mapoptions.center="33.666354, -117.903557"/>
MapOptions是用来初始化地图的一些属性的,包括预定义底图类型(MapType)、放大的级别和地图的中心点,它在10.2版本的API中第一次引入。MapOptions的MapType是一个枚举型变量,有GRAY、HYBRID、NATIONAL_GEOGRAPHIC、OCEANS、OSM、SATALLITE、STREETS、TOPO这8个值,分别代表不同风格的底图,这样Android开发者们就不用每次都通过定义ArcGISTiledMapServiceLayer和底图的url来加载底图,也不用每次在初始化的时候费劲的定义底图的放大级别和地图中心点,而是仅用MapOptions的三个属性就可以完成初始化,代码更省,效率更高。
2.2.2、XML方式添加MapView及初始化底图
同样的,MapOptions也可以通过xml和java两种代码的方式使用。上面示例中就是使用xml方式使用MapOptions,下列示例代码是使用Java硬编码的方式使用MapOptions以及将MapView控件添加到应用中。
public class MapViewActivity extends Activity { MapView mapView; MapOptions opt= new MapOptions(MapType.STREETS,33.666354, -117.903557,13); protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mapviewcenterat); //利用MapOption初始化MapView mapView = new MapView(this,opt);
//也可以利用实例化ArcGISTiledMapServiceLayer添加底图图层 mapView.addLayer(
new ArcGISTiledMapServiceLayer("http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer"));
}
}
2.3、地图的方法
地图组件MapView是所有空间数据的容器,同时也是控制操作地图的对象,可以在MapView中实现对地图的放大、缩小、平移、单击、长按、以及一些状态的变化时的操作,例如当地图的范围变化时、地图的加载状态改变时等等。下面针对API中关于MapView的公有方法做一个详细说明。
MapView中的公有方法 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
int | addLayer(Layer layer, int index)
添加图层在给定的索引。
|
||||||||||
int | addLayer(Layer layer)
添加一个图层
|
||||||||||
void | addLayers(Layer[] layerArray)
添加图层列表
|
||||||||||
void | centerAndZoom(double lat, double lon, float levelOrFactor)
MapView初始化时,缩放到给定的坐标及显示级别。
|
||||||||||
void | centerAt(double lat, double lon, boolean animated)
MapView初始化时,缩放到指定坐标,animated表示是否显示动画效果。
|
||||||||||
void | centerAt(Point centerPt, boolean animated)
MapView初始化时,缩放到指定Point,animated表示是否显示动画效果。
|
||||||||||
Bitmap | createSymbolImage(Symbol symbol, Geometry geometry, int width, int height, int color)
这个方法在API 级别10.2.2 被弃用。请使用
getLegendImage(Symbol, Geometry, int, int, int) 替代。 |
||||||||||
Bitmap[] | createSymbolImages(Symbol[] symbol, Geometry[] geometry, int width, int height, int color)
这个方法在API 级别10.2.2 被弃用。请使用
getLegendImages(Symbol[], Geometry[], int, int, int) 替代。 |
||||||||||
void | enableWrapAround(boolean enable)
启用或禁用旋转地图功能。
|
||||||||||
ViewGroup.LayoutParams | generateLayoutParams(AttributeSet attrs) | ||||||||||
Callout | getCallout()
返回一个气泡弹窗窗口。
|
||||||||||
Point | getCenter()
放回当前MapView的中心点。
|
||||||||||
Bitmap | getDrawingMapCache(float x, float y, int w, int h)
通过屏幕坐标和长宽获取MapView截图。
|
||||||||||
Polygon | getExtent()
返回当前可视区域范围。
|
||||||||||
Grid | getGrid()
返回地图格网信息,格网的显示状态通过该实例控制。
|
||||||||||
Layer | getLayer(int index)
通过给定索引获取图层。
|
||||||||||
Layer | getLayerByID(long layerID)
通过图层ID获取图层。
|
||||||||||
Layer | getLayerByURL(String url)
通过在线地图服务的Url获取图层。
|
||||||||||
Layer[] | getLayers()
获取MapView中所有图层。
|
||||||||||
LocationDisplayManager | getLocationDisplayManager()
获取位置管理类
LocationDisplayManager . |
||||||||||
Envelope | getMapBoundaryExtent() | ||||||||||
Envelope | getMaxExtent()
获取MapView的最大范围。
|
||||||||||
double | getMaxResolution() | ||||||||||
double | getMaxScale()
返回最大比例尺。
|
||||||||||
double | getMinResolution()
该方法在API 级别 10.2.2
被弃用。使用 |
||||||||||
double | getMinScale()
返回最小比例尺。
|
||||||||||
OnLongPressListener | getOnLongPressListener()
获取长按事件 OnLongPressListener。
|
||||||||||
OnPanListener | getOnPanListener()
获取平移事件 OnPanListener。
|
||||||||||
OnPinchListener | getOnPinchListener()
获取捏恰事件 OnPinchListener。
|
||||||||||
OnSingleTapListener | getOnSingleTapListener()
获取单击事件 onSingleTapListener。
|
||||||||||
OnStatusChangedListener | getOnStatusChangedListener()
获取MapView状态改变事件 OnStatusChangedListener 。
|
||||||||||
OnZoomListener | getOnZoomListener()
获取缩放事件 OnZoomListener。
|
||||||||||
double | getResolution()
返回 MapView的分辨率。
|
||||||||||
double | getRotationAngle()
返回当前地图的旋转角度,逆时针方向。
|
||||||||||
double | getScale()
获取地图比例尺。
|
||||||||||
SpatialReference | getSpatialReference()
返回MapView空间坐标系统。
|
||||||||||
boolean | isAllowOneFingerZoom()
返回true ,是否允许一个手指缩放地图。
|
||||||||||
boolean | isAllowRotationByPinch()
返回true ,如果旋转缩放是允许的。
|
||||||||||
boolean | isLoaded()
返回true ,如果MapView初始化完成。
|
||||||||||
boolean | isRecycled()
返回true ,如果MapView已回收。
|
||||||||||
boolean | isShowMagnifierOnLongPress()
检查地图放大镜功能是否启用。
|
||||||||||
void | onChildViewAdded(View parent, View child) | ||||||||||
void | onChildViewRemoved(View parent, View child) | ||||||||||
void | pause()
暂停地图。
|
||||||||||
void | recycle()
释放MapView引用的资源,以便他们可以回收。
|
||||||||||
void | removeAll()
删除所有图层。
|
||||||||||
void | removeLayer(int index)
删除指定索引图层。
|
||||||||||
void | removeLayer(Layer layer)
删除指定图层。
|
||||||||||
void | restoreState(String state)
利用保存的地图的中心的坐标,当前地图的分辨率,和LocationDisplayManager状态(是否活跃和是否autopan)字符串恢复信息。
|
||||||||||
String | retainState()
保存地图的中心的坐标,当前地图的分辨率,和LocationDisplayManager状态(是否活跃和是否autopan)作为一个字符串。
|
||||||||||
void | setAllowMagnifierToPanMap(boolean allow)
设置当放大镜显示时,是否能够平移地图。
|
||||||||||
void | setAllowOneFingerZoom(boolean allowOneFingerZoom)
允许/不允许一个手指缩放。
|
||||||||||
void | setAllowRotationByPinch(boolean allowRotationByPinch)
允许/不允许缩放旋转。
|
||||||||||
void | setEsriLogoVisible(boolean visible)
打开或关闭ESRI的logo。
|
||||||||||
void | setExtent(Geometry geometry, int padding)
设置空间范围。
|
||||||||||
void | setExtent(Geometry geometry)
设置当前地图显示的空间范围。
|
||||||||||
void | setExtent(Geometry geometry, int padding, boolean animated)
设置空间范围。
|
||||||||||
void | setMapBackground(int bkColor, int gridColor, float gridSize, float gridLineSize)
设置地图背景颜色和网格。
|
||||||||||
boolean | setMapOptions(MapOptions options)
设置地图底图参数MapOptions。
|
||||||||||
void | setMaxExtent(Envelope env)
设置地图显示的边界范围
|
||||||||||
void | setMaxResolution(double maxResolution) | ||||||||||
void | setMaxScale(double maxScale)
设置地图最大比例尺。
|
||||||||||
void | setMinResolution(double minResolution) | ||||||||||
void | setMinScale(double minScale)
设置底图最小比例尺。
|
||||||||||
void | setOnLongPressListener(OnLongPressListener onLongPressListener)
设置长按监听事件。
|
||||||||||
void | setOnPanListener(OnPanListener onPanListener)
设置平移监听事件。
|
||||||||||
void | setOnPinchListener(OnPinchListener onPinchListener)
设置捏掐监听事件。
|
||||||||||
void | setOnSingleTapListener(OnSingleTapListener onSingleTapListener)
设置单击监听事件。
|
||||||||||
void | setOnStatusChangedListener(OnStatusChangedListener onStatusChangedListener)
设置地图状态改变监听事件。
|
||||||||||
void | setOnZoomListener(OnZoomListener onZoomListener)
设置放大缩小监听事件。
|
||||||||||
void | setResolution(double res)
设置分辨率。
|
||||||||||
void | setRotationAngle(double degree, Point centerPt, boolean animated)
在给定点居中显示,并旋转到给定角度。animated 是否启用动画效果。
|
||||||||||
void | setRotationAngle(double degree, boolean animated)
旋转地图到给定角度,animated 是否启用动画效果。
|
||||||||||
void | setRotationAngle(double degree)
旋转地图到给定角度。
|
||||||||||
void | setRotationAngle(double degree, float pivotX, float pivotY)
以某个点为中心旋转地图。
|
||||||||||
void | setScale(double scale, boolean animated)
设置地图比例尺;animated是否启用动画效果。
|
||||||||||
void | setScale(double scale)
设置底图比例尺。
|
||||||||||
void | setShowMagnifierOnLongPress(boolean showMagnifier)
设置是否长按启用放大镜功能。
|
||||||||||
Future<Boolean> | switchBaseMap(BaseMap basemap, Portal portal, OnBaseMapSwitchListener listener)
切换底图。
|
||||||||||
Point | toMapPoint(float screenx, float screeny)
将屏幕上的点转换成地理坐标点。
|
||||||||||
Point | toMapPoint(Point src)
将屏幕上的点转换成地理坐标点。
|
||||||||||
Point | toScreenPoint(Point src)
将地理坐标点转换成屏幕上的点。
|
||||||||||
void | unpause()
取消暂停地图。
|
||||||||||
void | zoomTo(Point centerPt, float factor)
缩放到给定点。
|
||||||||||
void | zoomToResolution(Point centerPt, double res)
设定中心点,缩放到给定分辨率水平。
|
||||||||||
void | zoomToScale(Point centerPt, double scale)
设定中心点,缩放到指定比例尺。
|
||||||||||
void | zoomin()
放大地图。
|
||||||||||
void | zoomin(boolean animated)
放大地图。
|
||||||||||
void | zoomout()
缩小地图。
|
||||||||||
void | zoomout(boolean animated)
缩小地图。
|
以上内容翻译若有错误,欢迎大家留言批评指出!
文章若无特殊说明均为原创,原创作品,允许转载,转载时请务必以超链接形式标明文章出处、作者信息和本声明。 博客:http://www.cnblogs.com/gis-luq 作者:gis-luq 邮箱:luqiang.gis@foxmail.com