目录

前言

一、GeoTools架构说明

1、GeoTools Library

2、各模块说明

3、GeoTools插件

4、GeoTools的扩展功能

5、GeoTools的xml支持

二、从Geotools的源码看架构

1、GeoTools源码

2、各功能模块介绍 

 3、以library来看相关组件

三、总结


前言

        作为使用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技术架构知识简介_bc

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技术架构知识简介_bc_02

GeoTools 扩展功能架构图

        在GeoTools中,这些扩展按照功能模块来划分是独立的。大家可以按照需要来进行引入到具体的开发中。 下面对涉及到的插件进行简要介绍:

JAR

Extension

gt-app-schema

Map from application schema to complex feature model

gt-brewer

Generation of styles using color brewer

gt-complex

Support for making custom complex feature model

gt-graph

Work with graph and network traversals,这个很重要,实现图像渲染的重要组件

gt-grid

Dynamicly generate features from grid definiton

gt-transform

Transform features on the fly

gt-wms

Web Map Server client,这是对wms等ogc标准的支持

gt-wmts

Web Map Tile Server client,这是对Wmts的OGC标准的支持

gt-xsd

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

gt-xsd-core

Basic types defined by XML schema

gt-xsd-fes

filter 2.0

gt-xsd-filter

filter (used by OGC CAT and WFS)

gt-xsd-kml

keyhole markup language

gt-xsd-wfs

web feature service

gt-xsd-wps

web processing service

gt-xsd-gml3

geographic markup language 3

gt-xsd-gml2

geographic markup language 2

gt-xsd-ows

open web services

gt-xsd-wcs

web coverage service

gt-xsd-wms

web map service

gt-xsd-sld

style layer descriptor

        关于xml的支持,还可以看下面的这个表格:

JAR

Schema

net.opengis.ows

open web services schema

net.opengis.wfs

web feature service

net.opengis.wps

web processing service schema

net.opengis.wcs

web coverage service schema

net.opengis.wfs

web feature service schema

org.w3.xlink

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技术架构知识简介_GeoTools技术架构解读_03

         将GeoTools的源代码下载到本地后,就可以阅读它的源代码,本地源码的目录结构如下所示:

关于GeoTools技术架构知识简介_GeoTools源码_04

2、各功能模块介绍 

        在Geotools的各功能模块中,它的主要源代码是放在modules这个目录下面的。我们打开modules这个文件夹,就可以看到它的子包。

关于GeoTools技术架构知识简介_xml_05

        可以看到,这个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文档中,重点定义了相关的模块内容。

关于GeoTools技术架构知识简介_xml_06

        同时在pom.xml中,可以看到是我们想clone的28.x的版本。

<parent>
    <groupId>org.geotools</groupId>
    <artifactId>geotools</artifactId>
    <version>28-SNAPSHOT</version>
  </parent>

 3、以library来看相关组件

        通过上小节的modules可以知道geotools的功能是非常丰富的,通过一篇文章肯定不能完整的进行介绍,这么多的源码,非常值得我们去学习,掌握它的设计理念和实现方式。而且需要耗费一定的时间,由于时间有限,这里不将每个包都一一罗列,后面会根据不同的包和具体的使用会出一些详细的教程。这里以library库为例做一些简单的介绍,让大家知道如何进行源代码的阅读,根据不同的模块来研究自己感兴趣的功能模块。

关于GeoTools技术架构知识简介_xml_07

        可以看到,在library当中包含了我们之前说的coverage、cql、http、Jdbc、main、metadata、opengis、referencing、render、xml等等的模块,大家就可以根据自己的需要逐模块,逐包进行源代码的阅读和debug调试。 比如我们想阅读jts下面的一些知识,如下图所示:

关于GeoTools技术架构知识简介_xml_08

关于GeoTools技术架构知识简介_GeoTools源码_09

         Geotools的代码封装的非常不错,都是按照面向对象的方式来进行设计和实现的。因此学习它的源代码的编写,对我们的程序开发能力有很大的借鉴意义。学有余力的朋友们,可以深入学习起来哦。本文这里起抛砖引玉的作用,关于geotools的更多知识,欢迎大家一起交流探讨。

三、总结

        以上就是本文的主要内容,本文将重点介绍GeoTools的技术框架,对GeoTools的相关依赖与功能jar的叙述进行讲解。文章从GeoTools的插件、扩展、XML支持、非GeoTools的官方扩展这几个方面来进行讲解。通过本文的内容,您可以对GeoTools的架构更进一步的熟悉,同时对GeoTools的主要模块更加了解。关于GeoTools的源代码阅读,以后会在系列博客中进行详细介绍。结合案例的方式进行深入讲解,本文对基础的功能架构进行了简单介绍。行文仓促,定有许多不足之处,还恳请各位专家博主在评论区留下宝贵意见,不胜感激。