目录
前言
作为使用Java语言开发的地理信息实现,GeoTools已经是一个家喻户晓的一个框架。在很多的应用系统中进行运用。在之前的博客中虽然对GeoTools的相关知识进行了简单的介绍,作为一个使用Java进行WebGIS开发的技术人员,很有必要对GeoTools的知识进行深入的学习。本文是GeoTools基础学习的一部分之一。
本文将重点介绍GeoTools的技术框架,对GeoTools的相关依赖与功能jar的叙述进行讲解。文章从GeoTools的插件、扩展、XML支持、非GeoTools的官方扩展这几个方面来进行讲解。通过本文的内容,您可以对GeoTools的架构更进一步的熟悉,同时对GeoTools的主要模块更加了解。
一、GeoTools架构说明
Having an understanding of how the GeoTools library is structured is helpful for sorting out what jars you need to include with your application.
This page introduces you to the modules of the GeoTools library and how they fit together. By including only the jars you need you can select just the right amount of GeoTools for your next project.
目的:通过了解包含在应用程序中的jar,从而对GeoTools库有更进一步的结构了解。在这里首先介绍GeoTools库的模块以及它们是如何组合在一起的。通过只包含您需要的jar包,您可以为下一个项目选择适量的GeoTools。
1、GeoTools Library
GeoTools库是一个丰富的软件资源库,每个模块都建立在前一个模块中定义的思想和概念之上。通过丰富的组件来构成功能强大的Geotools生态。下面就来介绍一下GeoTools的模块架构。下图是GeoTools的模块架构图:
Geotools 模块架构图
GeoTools的每一层都建立在它下面的层之上,采用的是多模块构建的开发模式:比如要使用引用的资源包,您需要ggt-api, gt-metadata 和gt-referencing。要使用“EPSG”代码,您需要一个插件,如gt-EPSG-hsql,为引用模块提供EPSG定义。或者您要使用Coverage,您需要ggt-api, gt-metadata 和gt-referencing(使用插件gt epsg-hsql)、gt-main和gt-covage。要充分利用Coverage模块,可以使用gt geotiff等插件访问geotiff文件。通过丰富的插件库,向上构建多样的实现层应用。从而让我们实现更丰富的功能和应用。
2、各模块说明
maven工具可以管理和维护您需要的jar,下面将对GeoTools中的各个实现模块与maven的jar资源对应关系进行一个简单的说明。
序号 | 模块 | 作用 | 说明 |
1 | gt-render | Map API, with Java2D rendering engine for mapping. | 地图API,使用Java2D的渲染引擎 |
2 | gt-jdbc | Implements for accessing spatial database | 操作空间数据库的实现 |
3 | gt-xml | Implements of common spatial XML formats | 空间xml格式的实现 |
4 | gt-cql | Implements of Common Query Language for filters | 通用查询语言的实现 |
5 | gt-coverage | Implementation for accessing raster information | 访问读取栅格数据的实现 |
6 | gt-main | Data API, with default implementations of filter, feature, etc… | 数据操作API,默认的过滤器实现 |
7 | gt-referencing | Implementation of co-ordinate location and transformation | 坐标定位和转换的实现 |
8 | gt-metadata | Implementation of identification and description | 定义和管理元数据的实现 |
9 | gt-api | Definition of interfaces for common spatial concepts | |
10 | jts | JTS Topology Suite (external library) implementing Geometry | JTS拓扑套件(外部库) |
3、GeoTools插件
在GeoTools中又根据不同的模块进行了插件的扩展。以gt-jdbc为例,众所周知,常见的数据库种类有很多种,包括DB2、MySQL、Oracle、PostgreSQL、SqlServer等等。因此在面向数据库的支持上,GeoTools又根据不同的数据类型进行了支持。类似与Jdbc的驱动一样,根据数据库类型的不同扩展了不同的gt-jdbc,下面是具体的插件与扩展列表详情:
序号 | jar | 说明 |
1 | gt-jdbc-db2 | Geometry in DB2,DB2 数据库支持 |
2 | gt-jdbc-h2 | Pure Java “H2” database,H2内存数据库支持 |
3 | gt-jdbc-mysql | Geometry in MySQL,MySQL支持 |
4 | gt-jdbc-oracle | Oracle SDO Geometry,Oracle支持 |
5 | PostgreSQL extension PostGIS | PostGIS扩展支持 |
6 | gt-jdbc-sqlserver | SqlServer支持 |
7 | gt-jdbc-hana | SAP HANA 支持 |
在gt-main中集成了对shapefile和wfs的读写扩展支持,与Gdal不一样的地方是,geotools对于空间矢量数据的读写支持,分别采用了不同的扩展来实现。
序号 | jar | 说明 |
1 | gt-shape | Shapefile read/write support,shp数据的读写支持 |
2 | gt-wfs | WFS read/write support,wfs的读写支持 |
与gt-jdbc的扩展类似,geotools也支持不同格式的栅格数据的读写与处理,因此根据不同的数据类型进行了对应的扩展。比如常见的geotiff、image等等,下面是详细的栅格数据的扩展支持包。
序号 | jar | 说明 |
1 | gt-geotiff | GeoTIFF raster format,支持geotiff格式栅格数据 |
2 | gt-arcgrid | arcgrid format |
3 | gt-mif | MIF format |
4 | gt-image | JPG, PNG, TIFF formats |
通常,GeoTools的每一层都需要至少一个插件来执行某些操作。例如,每次使用引用模块时,请确保有一个EPSG插件(否则引用模块将不知道“EPSG:4326”就是已知的坐标参考)。
4、GeoTools的扩展功能
我们更进一步的,在GeoTools库的基础上实现了一些有趣的“扩展”。这些扩展提供了使用核心库的全部功能构建在GeoTools之上的额外功能。这里我们来简单介绍GeoTools的扩展功能。下面这张图是Geotools的扩展架构图:
GeoTools 扩展功能架构图
在GeoTools中,这些扩展按照功能模块来划分是独立的。大家可以按照需要来进行引入到具体的开发中。 下面对涉及到的插件进行简要介绍:
JAR | Extension |
---|---|
| Map from application schema to complex feature model |
| Generation of styles using color brewer |
| Support for making custom complex feature model |
| Work with graph and network traversals,这个很重要,实现图像渲染的重要组件 |
| Dynamicly generate features from grid definiton |
| Transform features on the fly |
| Web Map Server client,这是对wms等ogc标准的支持 |
| Web Map Tile Server client,这是对Wmts的OGC标准的支持 |
| Parsing/Encoding for common OGC schemas |
5、GeoTools的xml支持
在GeoTools当中,对于xml的支持能力非常强。不仅可以实现WMS、WMTS、MFS等常见的OGC标准服务,同时对于地图的样式XLD渲染能力也支持得比较好。已xsd为例,XSD解析器通过一系列XSD插件使用这些工具。这些插件指示如何使用Eclipse XSD库解析和编码其他内容,以解析XML模式文档,并提供“绑定”,显示如何解析和编码到Java类,如String、Date、URL和Geometry。
JAR | Bindings |
---|---|
| Basic types defined by XML schema |
| filter 2.0 |
| filter (used by OGC CAT and WFS) |
| keyhole markup language |
| web feature service |
| web processing service |
| geographic markup language 3 |
| geographic markup language 2 |
| open web services |
| web coverage service |
| web map service |
| style layer descriptor |
关于xml的支持,还可以看下面的这个表格:
JAR | Schema |
---|---|
| open web services schema |
| web feature service |
| web processing service schema |
| web coverage service schema |
| web feature service schema |
| XLink schema |
这里重点是关于对opengis的支持功能非常强大,比如常见的wfs、wps、wcs等等。这些都是标准的ogc的实现,使用Java可以构建出这些完全符合标准的OGC服务,再通过java的分布式系统构建能力来扩展ogc服务的处理能力,提高我们应用的处理功能。上述资料摘自geotools的官方资料,在实际开发时,可以翻阅上的资料进行查阅,GeoTools Architecture。
二、从Geotools的源码看架构
虽然在GeoTools的官方文档说明中,我们对其大概的功能架构有了基本的认识,但是还没有看到GeoTools的源码,下面从源代码的模块划分来进行讲解。
1、GeoTools源码
GeoTools的源码可以在GitHub上搜索得到,如果大家的网络条件不是很好的话,可以在国内使用Gitee来加速。在Gitee上也有从github上复制过来的镜像,大家也可以放心下载。关于源码的编译JDK版本,下次在讲解GeoTools的本地编译时再重点讲解,本地开发环境使用的jdk1.8,因此GeoTools使用的28.x的版本。
将GeoTools的源代码下载到本地后,就可以阅读它的源代码,本地源码的目录结构如下所示:
2、各功能模块介绍
在Geotools的各功能模块中,它的主要源代码是放在modules这个目录下面的。我们打开modules这个文件夹,就可以看到它的子包。
可以看到,这个Geotools的模块划分与我们在博客的开始讲到的知识是基本一致的。我们可以打开它的Pom.xml来进行进一步的查看划分。
<?xml version="1.0" encoding="UTF-8"?>
<!-- =======================================================================
Maven Project Configuration File
The Geotools Project
http://www.geotools.org/
Version: $Id$
======================================================================= -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.geotools</groupId>
<artifactId>geotools</artifactId>
<version>28-SNAPSHOT</version>
</parent>
<!-- =========================================================== -->
<!-- Module Description -->
<!-- =========================================================== -->
<groupId>org.geotools</groupId>
<artifactId>modules</artifactId>
<packaging>pom</packaging>
<name>Geotools modules</name>
<description>Geotools libraries.</description>
<licenses>
<license>
<name>Lesser General Public License (LGPL)</name>
<url>http://www.gnu.org/copyleft/lesser.txt</url>
<distribution>repo</distribution>
</license>
</licenses>
<!-- =========================================================== -->
<!-- Modules included in the build -->
<!-- =========================================================== -->
<modules>
<module>library</module>
<module>ogc</module>
<module>plugin</module>
<module>extension</module>
<module>unsupported</module>
</modules>
<!-- =========================================================== -->
<!-- Dependencies to be inherited by all modules. -->
<!-- =========================================================== -->
<dependencies>
<dependency>
<groupId>javax.media</groupId>
<artifactId>jai_core</artifactId>
<!-- The version number is specified in the parent POM. -->
</dependency>
</dependencies>
</project>
在上述的xml文档中,重点定义了相关的模块内容。
同时在pom.xml中,可以看到是我们想clone的28.x的版本。
<parent>
<groupId>org.geotools</groupId>
<artifactId>geotools</artifactId>
<version>28-SNAPSHOT</version>
</parent>
3、以library来看相关组件
通过上小节的modules可以知道geotools的功能是非常丰富的,通过一篇文章肯定不能完整的进行介绍,这么多的源码,非常值得我们去学习,掌握它的设计理念和实现方式。而且需要耗费一定的时间,由于时间有限,这里不将每个包都一一罗列,后面会根据不同的包和具体的使用会出一些详细的教程。这里以library库为例做一些简单的介绍,让大家知道如何进行源代码的阅读,根据不同的模块来研究自己感兴趣的功能模块。
可以看到,在library当中包含了我们之前说的coverage、cql、http、Jdbc、main、metadata、opengis、referencing、render、xml等等的模块,大家就可以根据自己的需要逐模块,逐包进行源代码的阅读和debug调试。 比如我们想阅读jts下面的一些知识,如下图所示:
Geotools的代码封装的非常不错,都是按照面向对象的方式来进行设计和实现的。因此学习它的源代码的编写,对我们的程序开发能力有很大的借鉴意义。学有余力的朋友们,可以深入学习起来哦。本文这里起抛砖引玉的作用,关于geotools的更多知识,欢迎大家一起交流探讨。
三、总结
以上就是本文的主要内容,本文将重点介绍GeoTools的技术框架,对GeoTools的相关依赖与功能jar的叙述进行讲解。文章从GeoTools的插件、扩展、XML支持、非GeoTools的官方扩展这几个方面来进行讲解。通过本文的内容,您可以对GeoTools的架构更进一步的熟悉,同时对GeoTools的主要模块更加了解。关于GeoTools的源代码阅读,以后会在系列博客中进行详细介绍。结合案例的方式进行深入讲解,本文对基础的功能架构进行了简单介绍。行文仓促,定有许多不足之处,还恳请各位专家博主在评论区留下宝贵意见,不胜感激。