关于GeoTools技术架构知识简介

#哪个编程工具让你的工作效率翻倍?#

目录

前言

一、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 模块架构图

        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资源对应关系进行一个简单的说明。

序号模块作用说明
1gt-renderMap API, with Java2D rendering engine for mapping.地图API,使用Java2D的渲染引擎
2gt-jdbcImplements for accessing spatial database操作空间数据库的实现
3gt-xmlImplements of common spatial XML formats空间xml格式的实现
4gt-cqlImplements of Common Query Language for filters通用查询语言的实现
5gt-coverageImplementation for accessing raster information访问读取栅格数据的实现
6gt-mainData API, with default implementations of filter, feature, etc…数据操作API,默认的过滤器实现
7gt-referencingImplementation of co-ordinate location and transformation坐标定位和转换的实现
8gt-metadataImplementation of identification and description定义和管理元数据的实现
9gt-apiDefinition of interfaces for common spatial concepts
10jtsJTS Topology Suite (external library) implementing GeometryJTS拓扑套件(外部库)

3、GeoTools插件

         在GeoTools中又根据不同的模块进行了插件的扩展。以gt-jdbc为例,众所周知,常见的数据库种类有很多种,包括DB2、MySQL、Oracle、PostgreSQL、SqlServer等等。因此在面向数据库的支持上,GeoTools又根据不同的数据类型进行了支持。类似与Jdbc的驱动一样,根据数据库类型的不同扩展了不同的gt-jdbc,下面是具体的插件与扩展列表详情:

序号jar说明
1gt-jdbc-db2Geometry in DB2,DB2 数据库支持
2gt-jdbc-h2Pure Java “H2” database,H2内存数据库支持
3gt-jdbc-mysqlGeometry in MySQL,MySQL支持
4gt-jdbc-oracleOracle SDO Geometry,Oracle支持
5PostgreSQL extension PostGISPostGIS扩展支持
6gt-jdbc-sqlserverSqlServer支持
7gt-jdbc-hanaSAP HANA 支持

        在gt-main中集成了对shapefile和wfs的读写扩展支持,与Gdal不一样的地方是,geotools对于空间矢量数据的读写支持,分别采用了不同的扩展来实现。

序号jar说明
1gt-shapeShapefile read/write support,shp数据的读写支持
2gt-wfsWFS read/write support,wfs的读写支持

        与gt-jdbc的扩展类似,geotools也支持不同格式的栅格数据的读写与处理,因此根据不同的数据类型进行了对应的扩展。比如常见的geotiff、image等等,下面是详细的栅格数据的扩展支持包。

序号jar说明
1gt-geotiffGeoTIFF raster format,支持geotiff格式栅格数据
2gt-arcgridarcgrid format
3gt-mifMIF format
4gt-imageJPG, PNG, TIFF formats

        通常,GeoTools的每一层都需要至少一个插件来执行某些操作。例如,每次使用引用模块时,请确保有一个EPSG插件(否则引用模块将不知道“EPSG:4326”就是已知的坐标参考)。

4、GeoTools的扩展功能

        我们更进一步的,在GeoTools库的基础上实现了一些有趣的“扩展”。这些扩展提供了使用核心库的全部功能构建在GeoTools之上的额外功能。这里我们来简单介绍GeoTools的扩展功能。下面这张图是Geotools的扩展架构图:

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的源代码下载到本地后,就可以阅读它的源代码,本地源码的目录结构如下所示:

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的源代码阅读,以后会在系列博客中进行详细介绍。结合案例的方式进行深入讲解,本文对基础的功能架构进行了简单介绍。行文仓促,定有许多不足之处,还恳请各位专家博主在评论区留下宝贵意见,不胜感激。

  • 60
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 62
    评论
评论 62
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜郎king

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值