meface/docs/article/gis/geotools/04FeatureQuery.md

2.8 KiB
Raw Blame History

title date author categories tags
GeoTools 要素查询 2023-12-22 ac
GIS
GeoTools

GeoTools 要素查询

1.简介

本文介绍用于查询DataStores数据存储(如shapefiles、数据库和Web Feature Servers)的Filter API

个人观点Java关于JDBC的一些概念,与GeoTools中的类的对应关系如下:

GeoTools JDBC
FeatureStore Connection 数据库连接
FeatureSource PreparedStatement Table
FeatureCollection ResultSet 结果集
AttributeDescriptor ResultSetMetaData 结果集元数据(属性列)
FeatureIterator

示例:

String shpPath = "D:\\demo\\tutorial\\data\\china\\330000.shp";
File shpFile = new File(shpPath);
ShapefileDataStore shapefileDataStore = new ShapefileDataStore(shpFile.toURI().toURL());

// 设置编码,防止属性的中文字符出现乱码
shapefileDataStore.setCharset(Charset.forName("UTF-8"));
// 获取文件名
String typeName = shapefileDataStore.getTypeNames()[0];
// 通过文件名在数据存储中找到对应的featuresourcetable
FeatureSource featuresource = shapefileDataStore.getFeatureSource(typeName);
// 属性查询
// Filter filter = CQL.toFilter("adcode = 330100");
// Filter filter = CQL.toFilter("name like '%州市%' and childrenNu >8");
// 空间查询
// CQL.toCQL()
Filter filter = CQL.toFilter("BBOX(the_geom, 118.77, 119.626, 28.908, 29.653)");
SimpleFeatureCollection features = (SimpleFeatureCollection)featuresource.getFeatures(filter);
int count = features.size();
System.out.println("查询结果数量:"+count);
// 获取当前矢量数据有哪些属性字段值
List<AttributeDescriptor> attributes = features.getSchema().getAttributeDescriptors();
// 拿到迭代器
SimpleFeatureIterator simpleFeatureIterator = features.features();
// 遍历每一个要素
while(simpleFeatureIterator.hasNext()) {
    SimpleFeature simpleFeature = simpleFeatureIterator.next();
    System.out.println("-----------分割线-------------");
    // java8新特性流api
    attributes.stream().forEach((a) -> {
        // 依次读取这个shape中每一个属性值当然这个属性值可以处理其它业务
        System.out.println(a.getLocalName() + ":" + simpleFeature.getAttribute(a.getLocalName()));
    });
}

从上述可以看到,不管是什么类型的数据源,访问的顺序是先通过FeatureStore连接数据源,然后从store中获取FeatureSource(类似于表),最后通过cql类来构建查询条件传入FeatureSourcegetFeatures方法中,可以得到满足条件的要素集FeatureCollection