Android GIS开发系列-- 入门季(14)FeatureLayer之范围查询
Android GIS开发系列-- 入门季(5),这篇文章中,我们知道如何去查找要素。现在有一个需求,查找某点5000米范围的要素,那如何来做呢?首先我们需要在地图上画个5000米半径的圆,然后根据QueryParameters来查询相关要素。具体如下:
一、画个5000米半径的圆
1.确定中心点:centerPoint
2.半径为5000
3.将一个圆分为120个点(当然可以细分更多),比如第一个点角度为0,求出sin与cos值,再分别求出经度与纬度:
纬度= 中心点的纬度+半径*cos值*每米的纬度偏移量
经度= 中心点的经度+半径*sin值*每米的经度偏移量
相关代码如下 :
/纬度每米偏移量(存在误差)
public static final double ONE_METER_OFFSET = 0.00000899322;
//计算当前纬度时经度的偏移量
public static double calcLongitudeOffset(double latitude) {
return ONE_METER_OFFSET / Math.cos(latitude * Math.PI / 180.0f);
}
//获取一个圆
private Polygon addGraphicCricle(Point centerPoint,double meter) {
List<Point> points = new ArrayList<Point>();
double sin;
double cos;
double lon;
double lat;
for (double i = 0; i < 120; i++) {
//sin值
sin = Math.sin(Math.PI * 2 * i / 120);
//cos值
cos = Math.cos(Math.PI * 2 * i / 120);
//纬度= 中心点的纬度+半径*cos值*每米的纬度偏移量
lat = centerPoint.getY() + meter*cos* ONE_METER_OFFSET;
//经度= 中心点的经度+半径*sin值*每米的经度偏移量
lon = centerPoint.getX() + meter *sin* calcLongitudeOffset(lat);
Point p = new Point(lon,lat);
points.add(p);
}
Polygon polygon = new Polygon(); for (int i = 0; i < points.size(); i++) {
if (i==0) {
polygon.startPath(points.get(i));
}else{
polygon.lineTo(points.get(i));
}
} return polygon;
}
将上面的Polygon添加到GraphicsLayer中:
SimpleFillSymbol fillSymbol = new SimpleFillSymbol(Color.parseColor("#88ff0000"));
fillSymbol.setOutline(new SimpleLineSymbol(Color.TRANSPARENT, 0));
Graphic g = new Graphic(polygon, fillSymbol);
mLayer.addGraphic(g);
效果如下:
分别计算polygon的面积与长度:
double area = GeometryEngine.geodesicArea(polygon, SpatialReference.create(SpatialReference.WKID_WGS84), new AreaUnit(AreaUnit.Code.SQUARE_METER));
Log.e("huang", "area==="+area);
double length = GeometryEngine.geodesicLength(polygon, SpatialReference.create(SpatialReference.WKID_WGS84), new LinearUnit(LinearUnit.Code.METER));
Log.e("huang", "area==="+length);
结果值为与实际计算值有偏差,但偏差不是很大。
//面积:78128662.10079278
//长度:31343.779712156855
二、通过圆polygon来查询FeatureLayer在此范围内的要素
private void queryFeature(Geometry geometry) {
try {
QueryParameters args = new QueryParameters();
args.setReturnGeometry(true);// 是否返回Geometry
args.setGeometry(geometry); // 查询范围面
args.setInSpatialReference(SpatialReference
.create(SpatialReference.WKID_WGS84));
args.setSpatialRelationship(SpatialRelationship.WITHIN);
//获取查询结果result
Future<FeatureResult> result = featureLayer.getFeatureTable()
.queryFeatures(args, null);
} catch (Exception e) {
e.printStackTrace();
}
}
三、思考
其实FeatureLayer的getFeatureIDs(float x, float y, int tolerance)与
getFeatureIDs(float x, float y, int tolerance, int numberOfResults)、
GraphicsLayer中的getGraphicIDs(float x, float y, int tolerance)与
getGraphicIDs(float x, float y, int tolerance, int numberOfResults)
这几个查询方法也是通过范围去查询,只不过x,y是屏幕坐标,相当于中心坐标,而tolerance相当于半径,范围的大小由tolerance决定。那5dp的查找范围相当于多少范围呢?
可以获取当前地图的比例尺*查找半径获取到。
Android GIS开发系列-- 入门季(14)FeatureLayer之范围查询的更多相关文章
- Android GIS开发系列-- 入门季(5) FeatureLayer加载本地shp文件与要素查询
FeatureLayer是要素图层,也是Arcgis的主要图层.用这个图层可以加载本地的shp文件.下面我们看怎样加载shp文件到MapView中.查看ArcGis API可知FeatureLayer ...
- Android GIS开发系列-- 入门季(15) 网络图层加载
一.首先我们来看一个网络图层: http://services.arcgisonline.com/arcgis/rest/services/World_Street_Map/MapServer,这是全 ...
- Android GIS开发系列-- 入门季(1) 起点
前言 这个系列,待最终完成更新,大家体谅点,第一版本全部是参考的网络教程,最近会逐步的细化更新为可以直接使用的情况. 本系列的开发基于AS ( Android Studio ), 和ArcGIS 的 ...
- Android GIS开发系列-- 入门季(2) MapView与图层介绍
一.MapView MapView是Arcgis中的最基本的类,与高德地图SDK的MapView的重要性一样.MapView的创建有两种方法,一种是在Layout文件中直接写控件.一种是实例化,Map ...
- Android GIS开发系列-- 入门季(13)Gdal简单写个shp文件
Gdal是用来读写栅格与矢量数据的,在Gdal官网,可以下载相关的资源进行平台的编译.其实Arcgis底层也是用Gdal来读取shp文件的,那在Android中可以直接读写shp文件吗,是可以的.这里 ...
- Android GIS开发系列-- 入门季(12) 显示载天地图
在项目中可以经常需要动态加载一些图层,像投影地图服务.投影地图服务器.其实网上有大量这样的服务,比如天地图官网, . 随便点开一个服务,里面有相关的信息.那如何加载这样图层服务呢. 一.首先感谢这篇博 ...
- Android GIS开发系列-- 入门季(9) 定位当前的位置
利用MapView定位当前的位置 这里要用到Arcgis中的LocationDisplayManager这个类,由于比较简单.直接上代码: LocationDisplayManager locatio ...
- Android GIS开发系列-- 入门季(8) Json与Geometry的相互转换
在Android中json数据十分普遍,也很实用,在Arcgis中也同样支持Json数据,Json与Geometry可以相互转换,达到我们想要的数据. 一.Geometry转换成Json数据 这个实现 ...
- Android GIS开发系列-- 入门季(3) GraphicsLayer添加点、线、面
GraphicsLayer是图形图层,可以自定义图形添加到地图上.调用GraphicsLayer的addGraphic方法就能添加图形,此方法要一个Graphic对象,此对象的构造方法是Graphic ...
随机推荐
- IOS 面试题系列
随着iOS平台开发的职位的增加,笔试.面试也越来越有“套路”,这里我总结了一些面试题,多数是Objective-C的基础知识,适合于面试新人,答案是我自己答的,不准确的地方,欢迎指出. 1. Ob ...
- 基于ANGULAR.JS的下一代WEB应用开发-01-yeoman
Angularjs 个人认为这是一款很好的框架!它将我们从AJAX应用的开发中解救了出来!嗯....废话就说道这里下面我们开始把! 首先我们必须了解一些核心的概念: 客户端模版 MVC 数据绑定 依赖 ...
- 集成新版(5.17+)Activiti Modeler与Rest服务
声明: 此教程适合Activiti 5.17+版本. 本博客所涉及的内容均可在kft-activiti-demo中找到. 在线demo可以访问 http://demo.kafeitu.me:8080/ ...
- leetcode_865. Smallest Subtree with all the Deepest Nodes
https://leetcode.com/problems/smallest-subtree-with-all-the-deepest-nodes/ 给定一颗二叉树,输出包含所有最深叶子结点的最小子树 ...
- ansible配置mysql主从复制
配置主机1.下载安装所需安装包 [root@server1 ansible]# lsansible-2.7.8-1.el7.noarch.rpmansible-tower-setup-bundle-3 ...
- java将字段映射成另一个字段,关于 接口传参 字段不对应转换
在接口开发中我们经常会遇到一个问题,打个比方,我们的实体类A中有两个字段user和pwd但是接口中需要username和password这怎么办呢,我想到了两种方法:1.新创建一个实体类B或者new一 ...
- js 复制文字、 复制链接到粘贴板
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- JVM中常见的垃圾收集器
垃圾收集机制是 Java 的招牌能力,极大地提高了开发效率.如今,垃圾收集几乎成为现代语言的标配,即使经过如此长时间的发展, Java 的垃圾收集机制仍然在不断的演进中,不同大小的设备.不同特征的应用 ...
- vue全选和取消全选
代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- RabbitMQ 基础概念介绍
AMQP 消息模型 RabbitMQ 是基于 AMQP(高级消息队列协议)的一个开源实现,其内部实际也是 AMQP 的基本概念.