You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 19:27:41