转自:http://blog.csdn.net/arcgis_mobile/article/details/7801467

GIS的开发中,什么时候都少不了地图操作。ArcGIS for Android中,地图组件就是MapView,MapView是基于Android中ViewGroup的一个类(参考),也是ArcGIS Runtime SDK for Android中的地图容器,与很多ArcGIS API中的Map、MapControl类的作用是一样的。

地图常见的操作有缩放、旋转、平移、获取范围、比例尺、分辨率等信息,以及常用的手势操作,其中,经常使用到的功能和常见问题有以下几个:

1)将地图缩放到指定的比例尺/分辨率/级别;

2)设置地图的最大最小缩放级别;

3)获取地图上某点的经纬度坐标;

4)地图的手势操作;

5)地图无法显示。

下面内容会为您详细解答以上问题。

1、获取/设置比例尺、分辨率、中心点、范围;

ArcGIS forAndroid中,MapView具有很多与地图操作有关的方法,其中,与地图的比例尺、分辨率、中心点、范围有关的方法如下:

获取/设置地图的中心点、范围、分辨率、比例尺

返回类型

方法

说明

Void

centerAt(Point centerPt, Boolean animated)

将地图居中到指定的点

Point

getCenter()

获取地图中心点

Polygon

getExtent()

获取地图最小外包矩形

Envelope

getMapBoundaryExtent()

获取地图的边界

Void

setExtent(Geometry geometry)

将地图放大到指定的范围,并将该geometry的bound作为地图当前的extent

Void

setExtent(Geometry geometry, int padding)

将地图放大到指定的geometry以便geometry适应地图的bound

Double

getMaxResolution()

获取地图最大分辨率

Void

setMaxResolution(double maxResolution)

设置地图最大分辨率

Double

getMinResolution()

获取地图最小分辨率

Void

setMinResolution(double minResolution)

设置地图最小分辨率

Double

getResolution()

获取当前地图分辨率

Void

setResolution(double res)

设置当前地图分辨率

Double

getScale()

获取当前地图比例尺

Void

setScale(double scale)

设置当前地图比例尺

要获取/设置地图的比例尺、初始分辨率、范围、中心点等信息,直接使用上述方法即可,非常简单,在此不赘述,示例代码如下:

map.setScale(18489297.737236);//设置地图初始化时的比例尺;

map.setAllowRotationByPinch(true);//设置是否允许地图通过pinch方式旋转;

map.setRotationAngle(15.0);//设置地图的旋转角度;

……

2、地图缩放、平移和旋转;

与缩放和旋转有关的地图事件如下:

                                                                                                            地图缩放、旋转

返回类型

方法

说明

Void

zoomin()

Void

zoomout()

Void

zoomTo(Point centerPt, float factor)

将地图放荡到指定点

Void

zoomToResolution(Point centerPt, double res)

将地图放大到指定分辨率

Void

zoomToScale(Point centerPt, double scale)

将地图放大到指定比例尺

Double

getRotationAngle()

返回当前地图旋转角度(单位degree)

Void

setRotationAngle(double degree)

将地图按照指定的角度(单位degree)旋转,度数为正数则按逆时针方向旋转

Void

setRotationAngle(double degree, float pivotX, float pivotY)

将地图按指定的点和角度旋转,角度为正数按逆时针

Void

setAllowRotationByPinch(boolean allowRotationByPinch)

允许/取消pinch旋转

Boolean

isAllowRotationByPinch()

是否允许pinch时旋转

2.1 平移

MapView的方法中,没有专门针对平移操作,主要原因在于,MapView中已经默认支持平移操作,即使用鼠标或手势拖动地图时就会平移地图,所以无需设置;

2.2 缩放至指定的分辨率/比例尺和连续放大n倍

一般的切片地图服务,在其REST服务的目录下都能查到切片的等级、等级对应的分辨率和比例尺,每个等级之间的分辨率和比例尺之间呈2倍的关系。
    ArcGIS Android中没有像Web中的那种指针控件,没有直接的地图级别的控制,通常级别控制通过分辨率或比例尺来实现。可以用getResolution()和getscale()方法获取当前地图的比例尺和分辨率,然后利用2的倍数关系,使用zoomTo()/zoomToScale()/zoomToResolution()来达到“控制地图缩放级别”的目的:

放大/缩小1倍:

map.zoomin()、map.zoomout();

连续放大/缩小n倍:

map.zoomTo(point centerPt, float factor);如:map.zoomTo(centerPt,2n),其中,n为放大或缩小的倍数;

map.zoomToScale(Point centerPt, double scale) ;如:map.zoomToScale(centerPt, map.getScale()/2n)/map.zoomToScale(pt,map.getScale()*2n),其中,n为放大或缩小的倍数;

map.zoomToResolution(point centerPt, double res):map.zoomToResolution(centerPt,map.getResolution()/2n)/map.zoomToResolution(centerPt,map.getResolution() *2n),其中,n为放大或缩小的倍数;

在zoomTo(point centerPt, float factor)中,centerPt指在哪个点放大,factor参数用来计算新的分辨率,计算公式为:新的分辨率 = 当前分辨率/factor。这个意思也就是说,想在当前分辨率下放大3倍,则新分辨率 = 当前分辨率/(23),因为每一级之间分辨率呈2的倍数关系,放大三级,分辨率就是23倍,factor =23。 从上图中可以看出,地图级别每增加1级,分辨率/2,比例尺/2,故如果想将地图连续放大n级,factor =2n。如果想将地图连续缩小n级,则 factor =2-n

在zooToScale(Point centerPt, double scale)和zoomToResolution(point centerPt, double res)中,scale和res都指实际的分辨率和比例尺,故按照2的倍数关系直接乘除即可。

2.3 设置地图最大最小缩放级别

有时候我们需要设置地图放大或缩小到某个级别之后,不允许用户再放大或缩小,用以下两个方法很容易做到:

map.setMaxResolution(MaxResolution);

map.setMinResolution(MinResolution);

这两个方法设置了地图的最大、最小分辨率,也就限制了地图的缩放级别,当地图达到最大、最小分辨率时,地图将不能再被缩小或者放大,以免用户无限制的缩放地图或看到更多的内容。

在初始化时将地图设定为某种级别(找到该级别对应的分辨率、比例尺):

map.setResolution(该级别对应的分辨率);

至于如何获取当前地图等级,没办法,先获取resolution,然后去rest服务目录中对照取其级别吧。

2.4 旋转地图

可以使用setRotationAngle(double degree)和setRotationAngle(doubledegree, float pivotX, float pivotY)来实现将地图旋转一定的角度,要实现通过手势进行旋转,需要通过setOnPinchListener(OnPinchListener onPinchListener)监听来实现。如:

public void onCreate(Bundle savedInstanceState, OnPinchListener onPinchListener) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

map = (MapView)findViewById(R.id.map);

……

map.setAllowRotationByPinch(true); //是否允许使用Pinch方式旋转地图

map.setRotationAngle(15.0); //初始化时将地图旋转15度,参数为正时按逆时针方向旋转。

}

 

3、获取地图上某点的坐标

获取地图上某点的坐标主要使用下列几个方法,其中,主要使用toMapPoint()方法实现获取地图上的点坐标信息:

返回类型

方法

说明

SpatialReference

getSpatialReference()

返回地图的坐标系统

Point

toMapPoint(float screenx, float screeny)

将屏幕坐标转换成地图坐标系下的ArcGIS geometry Point坐标

Point

toMapPoint(Point src)

将屏幕坐标转换成地图坐标系下的ArcGIS geometry Point坐标

Point

toScreenPoint(Point src)

将地图坐标系下的ArcGIS geometry Point坐标转换成屏幕坐标

如,在长按地图时获取鼠标点的坐标代码如下:

//      长按显示鼠标点坐标及比例尺

this.map.setOnLongPressListener(new OnLongPressListener() {

private static final long serialVersionUID = 1L;

@Override

public void onLongPress(float x,float y) {

com.esri.core.geometry.Point pt = map.toMapPoint(x, y);

mapcenter.setText("X:"+ pt.getX() +"Y:"+ pt.getY());

labelxy.setText("当前地图分辨率为:" +map.getResolution());

mapscale.setText("当前地图比例尺为:" +map.getScale());

}

});

运行结果如下:

4、手势操作

默认情况下,MapView响应以下手势:

1)单一手指双击和pinch-out放大地图;

2)两个或多个手指pinch-in缩小地图;

3)单个手指拖拽平移地图。

其它手势监听有:

手势事件

返回类型

方法/事件监听

说明

OnLongPressListener

getOnLongPressListener()

获取地图长按事件监听

OnPanListener

getOnPanListener()

获取地图平移事件监听

OnPinchListener

getOnPinchListener()

获取地图捏夹事件监听

OnSingleTapListener

getOnSingleTapListener()

获取地图单击事件监听

OnZoomListener

getOnZoomListener()

获取缩放监听

void

setOnLongPressListener(OnLongPressListener onLongPressListener)

设置地图长按事件监听

Void

setOnPanListener(OnPanListener onPanListener)

设置地图平移事件监听

Void

setOnPinchListener(OnPinchListener onPinchListener)

设置地图捏夹事件监听

Void

setOnSingleTapListener(OnSingleTapListener onSingleTapListener)

设置地图单击事件监听

Void

setOnZoomListener(OnZoomListener onZoomListener)

设置缩放监听

5、关于地图显示不出来的问题

许多新手在使用ArcGIS RuntimeSDk for Android开发时,最简单的HelloWorld程序都会遇到问题,按照教程的步骤,添加了MapView,添加了切片图层,一切就绪,地图却始终出不来,遇到这个问题可先从以下几个方面查找原因:

1)如果添加了多个图层,请确保多个图层的地理参考一致;

2)是服务类型是否对应;

3)图层声明在xml布局文件中;

4)如果只是添加了一个底图图层仍然出不来底图,那么十有八九是extent的问题。首先,MapView控件必须至少包含一个图层,其次,该图层最好为其指定initExtent,在xml中代码如下:

<com.esri.android.map.MapView

android:id="@+id/map"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

 initExtent="-20037507.0672, -30240971.9584, 20037507.0672, 30240971.9584">

</com.esri.android.map.MapView>

该initExtent来自哪里呢?还是地图服务目录中:

取两个中的任一个,或者自定义一个包含于上述两个范围中的extent均可,推荐使用full extent。

6、其它常用方法

除了上述提到的各种方法和监听之外,还有一些与地图相关的,也比较常用的方法和监听如下:

其它属性和事件

返回类型

方法/事件监听

说明

OnStatusChangedListener

getOnStatusChangedListener()

获取地图状态改变事件监听

Void

setOnStatusChangedListener(OnStatusChangedListeneronStatusChangedListener)

设置地图状态改变事件监听

Boolean

isLoaded()

MapView初始化之后返回true

Void

setEsriLogoVisible(Boolean visible)

打开或关闭地图上的ESRI的logo标签

Void

setMapBackground(int bkColor, int gridColor, float gridSize, float gridLineSize)

设置地图背景颜色

转载于:https://www.cnblogs.com/cugwx/p/3781243.html

ArcGIS for Android地图控件的5大常见操作相关推荐

  1. android地图 demo,Android地图控件之多地图展示

    一.简介 地图控件自v2.3.5版本起,支持多实例,即开发者可以在一个页面中建立多个地图对象,并且针对这些对象分别操作且不会产生相互干扰. 文件名:Demo04MultiMapView.cs 简介:介 ...

  2. Maps模块管理地图控件,用于在web页面中显示地图控件,提供各种接口操作地图控件,如添加标点、路线等。通过plus.maps可获取地图管理对象

    方法: openSysMap: 调用系统第三方程序进行导航 create: 创建Map对象 getMapById: 查找已经创建的Map对象 对象: Map: 地图控件对象 MapStyles: 地图 ...

  3. ArcGIS for Android Runtime100 基本操作(二)——地图控件的常见操作

    以前我刚开始学习ArcGIS时候,看得最常见的一篇博客是Ersi中国官方写的一篇<ArcGIS for Android地图控件的5大常见操作>,地址是http://blog.csdn.ne ...

  4. java 地图控件_室内地图Android SDK地图控件 - 蜂鸟云

    地图控件 Fengmap Android SDK 提供多个控件.控件与地图之间存在交互.本模块将对控件交互部分提供说明介绍. 注:除指北针控件外,其余控件的创建都在onMapInitSuccess事件 ...

  5. Android 自定义地图控件 可手指拉伸放大缩小拖动,指定坐标加点加线

    之前公司 项目有用到 gps定位 ,以及 工厂地图 布置 点 ,但是 无法使用百度地图之类的 第三方地图SDK ,只给一个工厂平面图,就要实现gps定位,一直 地图上布点. gps 坐标转换到 图片上 ...

  6. SAP UI5 应用开发教程之六十 - SAP UI5 地图控件的一些高级用法试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  7. Android学习--02(猜猜我的星座App源码+Android常用控件TextView+EditText+Button+ImangeView+DatePicker+App间通信+跳转页面)

    猜猜我的星座App 1 Android常用控件 1.1 TextView控件 1.1.1 简介 1.1.2属性 1.1.3 扩展属性 1.1.4 TextView的使用方法 1.1.5总结 1.2 E ...

  8. Android 原生控件之一 TextView

    Android 原生控件之一 TextView 前言 来源 开始 XML属性 1.android:allowUndo 2.android:autoLink 3.android:autoSizeMaxT ...

  9. c# AE GIS二次开发学习专题(二) 基本地图控件使用

    GIS二次开发学习专题(二) 基本地图控件使用 学习资料来自<牟乃夏 AE开发教程-基于C#.NET> 发的代码是我整理+老师布置的作业 这一部分是地图基本控件的使用与编写,包括: 一.二 ...

  10. Android开源控件ViewPager Indicator的使用方法

     1月16日厦门 OSC 源创会火热报名中,奖品多多哦   摘要 Android开源控件ViewPager Indicator的使用介绍 ViewPagerIndicator 目录[-] 1. V ...

最新文章

  1. 突破高连接性能瓶颈,图数据库在银行业这么用
  2. MYsql 查询 查询当前月份的数据
  3. mysql与oracle函数对比
  4. EasyUI中Datagride数据网格的简单使用
  5. 图像连通域标记算法研究
  6. asp.net core 3.0 gRPC框架小试
  7. spring中stereotype注解Component,Repository,Service,Controller
  8. 使用javamail发信过程中的一些问题及解决方法
  9. c#基础数据操作之遍历DataTable并输出
  10. 详解Python的装饰器
  11. 多人远程同时使用谷歌浏览器
  12. pg PostGIS教程:几何图形(geometry)
  13. 2022 年七大前沿科技:每一项都能改变世界
  14. 中关村电子商户纷纷搬走或转型 为哪般
  15. 倍福PLC的ModbusRTU设置
  16. R统计绘图-PCA详解1(princomp/principal/prcomp/rda等)
  17. Nginx+Tomcat服务器负载均衡实践方案
  18. 探究音节bo、po、 mo、 fo韵母的实际发音
  19. JavaScript验证Email的四种方法
  20. 鸿蒙没有推出手机的打算,华为:没有推出鸿蒙手机计划,自拍会让人觉得你孤独和失败...

热门文章

  1. scala zip--拉链操作入门
  2. 【java.lang.UnsupportedClassVersionError】问题的解决方法
  3. 1.4 测试各阶段(单元、集成、系统 、Alpha、Beta、验收)
  4. Eclipse中JSP生成的class文件去了哪里?
  5. 停止预览时调用Camera.release(), 出现Method called after release()异常问题原因及解决办法...
  6. PHP获取当前文件路径,上层目录路径
  7. [USACO18DEC]Cowpatibility(容斥 or bitset优化暴力)
  8. 【暖*墟】#树链剖分# 树链剖分学习与练习
  9. Netty2:粘包/拆包问题与使用LineBasedFrameDecoder的解决方案
  10. 关于字符编码的一点学习。