GeoTools 工厂设计模式

前言

使用GeoTools开发时有必要了解其工厂设计模式,作为软件开发核心设计模式,其设计思想具有普遍性和研究性。明白方法原理有助于提高开发效率,达到事半功倍的效果。

1. 工厂模式

工厂模式(Factory Pattern)是面向对象中编程中最常用的设计模式之一,使用工厂不仅可以批量创建对象,而且创建对象的过程与使用对象的过程分离。有利于降低代码的耦合度。

GeoTools的设计也采用了工厂设计模式的思想,用于创建地理空间数据处理中的各种对象。使得其面对各种地理数据格式时,可以灵活拓展。

下面介绍以下GeoTools中常见的工厂模型,主要包括数据存储工厂、几何对象工厂以及坐标系工厂等。

2. 数据存储工厂

GeoTools 数据存储工厂非常丰富,主要包括数据库存储工厂和文件存储工厂两大类,基本都存储处 org.geotools.data目录下。

(1)DataStoreFactory可以用于连接各种数据源,如数据库和文件。

  • 连接数据库:
// 连接PostGIS数据库
Map<String, Object> pgParams = new HashMap<>();
pgParams.put(PostgisNGDataStoreFactory.DBTYPE.key, "postgis");
pgParams.put(PostgisNGDataStoreFactory.HOST.key, "localhost");
pgParams.put(PostgisNGDataStoreFactory.PORT.key, "5432");
pgParams.put(PostgisNGDataStoreFactory.DATABASE.key, "geodata");
pgParams.put(PostgisNGDataStoreFactory.USER.key, "postgres");
pgParams.put(PostgisNGDataStoreFactory.PASSWD.key, "123456");
pgParams.put(PostgisNGDataStoreFactory.SCHEMA.key, "public"); // 明确指定schema
pgParams.put(PostgisNGDataStoreFactory.EXPOSE_PK.key, true);  // 暴露主键// DataStoreFinder 自动发现对应工厂
DataStore pgDataStore = DataStoreFinder.getDataStore(pgParams);
  • 连接文件:
String provinceLocation = "E:\data\基础数据\行政区\省级行政区\省级行政区\省.shp";
File file = new File(provinceLocation);// 创建 Shapefile 存储器
Map<String, Object> params = new HashMap<>();
params.put("url", file.toURI().toURL());
params.put("charset", "UTF-8");// DataStoreFinder 自动发现对应工厂
DataStore dataStore = DataStoreFinder.getDataStore(params);

也可以用使用FileDataStore dataStore = FileDataStoreFinder.getDataStore(file);

(2)ShapefileDataStoreFactory用于创建Shapefile存储器。

// 创建 Shapefile 存储器
Map<String, Object> params = new HashMap<>();
params.put("url", file.toURI().toURL());
params.put("charset", "UTF-8");ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory();
ShapefileDataStore dataStore =  (ShapefileDataStore) dataStoreFactory.createDataStore(params);

(3)PostgisNGDataStoreFactory用于创建PostGIS空间数据库连接。

// 连接PostGIS数据库
Map<String, Object> pgParams = new HashMap<>();
pgParams.put(PostgisNGDataStoreFactory.DBTYPE.key, "postgis");
pgParams.put(PostgisNGDataStoreFactory.HOST.key, "localhost");
pgParams.put(PostgisNGDataStoreFactory.PORT.key, "5432");
pgParams.put(PostgisNGDataStoreFactory.DATABASE.key, "geodata");
pgParams.put(PostgisNGDataStoreFactory.USER.key, "postgres");
pgParams.put(PostgisNGDataStoreFactory.PASSWD.key, "123456");
pgParams.put(PostgisNGDataStoreFactory.SCHEMA.key, "public"); // 明确指定schema
pgParams.put(PostgisNGDataStoreFactory.EXPOSE_PK.key, true);  // 暴露主键// DataStoreFinder 自动发现对应工厂
DataStore pgDataStore = DataStoreFinder.getDataStore(pgParams);
if (pgDataStore == null) {PostgisNGDataStoreFactory factory = new PostgisNGDataStoreFactory();if (!factory.canProcess(params)) {System.err.println("数据库参数不满足工厂要求");}if (!factory.isAvailable()) {System.err.println("数据库工厂类不可用");}throw new RuntimeException("数据库连接失败,请检查?");
}

3. 几何对象工厂

GeometryFactory 用来为要素创建几何属性,如点、线、面对象。

GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(null);
// 构造点
Point point = geometryFactory.createPoint(new Coordinate(longitude,latitude));

4. 坐标系工厂

CRSFactory工厂用于创建坐标参考系统。

// 获取数据源坐标系统
CoordinateReferenceSystem crs = schema.getCoordinateReferenceSystem();// 获取地图坐标系统
CoordinateReferenceSystem mapCrs  = map.getCoordinateReferenceSystem();// 定义坐标系统
CoordinateReferenceSystem wgs84 = CRS.decode("EPSG:4326");

5. 样式工厂

StyleFactory工厂用于创建图层样式

StyleFactory style = CommonFactoryFinder.getStyleFactory();
// 创建红色填充
Fill fill = style.createFill(ff.literal(Color.RED));

6. 过滤器工厂

FilterFactory工厂用于创建数据过滤条件,通常用于空间查询

// 创建数据过滤器
FilterFactory factory = CommonFactoryFinder.getFilterFactory(null);
// 获取几何属性字段名称
String geometryPropertyName = featureSource.getSchema().getGeometryDescriptor().getLocalName();Filter filter = null;
switch (queryType.toLowerCase()) {case "intersects":filter = factory.intersects(factory.property(geometryPropertyName),factory.literal(geometry));break;case "contains":filter = factory.contains(factory.property(geometryPropertyName),factory.literal(geometry));break;case "disjoint":filter = factory.disjoint(factory.property(geometryPropertyName),factory.literal(geometry));break;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/89142.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/89142.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

npu-smi info命令参数解释

华为昇腾npu-smi显示npu-smi工具的帮助信息npu-smi -h字段说明-h命令的帮助信息–help命令的帮助信息-vnpu-smi版本信息info显示硬件详细信息set修改设备配置属性clear清除设备信息upgrade升级MCU固件 npu-smi info 用于监控和管理华为NPU的状态和性能字段值说明npu-smi24.1.rc…

OneCode3.0 通信架构简介——MCPServer微内核设计哲学与实现

在数字化转型加速的今天&#xff0c;低代码平台已成为企业快速交付应用的核心基础设施。然而&#xff0c;通用消息中间件与低代码开发范式之间存在难以调和的矛盾&#xff1a;标准化协议无法匹配可视化编排的动态性&#xff0c;通用架构难以满足低代码场景下高频短消息的性能需…

Android14 Launcher3 修改All App上下滑动头部显示阴影

正常情况下的样子&#xff1a; 下拉App抽屉后的样子&#xff1a;修改方案&#xff1a;qssi14/packages/apps/Launcher3/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.javaprotected void updateHeaderScroll(int scrolledOffset) {float prog1 Utilities…

Zookeeper入门安装与使用详解

文章目录一、简介二、下载安装1、安装jdk2、windows&#xff08;1&#xff09;下载&#xff08;2&#xff09;配置与启动一、简介 略。 二、下载安装 1、安装jdk 安装jdk8&#xff0c;高版本可能会有问题。 2、windows &#xff08;1&#xff09;下载 官网地址&#xff…

设计模式之适配器模式:让不兼容的接口协同工作的艺术

适配器模式&#xff1a;让不兼容的接口协同工作的艺术在软件开发中&#xff0c;我们经常会遇到系统整合的挑战——如何让新旧组件协同工作&#xff1f;适配器模式正是解决这类接口不兼容问题的利器&#xff0c;本文将深入探讨这一经典设计模式。1. 引言&#xff1a;接口不兼容的…

AI驱动的软件工程(中):文档驱动的编码与执行

&#x1f4da; 系列文章导航 AI驱动的软件工程&#xff08;上&#xff09;&#xff1a;人机协同的设计与建模 AI驱动的软件工程&#xff08;中&#xff09;&#xff1a;文档驱动的编码与执行 AI驱动的软件工程&#xff08;下&#xff09;&#xff1a;AI辅助的质检与交付 大家好…

HTML应用指南:利用GET请求获取河南省胖东来超市门店位置信息

胖东来作为中国知名的零售企业&#xff0c;自1995年成立以来&#xff0c;始终致力于为消费者提供丰富、新鲜的商品选择与优质的购物体验。经过近30年的稳步发展&#xff0c;目前已在河南省内的许昌、新乡等地共开设13家门店&#xff0c;涵盖大型综合百货商场、中型社区超市及服…

8.服务通信:Feign深度优化 - 解密声明式调用与现代负载均衡内核

让服务调用更优雅 在微服务架构中,服务间通信如同血液流动般重要。传统方式中,开发者需要手动拼接URL、处理负载均衡、管理连接池——这些重复性工作不仅效率低下,还容易出错。Spring Cloud OpenFeign 的诞生,正是为了解决这一核心痛点。它通过声明式接口将HTTP请求模板化…

Docker入门指南(超详细)

一、什么是docker 在云计算和微服务架构盛行的今天&#xff0c;Docker 作为容器技术的标杆&#xff0c;彻底改变了应用部署和运行的方式。简单来说&#xff0c;Docker 是一个开源的容器化平台&#xff0c;它通过将应用程序及其依赖环境打包成一个轻量级、可移植的容器&#xff…

学习秒杀系统-实现秒杀功能(商品列表,商品详情,基本秒杀功能实现,订单详情)

文章目录前言数据库设计秒杀商品列表页秒杀商品详情实现简单秒杀订单详情前言 由于慕课课程中是先实现最基本的功能然后对其压测&#xff0c;压测那个地方出问题&#xff0c;然后在对其优化。所以本文记录的也是实现的是简单的秒杀功能没有涉及到高并发的优化。 数据库设计 …

React 的常用钩子函数在Vue中是如何设计体现出来的。

1、定义响应式数据&#xff1a; React 通过 useState 和 useReducer Vue 通过 ref 和 reactiveconst [state, setState] useState(initialState)const [state, dispatch] useReducer(reducer, initialState)2、定义缓存数据&#xff1a; React 通过 memo 和 useMemo useCal…

开源的 H.264/AVC 视频编码器库-x264 的交叉编译 和 程序测试

一、环境准备 安装交叉编译工具链 根据目标ARM架构选择对应工具链&#xff08;如arm-linux-gnueabihf-&#xff09;&#xff1a;# Ubuntu/Debian系统 sudo apt-get install gcc-arm-linux-gnueabihf g-arm-linux-gnueabihf# 验证安装 arm-linux-gnueabihf-gcc --version或者手动…

自由学习记录(69)

RectToPolar() 是 将直角坐标系 (笛卡尔坐标系) 的 uv 坐标&#xff0c;转化为极坐标系&#xff08;θ&#xff0c;r&#xff09; uv - centerUV&#xff1a;将坐标原点平移&#xff0c;使 (0.5, 0.5) 变成原点。 r length(uv)&#xff1a;距离中心点的半径&#xff08;从中…

Spring Boot 敏感信息入库加密全面解决方案

Spring Boot 敏感信息入库加密全面解决方案 在当今数据驱动的时代,保护用户隐私数据已成为系统设计的必备要求。本文将详细介绍 Spring Boot 应用中敏感数据加密存储的完整方案,涵盖从基础实现到生产级落地的全流程。 一、加密方案选型 1.1 常见加密类型对比 加密类型特点…

docker0网卡没有ip一步解决

正常查看ip的时候一直显示没有ip这里先删除docker0网卡ip link delete docker0然后重启服务systemctl restart docker再次查看显示有ip了并且查看配置文件也是正常的cat /etc/docker/daemon.json {"registry-mirrors": ["https://docker.m.daocloud.io",&q…

MYSQL-索引篇

索引结构概述MySQL 的索引是在存储引擎层实现的&#xff0c;不同的存储引擎有不同的索引结构&#xff0c;主要包含以下几种&#xff1a;索引结构描述BTree索引最常见的索引类型&#xff0c;大部分引擎都支持 B 树索引Hash索引底层数据结构是用哈希表实现的&#xff0c;只有精确…

(纯新手教程)HTML零基础教学

&#xff08;下一章&#xff1a;python网络爬虫&#xff09;HTML 简介HTML&#xff08;HyperText Markup Language&#xff0c;超文本标记语言&#xff09;是用于创建网页的标准标记语言。什么是 HTML&#xff1f;HTML 不是编程语言&#xff0c;而是一种标记语言使用标签来描述…

前端面试宝典---项目难点2-智能问答对话框采用虚拟列表动态渲染可视区域元素(10万+条数据)

引言 在我参与智能问答项目中一个智能体回话并不会像豆包一样&#xff0c;每次新建会话都是是从头开始&#xff0c;而项目中你想创建新会话就像chatbox一样&#xff0c;是点击橡皮擦开启新的聊天上下文&#xff0c;但是直接的聊天记录依然存在&#xff0c;针对超过十万&#xf…

Python元组:不可变数据的强大用法

文章目录元组概念1.基本特性2.创建元组3.访问元素4.元组的不可变性5.元组操作6.元组解包7.命名元组8.元组与列表的比较9.元组的优势10.适用场景11.常用方法小结元组 概念 元组是 Python 中一个非常重要的内置数据结构&#xff0c;它与列表(list)相似但具有关键差异。下面我将…

若尔盖湿地的花湖

花湖位于若尔盖县和甘肃的郎木寺之间的213国道旁&#xff0c;属于若尔盖湿地国家级自然保护区内。又名“梅朵湖”&#xff0c;因阳光照射下湖面色彩斑斓如绚丽的花瓣得名。花湖的大门是梯形高大石柱搭成&#xff0c;我们需要过天桥到对面检票坐小交通。通过车窗看到一层一层的云…