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 ...
随机推荐
- struts2 <allowed-methods > 标签配置
1.在struts2 2.5版本中添加了对方法访问的权限,如果没有被添加到<allow-method> 方法的标签,将会报一下错误 5:05:18.078 [http-apr-8020 ...
- PMP项目管理学习笔记(2)——组织、约束和干系人
(一)组织 这里所说的组织,就是我们所说的团队组织架构. 1.组织的类型 职能型: 在这种组织中,项目团队成员总是向职能经理报告,所有事务都有职能经理全权负责. 项目经理的决策需要与职能经理确认. 项 ...
- pil - pillow 的版本
pip install PIL python2版本 pip install pillow python3版本
- python 内置2to3工具将python2代码转换为python3代码
python2与python3代码不兼容,如果需要python2代码在python3环境下运行,需要将代码进行转换,本文介绍使用python3内置工具2to3.py对代码进行转换 一:2to3.py在 ...
- eclipse如何设置多个字符的智能提示
clipse代码里面的代码提示功能默认是关闭的,只有输入“.”的时候才会提示功能,用vs的用户可能不太习惯这种,vs是输入任何字母都会提示,下面说一下如何修改eclipse配置,开启代码自动提示功能打 ...
- js模拟输入支付密码
html <div class="content"> <!--<div class="title">支付宝支付密码:</di ...
- IIS部署SSL证书后提示不可信的解决方案
IIS部署SSL证书后提示不可信的解决方案 本帖最后由 wosign-support3 于 2015-7-17 17:18 编辑 第一步:打开mmc——点击文件——添加删除管理单元——证书——计算 ...
- python 2 encode and decode
https://docs.python.org/2/howto/unicode.html a Unicode string is a sequence of code points, which ar ...
- note for git
1.download https://git-for-windows.github.io/ 2.command add file to git: git add filename & git ...
- left_v2.js
$(document).ready(function(){ $(".mc_left a").each(function(){ var href = $(this).attr(&qu ...