Geotools基本增删改查Feature

这篇具有很好参考价值的文章主要介绍了Geotools基本增删改查Feature。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

通过Geotools实现对Feature的增删改查

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连接参数

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.

创建连接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);

WFS

<dependency>
   <groupId>org.geotools</groupId>
   <artifactId>gt-wfs-ng</artifactId>
   <version>${geotools.version}</version>
 </dependency>

WFSDataStore连接参数

Parameter Required Description
WFSDataStoreFactory:GET_CAPABILITIES_URL True GetCapabilities路径, WFS 1.0 (read/write) and WFS 1.1 (read-only).
WFSDataStoreFactory:PROTOCOL False Http请求方式,True-Post, False-GET, null-auto
WFSDataStoreFactory:USERNAME False 用户名
WFSDataStoreFactory:PASSWORD False 密码
WFSDataStoreFactory:ENCODING False 默认UTF-8
WFSDataStoreFactory:TIMEOUT False 默认3000ms
WFSDataStoreFactory:BUFFER_SIZE False 一次读取features的大小, 默认10,WFS 1.0
WFSDataStoreFactory:TRY_GZIP False 是否接受GZip,默认true
WFSDataStoreFactory:LENIENT False
WFSDataStoreFactory:MAXFEATURES False features条数限制,默认0-不限制
WFSDataStoreFactory:WFS_STRATEGY False arcgis,cuberx,geoserver,ionic,mapserver,nonstrict,strict,默认auto
WFSDataStoreFactory:FILTER_COMPLIANCE False WFS规范等级 (0-low,1-medium,2-high)

创建WFSDataStore示例

// 1.0.0版本使用GML-2,可以正确读出Feature中name字段,其他版本不可以
String getCapabilities = "http://localhost:8080/geoserver/wfs?REQUEST=GetCapabilities&version=1.0.0";

Map<String,String> connectionParameters = new HashMap<>();
connectionParameters.put("WFSDataStoreFactory:GET_CAPABILITIES_URL", getCapabilities );

DataStore data = DataStoreFinder.getDataStore(connectionParameters);

过滤器-Filter

使用过滤器来定义要对其进行操作的Feature集合。过滤器也可以组合成一个操作集合使用。
简单说,过滤器相当于SQL语句的WHERE子句中存在的信息。
Filter有多个子类,实现了许多类型的过滤器,包括简单的属性比较和空间查询。文章来源地址https://www.toymoban.com/news/detail-422960.html

// 普通字段
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的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 用vue实现列表的增删改查基本功能(简单易懂)

    目录 文章目录 前言 一、安装vue 二、使用vue 三、相关代码 四、效果图如下 随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 vue开发文档参考

    2024年02月11日
    浏览(40)
  • 简单的vue+element-ui纯前端实现基本增删改查功能

    建立一个vue2的项目: 打开控制台,输入命令:vue create xxx(项目名称,记得要小写哈),并回车,记得选择vue2  用vscode打开项目,并 引入相关的依赖 打开项目 终端,输入命令 npm i element-ui -S npm install less-loader@5.0.0 --save  npm install less --save 点击进入main.js,引入elementui ,加上下面

    2024年02月06日
    浏览(53)
  • 【数据结构与算法】1、学习动态数组数据结构(基本模拟实现 Java 的 ArrayList 实现增删改查)

    🍃 数据结构是 计算机 存储 、 组织 数据的方式 🎉 线性 结构 线性表(数组、链表、栈、队列、哈希表) 🎉 树形 结构 二叉树 AVL 树 红黑树 B 树 堆 Trie 哈夫曼树 并查集 🎉 图形 结构 邻接矩阵 邻接表 🎁 线性表是具有 n 个 相同类型元素 的有限 序列 (n = 0) a1 是首节点

    2024年02月10日
    浏览(75)
  • MyBatis的基本入门及Idea搭建MyBatis坏境且如何一步骤实现增删改查(CRUD)---详细介绍

       首先是一个 开源的Java持久化框架 ,它可以帮助开发人员简化数据库访问的过程并提供了一种将SQL语句与Java代码进行解耦的方式,使得开发人员可以更加灵活地进行数据库操作。 MyBatis不仅是开源框架,也给我们带来了许多好处的点,如下: 1.1.1简化数据库操作    MyBa

    2024年02月12日
    浏览(40)
  • Java+GeoTools实现WKT数据根据EPSG编码进行坐标系转换

    Java+GeoTools(开源的Java GIS工具包)快速入门-实现读取shp文件并显示: Java+GeoTools(开源的Java GIS工具包)快速入门-实现读取shp文件并显示_霸道流氓气质的博客-CSDN博客 在上面实现Java中集成Geotools之后,需求是将WKT数据转换成其他坐标系的WKT。 比如说将EPSG:4524的坐标系转换成EPSG:2

    2023年04月25日
    浏览(36)
  • Java:计算地球上两个经纬度坐标之间的距离-geodesy和geotools实现

    两个点的经纬度 latitude纬度 longitude经度 地点 22.678611 113.805695 深圳同泰万怡酒店 22.716473 113.826391 深圳宝安中天美景华美达酒店 各种计算方式 计算方式 距离 Elasticsearch:7.12.1 4715.088099751495 自定义公式计算 4720.367727793572 org.gavaghan/geodesy 4715.085736444097 org.geotools/gt-referencing 4701.260

    2024年02月02日
    浏览(66)
  • Java+GeoTools(开源的Java GIS工具包)快速入门-实现读取shp文件并显示

    GeoTools 是一个开源的 Java GIS 工具包,可利用它来开发符合标准的地理信息系统。 GeoTools 提供了 OGC (Open Geospatial Consortium) 规范的一个实现来作为他们的开发。 官网地址: GeoTools The Open Source Java GIS Toolkit — GeoTools 参考其quick start教程,实现集成到maven项目中并运行示例代码。

    2024年02月08日
    浏览(66)
  • WebSocket简述及通过node.js的基本实现

    WebSocket是自Html5开始在单个TCP连接上进行全双工通信 1 的协议,它使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

    2024年02月09日
    浏览(37)
  • Layui基本功能(增删改查)

    话不多说,根据我前面的博客我们直接进行操作。 记住以下的文件放置,防止操作出不来.  这是我们要完成的界面及功能   数据查看 我们在userDao方法里面进行增删改查的方法 我们在userAction进行方法的编写 R工具类的介绍 userDao方法 因为我们的数据库的rid需要转成权限名,

    2024年02月16日
    浏览(37)
  • 通过postgresql的Ltree字段类型实现目录结构的基本操作

    将这种具有目录结构的excel表存储到数据库中,可以采用树型结构存储 上面是建一张表,并且插入一条根节点。这里我们的id是mybatisPuls提供的UUID,并且我们的path字段采用祖id+爷id+父id+子id的结构。这是处理excel表格的工具类 下面是将生成的ListMapString, String excel数据插入到e

    2024年02月12日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包