Geotools基本增删改查Feature

发布时间 2023-04-23 22:13:17作者: 蚂蚁搬砖a

postgis依赖


<dependency>
    <groupId>org.geotools</groupId>
    <artifactId>gt-main</artifactId>
    <version>27.2</version>
</dependency>
<dependency>
    <groupId>org.geotools</groupId>
    <artifactId>gt-jdbc-postgis</artifactId>
    <version>27.2</version>
</dependency>

创建连接JDBCDataStore


Map<String, String> params = Map.of(
    PostgisNGDataStoreFactory.HOST.key, host,
    PostgisNGDataStoreFactory.PORT.key, port,
    PostgisNGDataStoreFactory.DATABASE.key, database,
    PostgisNGDataStoreFactory.SCHEMA.key, schema,
    PostgisNGDataStoreFactory.USER.key, user,
    PostgisNGDataStoreFactory.PASSWD.key, passwd,
    PostgisNGDataStoreFactory.DBTYPE.key, dbtype
);
JDBCDataStore jdbcDataStore = (JDBCDataStore)DataStoreFinder.getDataStore(params);

JDBCDataStore连接参数

Parameter Description
dbtype Must be the string postgis
host Machine name or IP address to connect to
port Port number to connect to, default 5432
schema The database schema to access
database The database to connect to
user User name
passwd Password
loose bbox Flag controlling loose bbox comparisons, default is true
preparedStatements Flag controlling whether prepared statements are used, default is false
encode functions Flag controlling if some common functions can be encoded into their SQL equivalent

连接池参数

Parameter Description
max connections Maximum number of connection the pool will hold at any time, default is 10
min connections Minimum number of connection the pool will hold at any time, default is 1
connection timeout Maximum number of second the pool will wait when trying to obtain a connection, default is 20 seconds
validate connections Flag controlling if the pool should validate connections when a new connection is obtained
Max open prepared statements Maximum number of prepared statements kept open and cached for each connection in the pool. Set to 0 to have unbounded caching, -1 to disable
Test while idle Periodically test if the connections are still valid also while idle in the pool
Time between evictor runs Number of seconds between idle object evictor runs. The default value is 300 seconds.
Min evictable time Number of seconds a connection needs to stay idle before the evictor starts to consider closing it
Evictor tests per run Number of connections checked by the idle connection evictor for each of its runs. The default value is 3 connections.

过滤器-Filter

使用过滤器来定义要对其进行操作的Feature集合。过滤器也可以组合成一个操作集合使用。
简单说,过滤器相当于SQL语句的WHERE子句中存在的信息。
Filter有多个子类,实现了许多类型的过滤器,包括简单的属性比较和空间查询。

// 普通字段
FilterFactory ff = CommonFactoryFinder.getFilterFactory();

/**
 * field 字段名
 * value 条件值
 * geometry 条件几何体
 * 
 * 
 * matchCase 是否区分大小写,默认true-区分
 * MatchAction(实现MultiValuedFilter的会有),匹配逻辑
 * MatchAction.ANY-任何一个满足,默认值
 * MatchAction.ALL-全部满足
 * MatchAction.ONE-只有一个满足
 * */

PropertyIsEqualTo equal = ff.equal(ff.property(field), ff.literal(value), true);//等于
PropertyIsLike like = ff.like(ff.property(field), "%keywords%");//模糊匹配
PropertyIsNotEqualTo notEqualTo = ff.notEqual(ff.property(field), ff.literal(value));//不等于
PropertyIsNull aNull = ff.isNull(ff.property(field));//null
PropertyIsGreaterThan greater = ff.greater(ff.property(field), ff.literal(value));// 大于
PropertyIsGreaterThanOrEqualTo greaterOrEqual = ff.greaterOrEqual(ff.property(field), ff.literal(value));// 大于等于
PropertyIsLessThan less = ff.less(ff.property(field), ff.literal(value));//小于
PropertyIsLessThanOrEqualTo lessOrEqual = ff.lessOrEqual(ff.property(field), ff.literal(value));//小于等于
PropertyIsBetween between = ff.between(ff.property(field), ff.literal(value), ff.literal(value));//在...之间
During during = ff.during(ff.property(field), ff.literal(value));//在时间期间
Before before = ff.before(ff.property(field), ff.literal(value));//在时间之前
After after = ff.after(ff.property(field), ff.literal(value));//在时间之后


// Geometry字段
FilterFactory2 ff2 = CommonFactoryFinder.getFilterFactory2();

Beyond beyond = ff2.beyond(ff2.property(featureSource.schema.geometryDescriptor.localName), ff2.literal(geometry), 100.0, Units.METRE.name);// 图层几何字段超出给定几何100米距离的
Contains contains = ff2.contains(ff2.property(featureSource.schema.geometryDescriptor.localName), ff2.literal(geometry));// 图层几何字段包含给定几何
Within within = ff2.within(ff2.property(featureSource.schema.geometryDescriptor.localName), ff2.literal(geometry));// 图层几何字段被给定几何包含
Intersects intersects = ff2.intersects(ff2.property(featureSource.schema.geometryDescriptor.localName), ff2.literal(geometry));// 图层几何字段与给定几何相交
Disjoint disjoint = ff2.disjoint(ff2.property(featureSource.schema.geometryDescriptor.localName), ff2.literal(geometry));// 图层几何字段与给定几何不相交
Touches touches = ff2.touches(ff2.property(featureSource.schema.geometryDescriptor.localName), ff2.literal(geometry));// 图层几何字段与给定几何相切


// filter集合的逻辑关系,and并,or或,not非
And and = ff.and(List.of(equal,like,beyond));//
Or or = ff.or(List.of(notEqualTo,greater,contains));
Not not = ff.not(during);

// Function的实现类具体实现函数,name-函数名,例如:min,strReplace,toWKT
Function function = ff.function(name,expr1,exprN);

PropertyName property = ff.property(field);
Literal v = ff.literal(value);
Function min = ff.function("min", property, v);


PropertyName property = ff.property(field);
Literal search = ff.literal("search");
Literal replace = ff.literal("replace");
Literal all = ff.literal( true );
Function replace = ff.function("strReplace", new Expression[]{property,search,replace,all});

PropertyName property = ff.property(featureSource.schema.geometryDescriptor.localName);
Function toWKT = ff.function("toWKT", property);

查询


/**
 * tableName 表名
 * filter 过滤器
 * List<String> propNames 字段名列表
 * 
 * startIndex 起始位
 * maxFeatures 最大条数
 * sortField 排序字段名
 * */
ContentFeatureSource featureSource = (ContentFeatureSource) jdbcDataStore.getFeatureSource(tableName);

//返回字段列
List<PropertyName> propertyNames = propNames.stream().map(ff::property).collect(Collectors.toList());
Query query = new Query(tableName,filter,propertyNames);
int count = featureSource.getCount(query);//计数
// 分页,倒序
query.setStartIndex(startIndex);
query.setMaxFeatures(maxFeatures);
query.setSortBy(new SortByImpl(ff.property(sortField), SortOrder.DESCENDING));

ContentFeatureCollection collection = featureSource.getFeatures(query);
SimpleFeatureIterator iterator = collection.features();
// SimpleFeatureIterator必须关闭,否则会造成内存泄漏
iterator.close();

新增

/**
* tableName 图层名
* fieldName1 字段名
* fieldValue1 字段值
**/

ContentFeatureSource featureSource = (ContentFeatureSource) jdbcDataStore.getFeatureSource(tableName);
SimpleFeatureStore store = (SimpleFeatureStore)featureSource;  // write access!
SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(store.getSchema());
featureBuilder.set(fieldName1,fieldValue1);
featureBuilder.set(fieldNameN,fieldValueN);
SimpleFeature feature = featureBuilder.buildFeature(null);
ListFeatureCollection featureCollection = new ListFeatureCollection(store.getSchema(), List.of(feature));
List<FeatureId> addFeatures = store.addFeatures(featureCollection);

删除

/**
*
* typeName 图层名
* fliter 过滤条件
*
*/
ContentFeatureSource featureSource = (ContentFeatureSource) jdbcDataStore.getFeatureSource(tableName);
SimpleFeatureStore store = (SimpleFeatureStore)featureSource;  // write access!
store.removeFeatures(filter);

修改

/**
* 
* typeName 图层名
* names 修改字段名数组
* values 修改值数组
* fliter 过滤条件
* names和values顺序保持一致
*/
ContentFeatureSource featureSource = (ContentFeatureSource) jdbcDataStore.getFeatureSource(tableName);
SimpleFeatureStore store = (SimpleFeatureStore)featureSource;  // write access!
store.modifyFeature(names, values, filter)