求GeoTools处理GeoPackage矢量多边形图层的完整运行示例
GeoTools处理GeoPackage矢量多边形图层的完整解决方案
错误原因说明
你使用的GeoPackageReader是GeoTools中处理栅格图层的类,而你需要处理矢量多边形,应该使用org.geotools.geopkg.GeoPackage类。另外报错的NoClassDefFoundError是因为缺少坐标参考系统相关的依赖库。
依赖配置
推荐用Maven管理依赖(NetBeans支持Maven项目),在pom.xml中添加以下依赖(以GeoTools 28.x为例,版本可按需调整):
<dependencies> <dependency> <groupId>org.geotools</groupId> <artifactId>gt-geopkg</artifactId> <version>28.2</version> </dependency> <dependency> <groupId>org.geotools</groupId> <artifactId>gt-referencing</artifactId> <version>28.2</version> </dependency> <dependency> <groupId>org.geotools</groupId> <artifactId>gt-shapefile</artifactId> <version>28.2</version> </dependency> <dependency> <groupId>org.geotools</groupId> <artifactId>gt-main</artifactId> <version>28.2</version> </dependency> <dependency> <groupId>javax.measure</groupId> <artifactId>unit-api</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>tec.units</groupId> <artifactId>unit-ri</artifactId> <version>1.0.3</version> </dependency> </dependencies> <repositories> <repository> <id>osgeo</id> <name>OSGeo Release Repository</name> <url>https://repo.osgeo.org/repository/release/</url> <snapshots><enabled>false</enabled></snapshots> <releases><enabled>true</enabled></releases> </repository> </repositories>
如果手动添加JAR包,需确保以上依赖对应的JAR都已加入项目库。
完整代码实现
import org.geotools.geopkg.GeoPackage; import org.geotools.geopkg.GeoPackageLayer; import org.geotools.data.simple.SimpleFeatureCollection; import org.geotools.data.simple.SimpleFeatureIterator; import org.geotools.geometry.jts.JTSFactoryFinder; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.GeometryFactory; import org.locationtech.jts.geom.Point; import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.type.AttributeDescriptor; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class GeoPackageVectorHandler { // 功能1:读取指定图层的所有属性行 public static void readLayerAttributes(String gpkgPath, String layerName) throws IOException { try (GeoPackage geoPackage = new GeoPackage(new File(gpkgPath))) { // 获取指定图层 GeoPackageLayer layer = geoPackage.getLayer(layerName); if (layer == null) { System.out.println("图层 " + layerName + " 不存在"); return; } // 验证是否为多边形图层 if (!layer.getGeometryType().getSimpleName().contains("Polygon")) { System.out.println("指定图层不是多边形图层"); return; } // 获取要素集合 SimpleFeatureCollection features = layer.getFeatureSource().getFeatures(); // 获取属性字段列表 List<AttributeDescriptor> attributes = features.getSchema().getAttributeDescriptors(); // 打印表头 StringBuilder header = new StringBuilder(); for (AttributeDescriptor attr : attributes) { header.append(attr.getLocalName()).append("\t"); } System.out.println(header.toString()); // 遍历所有要素,打印属性 try (SimpleFeatureIterator iterator = features.features()) { while (iterator.hasNext()) { SimpleFeature feature = iterator.next(); StringBuilder attrLine = new StringBuilder(); for (AttributeDescriptor attr : attributes) { Object value = feature.getAttribute(attr.getLocalName()); attrLine.append(value != null ? value.toString() : "null").append("\t"); } System.out.println(attrLine.toString()); } } } } // 功能2:根据坐标查询包含该点的多边形属性 public static List<SimpleFeature> queryPolygonByPoint(String gpkgPath, String layerName, double x, double y) throws IOException { List<SimpleFeature> resultFeatures = new ArrayList<>(); GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(); // 创建查询点(坐标需与图层空间参考一致) Point queryPoint = geometryFactory.createPoint(new Coordinate(x, y)); try (GeoPackage geoPackage = new GeoPackage(new File(gpkgPath))) { GeoPackageLayer layer = geoPackage.getLayer(layerName); if (layer == null) { System.out.println("图层 " + layerName + " 不存在"); return resultFeatures; } if (!layer.getGeometryType().getSimpleName().contains("Polygon")) { System.out.println("指定图层不是多边形图层"); return resultFeatures; } // 构建空间查询:多边形包含点 String filter = "CONTAINS(the_geom, " + queryPoint.toText() + ")"; SimpleFeatureCollection features = layer.getFeatureSource().getFeatures(filter); try (SimpleFeatureIterator iterator = features.features()) { while (iterator.hasNext()) { resultFeatures.add(iterator.next()); } } } return resultFeatures; } public static void main(String[] args) { String gpkgPath = "USJ_hranice_0.gpkg"; // 替换为你的GeoPackage文件路径 String layerName = "your_polygon_layer"; // 替换为你的多边形图层名称 // 测试功能1:读取属性表 try { System.out.println("=== 图层属性表 ==="); readLayerAttributes(gpkgPath, layerName); } catch (IOException e) { e.printStackTrace(); } // 测试功能2:查询包含指定点的多边形 try { // 替换为目标坐标(需与图层空间参考一致,比如WGS84经纬度) double x = 14.42; double y = 50.08; List<SimpleFeature> matchedFeatures = queryPolygonByPoint(gpkgPath, layerName, x, y); System.out.println("\n=== 包含点的多边形属性 ==="); for (SimpleFeature feature : matchedFeatures) { // 打印所有属性 feature.getProperties().forEach(p -> { System.out.println(p.getName().getLocalName() + ": " + p.getValue()); }); System.out.println("------------------------"); } } catch (IOException e) { e.printStackTrace(); } } }
注意事项
- 替换代码中的
gpkgPath、layerName、查询坐标为实际值 - 若GeoPackage文件是项目内资源,可使用
getClass().getResource("/USJ_hranice_0.gpkg").getFile()获取路径 - 查询点的坐标必须与图层的空间参考一致,否则查询结果会出错
内容的提问来源于stack exchange,提问作者locon
相关产品推荐
相关产品推荐

