以前我刚开始学习ArcGIS时候,看得最常见的一篇博客是Ersi中国官方写的一篇《ArcGIS for Android地图控件的5大常见操作》,地址是http://blog.csdn.net/arcgis_mobile/article/details/7801467。不过不知道啥原因后来这篇博客删掉了,但是网络上还是能看到到处转的这篇博文。

这篇博文特别对于MapView的常见用法做了比较详细的描述,非常有用。不过在Runtime100里,大多数方法也都有了变化,我也就基于这篇博文的内容,在基于Runtime100的内容做一下更新吧。

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

  1. 将地图缩放到指定的比例尺/分辨率/级别;
  2. 设置地图的最大最小缩放级别;
  3. 获取地图上某点的经纬度坐标;
  4. 地图的手势操作;

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

1、底图、比例尺、空间参考系和范围

ArcGIS forAndroid中,MapView具有很多与地图操作有关的方法,其中,与地图的比例尺、空间参考系、范围有关的方法如下。

因为在100里很多地图相关的内容都交给了ArcGISMap类来管理,所以先看看ArcGISMap类里的相关相关方法。

返回类型 方法 说明
Basemap getBasemap() 获取当前地图中的底图
double getMaxScale() 获取当前地图中的最大比例尺
double getMinScale() 获取当前地图中的最小比例尺
LayerList getOperationalLayers() 获取当前地图中的加载的图层
SpatialReference getSpatialReference() 获取当前地图中的空间参考系
Viewpoint getInitialViewpoint() 获取当前地图中的Viewpoint
void setBasemap(Basemap basemap) 设置当前地图的底图
void setInitialViewpoint(Viewpoint viewpoint) 设置当前地图中的Viewpoint
void setMaxScale(double maxScale) 设置当前地图中的最大比例尺
void setMinScale(double minScale) 设置当前地图中的最大比例尺

其中Basemap,LayerList,Viewpoint都是100里新增加的类,分别表示底图,业务图层集合以及地图上当前可视范围内容。具体的使用可以看看链接的API。

对于MapView里还保留的方法有:

返回类型 方法 说明
BackgroundGrid getBackgroundGrid() 获取地图背景格网
ArcGISMap getMap() 获取加载的ArcGISMap类
double getMapRotation() 获取地图的旋转角度
double getMapScale() 获取地图的比例尺
SpatialReference getSpatialReference() 获取地图的空间参考系
void setBackgroundGrid(BackgroundGrid backgroundGrid) 设置地图背景格网
void setMap(ArcGISMap map) 设置加载的ArcGISMap类

我们可以看到,Esri对100里地图设置相关的策略就是用MapView仅作为一个容器,而ArcGISMap才是作为实际控制地图展示的类。我们可以在MapView里进行比例尺和旋转角度的查询,但是要设置最大最小比例尺,只能在MapView里先获取到对应ArcGISMap再进行设置。

这一类的代码很简单,唯一有点问题的是如何隐藏背景格网,其方法为:

BackgroundGrid mainBackgroundGrid = new BackgroundGrid();
mainBackgroundGrid.setColor(0xffffffff);
mainBackgroundGrid.setGridLineColor(0xffffffff);
mainBackgroundGrid.setGridLineWidth(0);
mMapView.setBackgroundGrid(mainBackgroundGrid);

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

在Arcgis 10.2里设置中心点平移是用的Mapview.centerAt(Point ponit,Boolean animated)方法实现,而100里,我们可以看到将这个方法进行了更改,除了直接设置中心点平移以外,还可以返回一个接口用以异步监听平移事件。

除了设置中心点平移的方法外,与之类似的还有旋转,缩放等,其API如下所示:

整理下就是:

返回类型 方法 说明
ListenableFuture<Boolean> setViewpointAsync(Viewpoint viewpoint, float durationSeconds, AnimationCurve) 设置当前地图的Viewpoint
ListenableFuture<Boolean> setViewpointCenterAsync(Point point) 设置地图中心点(平移)
ListenableFuture<Boolean> setViewpointCenterAsync(Point center, double scale) 设置地图中心点和比例尺(平移和缩放)
ListenableFuture<Boolean> setViewpointGeometryAsync(Geometry boundingGeometry) 缩放地图到图形范围
ListenableFuture<Boolean> setViewpointGeometryAsync(Geometry boundingGeometry, double padding) 缩放地图到图形范围,并有一定外边距范围
ListenableFuture<Boolean> setViewpointRotationAsync(double angleDegrees) 设置地图的角度(旋转)
ListenableFuture<Boolean> setViewpointScaleAsync(double scale) 设置地图的比例尺(缩放)

比起以前来,操作类的方法都多了个异步过程,返回的是ListenableFuture接口,包含addDoneListener和removeDoneListener方法,用以监听操作完成后的开启和关闭一个线程,例子为:

mMapView.setViewpointCenterAsync(clickPoint).addDoneListener(new Runnable() {@Override
    public void run() {Toast.makeText(MainActivity.this,"平移到这里",Toast.LENGTH_SHORT).show();
    }
});

这样在平移结束后会执行弹出提示的方法。

对于缩放的话,比起10.2的版本,少了zoomin()和zoomout的方法,所以在100里如果要一级一级缩放地图只能采用设置当前地图比例尺的方法:

Double scales=mMapView.getMapScale();
mMapView.setViewpointScaleAsync(scales*2);
mMapView.setViewpointScaleAsync(scales*0.5);

3、地图上点坐标的获取

地图上的坐标一般涉及到屏幕坐标转换为地图坐标,以及地图坐标转换为屏幕坐标。在100里,这两个功能实现的方法分别为:

返回类型 方法 说明
android.graphics.Point screenToLocation(Point screenPoint) 屏幕上的点转地图上的点
com.esri.arcgisruntime.geometry.Point locationToScreen(Point mapPoint) 地图上的点转屏幕上的点

这两个方法很简单,不过注意的是两个Point的类型不一样。屏幕点的Point是用的Android本来自带的Point类,而地图上的点是用的100包里的Point类。不过想想也很符合道理,屏幕采点主要用于和Android设备本身相关的操作,而地图上的点都用于GIS里接下来的一些采集、分析、查询等。

结合上一节平移举个例子为:

mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, mMapView) {@Override
    public boolean  onSingleTapConfirmed(MotionEvent v) {android.graphics.Point screenPoint=new android.graphics.Point(Math.round(v.getX()), Math.round(v.getY()));
        Point clickPoint = mMapView.screenToLocation(screenPoint);
        mMapView.setViewpointCenterAsync(clickPoint).addDoneListener(new Runnable() {@Override
            public void run() {Toast.makeText(MainActivity.this,"平移到这里",Toast.LENGTH_SHORT).show();
            }});
        Log.i("sss",clickPoint.toString());
        return true;
    }
});

4、地图上的手势操作

在100里,将和地图相关的手势操作全部都封装到了一个DefaultMapViewOnTouchLisetener接口里。我们使用的时候只需要写一个监听接口,然后在接口里重写不同的手势方法就可以监听到不同的手势动作,这一点上非常方便。监听方法如下所示:

返回类型 方法 说明
abstract boolean onDoubleTouchDrag(MotionEvent e) 双击并拖动屏幕的监听方法
abstract boolean onMultiPointerTap(MotionEvent e) 多次点击屏幕的监听方法
abstract boolean onRotate(MotionEvent e, double angle) 旋转屏幕手势的监听方法
abstract boolean onUp(MotionEvent e) 当手指触摸屏幕抬起时候的监听方法
boolean onDoubleTap(MotionEvent e) 双并拖动屏幕的监听方法
boolean onDown(MotionEvent e) 当手指触摸到屏幕时候的监听方法
boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) 当手指快速划过屏幕时候的监听方法
void onLongPress(MotionEvent e) 长按屏幕的监听方法
boolean onScale(ScaleGestureDetector detector) 双指触碰屏幕后靠近或者远离的监听方法
boolean onScaleBegin(ScaleGestureDetector detector) 当双指靠近手势开始时候监听方法
void onScaleEnd(ScaleGestureDetector detector) 当双指靠近手势结束时候监听方法
boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) 当屏幕旋转时候的监听方法
boolean onSingleTapConfirmed(MotionEvent e) 在单击和双击屏幕之间时间的监听方法
boolean onSingleTapUp(MotionEvent e) 在单击事件手指离开屏幕时候的监听方法
boolean onTouch(View view, MotionEvent event) 触碰事件发送到某个View的监听方法

可以看到监听手势的方法非常丰富,足以实现我们大部分的需求,一亿个例子来说明下如何使用手势的监听事件吧:

mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, mMapView) {@Override
    public boolean  onSingleTapConfirmed(MotionEvent v) {android.graphics.Point screenPoint=new android.graphics.Point(Math.round(v.getX()), Math.round(v.getY()));
        Point clickPoint = mMapView.screenToLocation(screenPoint);
        mMapView.setViewpointCenterAsync(clickPoint).addDoneListener(new Runnable() {@Override
            public void run() {Toast.makeText(MainActivity.this,"平移到这里",Toast.LENGTH_SHORT).show();
            }});
        return true;
    }@Override
    public boolean onDoubleTapEvent(MotionEvent e){Toast.makeText(MainActivity.this,"双击了一下",Toast.LENGTH_SHORT).show();
        return true;
    }@Override
    public void onLongPress(MotionEvent e){Toast.makeText(MainActivity.this,"长按了地图一下",Toast.LENGTH_SHORT).show();
    }
});

可以看出100里对于屏幕的手势监听事件比以前简洁而强大了许多。

PS:这一章表格的排版是在EXCEL里进行的,不知道为啥粘贴在博客里样式就都乱了。

ArcGIS for Android Runtime100 基本操作(二)——地图控件的常见操作相关推荐

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

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

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

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

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

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

  4. 让一个图片填满一个控件_如何在Android中实现一个全景图控件(二)

    一.背景 在 如何在Android中实现一个全景图控件(一)中,介绍了项目的一些基本情况(有 demo 演示),如果项目对你有帮助,希望文章赏个赞,项目 star 一下. 项目地址:https://g ...

  5. OpenLayers学习笔记高级篇(二、地图控件)

    在OpenLayers 3中,地图控件指的是下图标注的这些,包括缩放按钮,标尺,版权说明,指北针等等. 他们不会随着地图的移动而移动,一直处于一个固定的位置. 在实现上,并不是在画布上绘制的,而是使用 ...

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

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

  7. 认识Android(常用布局,控件,四大组件,动画,自定义控件及异常消息处理机制)

    目录 一.布局 1.LinearLayout(线性布局): 2.相对布局(RelativeLayout) 3.GridLayout(网格布局) 4.FrameLayout(帧布局): 二.控件 1.T ...

  8. 利用ArcGIS Engine、VS .NET和Windows控件开发GIS应用

    Dixon 原文  用ArcGIS Engine.VS .NET和Windows控件开发GIS应用 此过程说明适合那些使用.NET建立和部署应用的开发者,它描述了使用ArcGIS控件建立和部署应用的方 ...

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

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

最新文章

  1. Windows下安装Cygwin配置Hadoop集群
  2. 数字图像处理实验(13):PROJECT 05-04,Parametric Wiener Filter
  3. 科技论文新在哪里?-如何写好科技论文之我见(三)
  4. 分布式架构的水平和垂直扩容
  5. virtualbox怎么共享文件夹 linux,Virtualbox中Ubuntu设置共享文件夹
  6. 计算机应用全能,全能计算助手
  7. php 读取 stl 文件,科学网—[转载]【源码】读取ASCII STL文件的STLReader - 刘春静的博文...
  8. proxmoxve打造云桌面_最大亮点!山东众志电子为山东财经大学东方学院打造首个200点位云桌面考场...
  9. SAP物料批次管理配置及操作手册(轉載)
  10. flink读取不到文件_Flink读取本地文件
  11. 关于sublime出现PyV8binary错误
  12. 调用阿里API实现图片验证码识别
  13. 服务器状态监控,LOL服务器状态监控
  14. Mybatis学习教程②
  15. A-Unimodal Array
  16. 计算机二级考试用户名怎么查,计算机二级考试成绩查询方法与具体步骤
  17. ctfshow(菜狗杯)
  18. Exception in Thread: ValueError: signal number 32 out of range
  19. Ubuntu 安装 nvm
  20. 前端实现点击复制功能

热门文章

  1. 汽车电子的电磁兼容性分析
  2. 永恒python强化材料_强化学习 Reinforcement Learning (莫烦 Python 教程)
  3. java b2c_JAVA开源B2C系统
  4. 求1到100之间的所有的整数和,包括100
  5. QFtp实现文件夹下载
  6. 汽车电子静电与浪涌保护 -----与非网与雷卯联合直播回顾
  7. Quartus 11.0 Internal Error veriname_elab.cpp
  8. 域名备案号和密码忘记找回指导与坑
  9. 医院住院管理系统(Java+Web+JSP+MySQL)
  10. HR必看!2023年人资工作7大趋势,带你超前部署人才战略