安卓智能地图开发与实施二十五: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)索要。

阅读全文
0 0
原创粉丝点击