安卓智能地图开发与实施二十五:Shapefile文件的可视化与编辑 - ArcGIS Runtime SDK for Android(Version 100.2.0)

0
分享 2018-04-04

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)索要。

文章来源:http://blog.csdn.net/allenlu2008/article/details/78863055

0 个评论

要回复文章请先登录注册