本地图层加载
本地图层加载这里以geodatabase为例,geodatabase文件可以通过Arcgis10.2.2及之后版本的软件生成,生成方法百度上一大把,这里不多赘述。
下面进入正题,首先需要将geodatabase文件释放到本地,这里需要说明,释放文件时可以选择释放到SD卡或是内置存储卡,区别在于SD卡中数据其他应用也可访问,而内置存储中的数据在手机未Root情况下仅当前应用可访问。
释放函数如下:
private class RelaseDateTask extends AsyncTask<Void, String, Boolean> {
@Override
protected Boolean doInBackground(Void... voids) {
try {
relaseDate(String.valueOf(getFilesDir())+"/WaterClub1.geodatabase");
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
private void relaseDate(String strOutFileName) throws IOException {
InputStream myInput;
OutputStream myOutput = new FileOutputStream(strOutFileName);
myInput = getAssets().open("WaterClub1.geodatabase");
byte[] buffer = new byte[1024];
int length = myInput.read(buffer);
while(length > 0)
{
myOutput.write(buffer, 0, length);
length = myInput.read(buffer);
}
myOutput.flush();
myInput.close();
myOutput.close();
}
这里我们将文件释放到内置存储中,文件名叫WaterClub1.geodatabase
,Okay,接下来我们来加载它,代码如下:
private void loadLocalLayer(String geodatabasePath){
final Geodatabase geodatabase = new Geodatabase(geodatabasePath);
geodatabase.loadAsync();
// 当geodatabase读取成功后将geodatabase加载到数据库
geodatabase.addDoneLoadingListener(() -> {
if (geodatabase.getLoadStatus() == LoadStatus.LOADED) {
List<GeodatabaseFeatureTable> geodatabaseFeatureTables = geodatabase.getGeodatabaseFeatureTables();
for (int i=geodatabaseFeatureTables.size()-1;i>=0;i--){
GeodatabaseFeatureTable geodatabaseFeatureTable = geodatabaseFeatureTables.get(i);
geodatabaseFeatureTable.loadAsync();
//创建要素图层
final FeatureLayer featureLayer = new FeatureLayer(geodatabaseFeatureTable);
// 添加到地图
mMapView.getMap().getOperationalLayers().add(featureLayer);
}
} else {
Toast.makeText(LocalDatabaseActivity.this, "Geodatabase failed to load!", Toast.LENGTH_LONG).show();
Log.e("Tag","Geodatabase failed to load!");
}
});
}
接着在onCreate()中调用此函数即可
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_local_database);
mMapView = findViewById(R.id.local_mapview);
new TianDiTuActivity().addTDT(mMapView); //添加天地图底图,函数最好单独封装到一个类中,这里为了演示方便就直接复用了
Point centralPoint = new Point(116.384216, 39.991298);
mMapView.setViewpointCenterAsync(centralPoint, 3140f); //设置地图中心点
loadLocalLayer(String.valueOf(getFilesDir())+"/WaterClub1.geodatabase"); //加载本地图层
mMapView.setAttributionTextVisible(false); //隐藏Esri logo
}
效果图:
上面这种方式是一次性将数据库中所有图层都加载出来,当我们需要单独控制每个图层的显隐性时,就需要对每个图层单独实例化,代码如下:
private void loadSingleLayer(String geodatabasePath){
final Geodatabase geodatabase = new Geodatabase(geodatabasePath);
// 异步加载geodatabase
geodatabase.loadAsync();
// 当geodatabase读取成功后将geodatabase加载到数据库
geodatabase.addDoneLoadingListener(() -> {
if (geodatabase.getLoadStatus() == LoadStatus.LOADED) {
//获取数据库中你需要的图层对应的属性表
GeodatabaseFeatureTable WCboundTable = geodatabase.getGeodatabaseFeatureTable("WCbound"); //注意这里的参数一定要和数据库中表名完全一致,区分大小写
GeodatabaseFeatureTable WCPolygonTable = geodatabase.getGeodatabaseFeatureTable("WCPolygon");
GeodatabaseFeatureTable WCliftTable = geodatabase.getGeodatabaseFeatureTable("WClift"); //WClift
//通过属性表实例化图层
WCboundLayer = new FeatureLayer(WCboundTable);
WCPolygonLayer = new FeatureLayer(WCPolygonTable);
WCliftLayer = new FeatureLayer(WCliftTable);
//添加图层
mMapView.getMap().getOperationalLayers().add(WCboundLayer);
mMapView.getMap().getOperationalLayers().add(WCPolygonLayer);
mMapView.getMap().getOperationalLayers().add(WCliftLayer);
//设置图层可见性
WCboundLayer.setVisible(false);
} else {
Toast.makeText(IndoorMapActivity.this, "Geodatabase failed to load!", Toast.LENGTH_LONG).show();
Logger.e("Geodatabase failed to load!");
}
});
}