首页 > 其他分享 >Geotools基本增删改查Feature

Geotools基本增删改查Feature

时间:2023-04-23 22:26:00浏览次数:37  
标签:Geotools 改查 Feature value ff2 literal ff property featureSource

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)

标签:Geotools,改查,Feature,value,ff2,literal,ff,property,featureSource
From: https://www.cnblogs.com/walkAlwaysInCode/p/17347714.html

相关文章

  • elasticsearch——增删改查
    --创建索引PUT/icon_index{"settings":{"analysis":{"analyzer":{"text_anlyzer":{"tokenizer":"ik_max_word","filter":"py"......
  • sklearn模块中的preprocessing、model_selection、feature_selection
    sklearn模块中的preprocessing、model_selection、feature_selection1.preprocessing1.1.LabelEncoder()可以给标签分配一个可数的连续编号fromsklearn.preprocessingimportLabelEncoderlabel=LabelEncoder()label.fit(['grade1','grade3','grade1......
  • 洪君:mybatis plus012:增删改查 洪君
    plus的pom依赖:替代原mybatis<!--mybatisplus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus</artifactId><version>2.1.9</version></d......
  • 猛读论文6 |【CVPR 2022】Camera-Conditioned Stable Feature Generation for Isolate
    用于孤立摄像机监督行人重识别的摄像机条件稳定特征生成动机常规ReID,对于一个ID,在不同摄像头拍摄的图片上提取跨相机视图不变特征而ISCS情况下,无法做到同一个ID采集到不同摄像头图片由于跨相机样本在人体Re-ID模型训练中起着重要作用,而在ISCS设置下不存在此类配对图像,因......
  • C#写一套最全的SQL server帮助类(包括增删改查)
    我定义了一系列静态方法,用于执行SQLServer数据库的增删改查等操作。其中:ExecuteNonQuery方法用于执行指定的SQL语句并返回受影响的行数;ExecuteScalar方法用于执行指定的SQL语句并返回查询结果的第一行第一列;ExecuteDataTable方法用于执行指定的SQL语句并返回一个数据表;ExecuteRea......
  • C#写一套最全的MySQL帮助类(包括增删改查)
    介绍说明:这个帮助类包含了六个主要的方法:ExecuteNonQuery、ExecuteScalar、ExecuteQuery、ExecuteQuery(泛型)、Insert、Update和Delete。其中,ExecuteNonQuery用于执行不返回结果集的SQL语句;ExecuteScalar用于执行一个查询,并返回结果集中第一行的第一列;ExecuteQuery用于执行一个查询......
  • 针对一套增删改查涉及到流程的解决方案(干货)
    1.第一步流程节点要确保是活的,可以在数据库里面的配置字典表里面去写记录,到时候查这张表的对应的是哪个节点即可,如果没有配置字典表的话,也可以去建一个流程节点表这样的好处是方便以后的扩展性,可以随时增加新的流程节点,以及流程。可以采用-去拼接例:1-2-3-4-5代表这个流程完整走......
  • SQL增删改查
    SQL语句SQL 是结构化查询语言,专门用来访问和处理数据库的编程语言。能够以编程的形式操作数据库里的数据。SQL 是一门数据库编程语言使用SQL 语言编写出来的代码叫做 SQL 语句SQL 语言只能在关系型数据库(MySQL)中使用。非关系型数据库(MongoDB)中不能使用SQL 可以对数......
  • java 增删改查接口命名规范(service与mapper)
    阿里推荐命名规范:转载自:https://www.cnblogs.com/zengzy698/p/15939088.html......
  • mysql增删改查
    1、增insertintotable_name()value();insertintotable_name()values(),(),();insertintotable_namevalue();增加数据,通过关键字insert进行如果是在一行中插入部分字段数据,必须在value之前声明插入字段,而value后的值按声明字段顺序排列。如果插入全部字段,可......