安卓智能地图开发与实施二十五:Shapefile文件的可视化与编辑
来源:互联网 发布:浙江省儿童dna数据库 编辑:程序博客网 时间:2024/05/01 03:00
Shapefile文件的可视化与编辑
ArcGIS Runtime 100.2.0的正式发布带来个更多移动端的处理地图的能力,例如支持WMS图层、支持海图(ENC)图层,再如基于场景相机(Camera)的视域分析。同时还提供了新的统计查询API(总和,平均值,计数,最小值,最大值,标准差或方差)。而今天要描述的重点是ArcGIS Runtime 100.2.0对Shapefile数据格式的支持,当然ArcGIS Runtime 100.2.0还增加了对OGC GeoPackage格式的支持。
Shapefile文件的可视化
我们都知道Shapefile文件是Esri创造的开源空间数据格式,简单的介绍如下。
在安卓端加载Shapefile文件的关键是ShapefileFeatureTable(com.esri.arcgisruntime.data.ShapefileFeatureTable)。代码如下
private void showShapefile() { mainMapView = (MapView) findViewById(R.id.mapView); mainMapView.setAttributionTextVisible(false); mainArcGISMap = new ArcGISMap(new Basemap().createImageryWithLabelsVector()); mainMapView.setMap(mainArcGISMap); final ShapefileFeatureTable shapefileFeatureTable = new ShapefileFeatureTable( getResources().getString(R.string.shapefile_path) ); shapefileFeatureTable.loadAsync(); shapefileFeatureTable.addDoneLoadingListener(new Runnable() { @Override public void run() { GeometryType gt = shapefileFeatureTable.getGeometryType(); String name = shapefileFeatureTable.getTableName(); String name1 = name; mainShapefileLayer = new FeatureLayer(shapefileFeatureTable); if (mainShapefileLayer.getFullExtent() != null) { mainMapView.setViewpointGeometryAsync(mainShapefileLayer.getFullExtent()); } else { mainShapefileLayer.addDoneLoadingListener(new Runnable() { @Override public void run() { mainMapView.setViewpointGeometryAsync(mainShapefileLayer.getFullExtent()); } }); } mainArcGISMap.getOperationalLayers().add(mainShapefileLayer); startDrawing(); } }); SimpleLineSymbol lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.RED, 1.0f); SimpleFillSymbol fillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.YELLOW, lineSymbol); SimpleRenderer renderer = new SimpleRenderer(fillSymbol); //mainShapefileLayer.setRenderer(renderer);}
相比于.geodatabase文件,Shapefile文件的缺点在于只是单图层,且没有符号化,当然可以通过移动端的可视化API进行处理。
Shapefile文件的查询
ShapefileFeatureTable继承自FeatureTable,在ArcGISMap中也是通过FeatureLayer进行,数据查询也好,要素选择也好都可以通过FeatureLayer和FeatureTable实现。
mainMapView.setOnTouchListener( new DefaultMapViewOnTouchListener(this, mainMapView) { @Override public boolean onSingleTapConfirmed(MotionEvent e) { if(isSelect == true) { Point clickPoint = mMapView.screenToLocation(new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY()))); int tolerance = 1; double mapTolerance = tolerance * mMapView.getUnitsPerDensityIndependentPixel(); Envelope envelope = new Envelope(clickPoint.getX() - mapTolerance, clickPoint.getY() - mapTolerance, clickPoint.getX() + mapTolerance, clickPoint.getY() + mapTolerance, mMapView.getSpatialReference()); QueryParameters query = new QueryParameters(); query.setGeometry(envelope); query.setSpatialRelationship(QueryParameters.SpatialRelationship.WITHIN); final ListenableFuture<FeatureQueryResult> future = mainShapefileLayer.selectFeaturesAsync(query, FeatureLayer.SelectionMode.NEW); future.addDoneListener(new Runnable() { @Override public void run() { try { FeatureQueryResult result = future.get(); //mainShapefileLayer.getFeatureTable().deleteFeaturesAsync(result); Iterator<Feature> iterator = result.iterator(); Feature feature; int counter = 0; while (iterator.hasNext()){ feature = iterator.next(); counter++; } } catch (Exception e) { e.getCause(); } } }); } return super.onSingleTapConfirmed(e); } });
Shapefile文件的编辑
只要具备移动端文件的读写能力,便可以轻松的通过FeatureLayer的相关方法进行空间数据的编辑(添加、修改、删除)。
添加操作如下:
if (mainSketchEditor.getGeometry() != null) { java.util.Map<String, Object> attributes = new HashMap<String, Object>(); attributes.put("NAME", "自己画的省份"); Feature addedFeature = mainShapefileLayer.getFeatureTable() .createFeature(attributes, (Polygon) mainSketchEditor.getGeometry()); final ListenableFuture<Void> addFeatureFuture = mainShapefileLayer.getFeatureTable().addFeatureAsync( addedFeature ); mainSketchEditor.stop();}
删除操作如下:
final ListenableFuture<FeatureQueryResult> selectResult = mainShapefileLayer.getSelectedFeaturesAsync();selectResult.addDoneListener(new Runnable() { @Override public void run() { try { mainShapefileLayer.getFeatureTable().deleteFeaturesAsync(selectResult.get()); } catch (Exception e) { e.getCause(); } }});
编辑后的结果验证 – ArcMap中查看结果:
结尾
源程序请自行下载:
链接:https://pan.baidu.com/s/1nuYHjvj 密码:kv66
若失效,可发邮件给韩源萌(polyline@126.com)索要。
- 安卓智能地图开发与实施二十五:Shapefile文件的可视化与编辑
- 安卓智能地图开发与实施二十三:三维场景中的可视化
- 安卓智能地图开发与实施十五:离线与同步
- 安卓智能地图开发与实施二十四:关于源代码的放送
- 安卓智能地图开发与实施十六:三维地图
- 安卓智能地图开发与实施十四:业务数据编辑
- 安卓智能地图开发与实施四:二维地图的MapView与Layers
- 安卓智能地图开发与实施二:开发环境准备
- 安卓智能地图开发与实施二十:栅格图层展示
- 安卓智能地图开发与实施二十一:栅格渲染器
- 安卓智能地图开发与实施二十二:展示三维场景
- 安卓智能地图开发与实施九:地图缩放与旋转
- 安卓智能地图开发与实施三:创建第一个地图程序
- 安卓智能地图开发与实施十二:空间查询与模糊搜索
- 安卓智能地图开发与实施十三:空间查询与展示
- 安卓智能地图开发与实施十九:符号与渲染器
- 安卓智能地图开发与实施一:配置离线SDK
- 安卓智能地图开发与实施五:在线基础底图
- vmware workstation 创建共享磁盘组
- 解决python相对导入出现错误:Attempted relative import beyond toplevel package
- 本机安装maven以及eclipse中配置maven
- 史上最简单的SpringCloud教程 | 第五篇: 路由网关(zuul)
- SQL数据分析概览——Hive、Impala、Spark SQL、Drill、HAWQ 以及Presto+druid
- 安卓智能地图开发与实施二十五:Shapefile文件的可视化与编辑
- 封装导航栏及返回,获取控件所在控制器 iOS
- 【转载】清华人都如此努力,那我们呢?
- Android系统权限
- elasticsearch 查询语法
- JavaScript 对象的属性类型
- Oracle 13c OEM 安装测试(13.2.0.0)
- IntelliJ IDEA2017.3 激活
- MongoDB和MySQL的区别