Geopackage-java库¶
创建和读取GeoPackage有多种不同的方法。大多数实现软件产品都有自己独特的方式来支持GeoPackage的处理。在本章中,我们将介绍如何使用免费的开源GeoPackage Java库读取GeoPackage here 。这个库被设计成紧密抽象GeoPackage的表。该库为GeoPackage中的每个核心表提供一个数据访问对象(DAO)。
可以从DAO实例访问特性和分片,并对其进行查询以提取元数据或特性属性。下面的代码块显示了一个程序的注释示例,该程序读取两个独立的GeoPackage,一个包含矢量特征,另一个包含图像块。源代码改编自 GeoPackage Java library website。注意,该示例使用states10.gpkg和蓝大理石.gpkg示例文件。这两个文件都可以从 here。
package org.opengeospatial.GeoPackageDemo;
import java.io.File;
import java.util.List;
import mil.nga.geopackage.GeoPackage;
import mil.nga.geopackage.core.contents.ContentsDao;
import mil.nga.geopackage.core.srs.SpatialReferenceSystemDao;
import mil.nga.geopackage.extension.ExtensionsDao;
import mil.nga.geopackage.features.columns.GeometryColumnsDao;
import mil.nga.geopackage.features.user.FeatureDao;
import mil.nga.geopackage.features.user.FeatureResultSet;
import mil.nga.geopackage.features.user.FeatureRow;
import mil.nga.geopackage.geom.GeoPackageGeometryData;
import mil.nga.geopackage.io.GeoPackageTextOutput;
import mil.nga.geopackage.manager.GeoPackageManager;
import mil.nga.geopackage.metadata.MetadataDao;
import mil.nga.geopackage.metadata.reference.MetadataReferenceDao;
import mil.nga.geopackage.schema.columns.DataColumnsDao;
import mil.nga.geopackage.schema.constraints.DataColumnConstraintsDao;
import mil.nga.geopackage.tiles.matrix.TileMatrixDao;
import mil.nga.geopackage.tiles.matrixset.TileMatrixSetDao;
import mil.nga.geopackage.tiles.user.TileDao;
import mil.nga.geopackage.tiles.user.TileResultSet;
import mil.nga.geopackage.tiles.user.TileRow;
import mil.nga.wkb.geom.Geometry;
/**
* GeoPackage demonstration
*
*/
public class App {
/**
* This method reads a GeoPackage file and prints out the contents to the console
*/
public void read(File geopackageFile) {
// Open a GeoPackage and create an handle to it
GeoPackage geoPackage = GeoPackageManager.open(geopackageFile);
// Create DAO instances of GeoPackage tables
SpatialReferenceSystemDao srsDao = geoPackage.getSpatialReferenceSystemDao(); //accesses gpkg_spatial_ref_sys
ContentsDao contentsDao = geoPackage.getContentsDao(); //accesses gpkg_contents
GeometryColumnsDao geomColumnsDao = geoPackage.getGeometryColumnsDao(); //accesses gpkg_geometry_columns
TileMatrixSetDao tileMatrixSetDao = geoPackage.getTileMatrixSetDao(); //accesses gpkg_tile_matrix_set
TileMatrixDao tileMatrixDao = geoPackage.getTileMatrixDao(); //accesses gpkg_tile_matrix
DataColumnsDao dataColumnsDao = geoPackage.getDataColumnsDao(); //accesses gpkg_data_columns
DataColumnConstraintsDao dataColumnConstraintsDao = geoPackage.getDataColumnConstraintsDao(); //accesses gpkg_data_columns_constraints
MetadataDao metadataDao = geoPackage.getMetadataDao(); //accesses gpkg_metadata
MetadataReferenceDao metadataReferenceDao = geoPackage.getMetadataReferenceDao(); //accesses gpkg_metadata_reference
ExtensionsDao extensionsDao = geoPackage.getExtensionsDao(); //accesses gpkg_extensions
// Feature and tile tables
List<String> features = geoPackage.getFeatureTables();
List<String> tiles = geoPackage.getTileTables();
// If there are any features print their properties (as represented by column names and values)
if (features.size() > 0) {
FeatureDao featureDao = geoPackage.getFeatureDao(features.get(0));
FeatureResultSet featureResultSet = featureDao.queryForAll();
try {
while (featureResultSet.moveToNext()) {
FeatureRow featureRow = featureResultSet.getRow();
String[] columnNames = featureRow.getColumnNames();
for(String columnName: columnNames)
{
if(featureRow.getColumn(columnName).isGeometry())
System.out.println(featureRow.getGeometry().toString());
else
System.out.println(featureRow.getColumn(columnName).getName()+"="+featureRow.getValue(columnName));
}
}
} finally {
featureResultSet.close();
}
}
// If there are any tiles in the GeoPackage, then print out information about the tile tables
if (tiles.size() > 0) {
TileDao tileDao = geoPackage.getTileDao(tiles.get(0));
TileResultSet tileResultSet = tileDao.queryForAll();
//Now print out descriptions of the tiles
StringBuilder output = new StringBuilder();
GeoPackageTextOutput textOutput = new GeoPackageTextOutput(
geoPackage);
output.append("\n\n");
output.append(textOutput.header());
output.append("\n\n");
output.append(textOutput.tileTable(geoPackage.getTileTables().get(0)));
System.out.println(output);
}
// Close the database when done
System.out.println("Done!");
geoPackage.close();
}
/*
* This is the main method. It creates an array of two GeoPackage files, one consisting of vector feature data and another consisting of imagery tile data.
*/
public static void main(String[] args) {
//Create an array of two GeoPackage files.
File[] existingGeoPackages = new File[2];
existingGeoPackages[0] = new File("/Users/Shared/states10.gpkg");
existingGeoPackages[1] = new File("/Users/Shared/bluemarble.gpkg");
//Pass each of the files in the array to the read() method for reading
App app = new App();
for(File existingGeoPackage: existingGeoPackages){
app.read(existingGeoPackage);
}
}
}
当程序运行时,它打印出特征和分片数据集,包括特征属性和分片矩阵描述。
要运行此程序,请创建一个Maven项目并将以下依赖项添加到Maven项目的配置文件中。这将允许从Maven中央存储库中提取库依赖项。可以找到创建Maven项目的快速入门指南 here。
<dependency>
<groupId>mil.nga.geopackage</groupId>
<artifactId>geopackage</artifactId>
<version>1.3.1</version>
</dependency>