4 个回答
推荐一:《地理信息系统导论》
推荐理由:理论和实验兼顾
这本地理信息系统导论对于GIS的原理和实验都有所兼顾,而且不论你是本科生还是研究生都可以从中学到很多。
推荐二:《地理信息系统实习教程》
推荐理由:实验步骤清晰
对于GIS软件操作来说,推荐这本地理信息实习教程,里面有操作说明和软件安装,步骤都非常清晰。
推荐三:《地理信息系统——原理、方法和应用》
推荐理由:偏重于理论研究
建议在学习了基础知识和软件实操后再去解读这本书
推荐书籍:《GeoTools 地理信息系统开发》
国内初次详解GeoTools解决地理信息系统难题的入门指南,阐述如何管理坐标参考系统、矢量数据、栅格数据和连接地理数据库,源码解析与实际案例相结合。
(1)基于GeoTools,深入浅出地为地理信息系统相关学科的从业者梳理了学科脉络、基础开发知识,并通过实际解决方案进一步探讨和明晰了工具的使用与实现方式。
(2)从实现并管理坐标参考系统、管理矢量数据和栅格数据、连接地理数据库 ,以及实现一个空间数据管理系统等方面,帮助读者形成开源地理信息解决方案。
(3)书中的代码更多的是为地理信息行业相关开源规范做解释的,读者无需具有深厚的程序设计功底,仅需了解入门级的Java 程序设计知识,即可顺利地阅读书中的代码。
本书从GeoTools 的基本信息、社区生态开始介绍,随后以地理信息的基本概念为脉络,详细介绍GeoTools 是如何实现并管理坐标参考系统、如何管理矢量数据和栅格数据,以及如何连接地理数据库的。在本书的最后,通过实现一个空间数据管理系统,将全书的知识体系串联起来,帮助读者形成开源地理信息解决方案,来解决地理信息系统中的数据解析、坐标计算、空间关系等常见问题。
本书适用于有志于从事地理信息系统开发工作的人员,也可以帮助从事传统商业地理信息系统开发和管理工作的人员进一步了解开源地理信息系统。
地理信息系统是智慧城市和数字孪生的基础支撑技术,随着近年来相关领域的不断发展,越来越多的空间数据需要被采集、处理、存储、分析和可视化。GeoTools是一个提供了全套空间数据解决方案的Java类库。更为重要的是,GeoTools是开源的。相比传统地理信息领域的商业软件,GeoTools提供了更开放的开发环境和更通用的空间数据规范。GeoTools是当前开源地理信息领域的一个核心类库。基于GeoTools,开源社区实现了GeoServer这样的空间数据服务平台和GeoMesa这类时空大数据处理类库。因此,熟悉和了解GeoTools可以为读者开辟一条借助开源社区打造地理信息解决方案的新道路。
全书共有12章。
第1章介绍GeoTools的基本信息,以及GeoTools在开源地理信息领域的生态等。
第2章介绍GeoTools的源代码组织与编译方法、如何构建GeoTools,以及GeoTools的使用方式。
第3章介绍Java拓扑库、九交模型和常见的空间索引。Java拓扑库是一个完全使用Java代码实现的几何对象模型类库,是GeoTools实现平面几何对象模型所依赖的类库。九交模型定义了平面几何对象之间的空间关系和判断依据。空间索引是一种加快空间数据查询速度的数据结构,是现代空间数据库的理论基础。
第4章介绍空间坐标系。空间坐标系是空间数据最复杂的部分,只有了解空间坐标系的相关信息,才能真正理解空间数据。
第5章是全书的重点,首先介绍常见的矢量数据格式,然后重点介绍GeoTools的矢量数据模型。GeoTools提供了一套完善的插件式数据模型,几乎能够支持对任意的空间数据源的扩展。
第6章介绍栅格数据模型。栅格数据是除矢量数据之外的另一类基础空间数据。
第7章介绍地图样式与地图渲染、OGC定义的地图样式规范以及GeoTools对其的实现。
第8章介绍通过GeoTools实现的空间查询与空间分析。
第9章介绍GeoTools如何连接和管理各类关系数据库。
第10章介绍GeoTools提供的各类地图组件。
第11章以一个实际项目为例,介绍如何使用GeoTools实现空间数据管理系统。
第12章介绍GeoTools使用中的一些常见问题。
样章赏析
第1章 GeoTools基本知识
对于大多数传统地理信息系统(Geographical Information System,GIS)开发的从业人员来说,GeoTools可能是一个比较陌生的名字。但是随着地理信息系统与互联网和一些新技术的结合,以GeoTools为代表的开源地理信息系统生态逐渐进入人们的视线,越来越多的开发者愿意使用GeoTools来开发自己的应用程序。为什么GeoTools有如此大的魅力呢?GeoTools是什么?GeoTools从何而来,又是如何发展的呢?本章将会从以下4个方面来介绍GeoTools。
〓● GeoTools简介。
〓● GeoTools架构。
〓● GeoTools特性。
〓● GeoTools生态。
随着开源地理信息系统生态的不断发展,越来越多的地理信息系统开发者选择使用GeoTools来进行相关软件的开发。那么GeoTools是什么呢?它又是从何而来的呢?1.1节会对这两个问题进行解答。
GeoTools是一个开源Java代码库,基于GNU宽通用公共许可证(Lesser General Public License,LGPL),它的标识如图1-1所示。它为地理空间数据(以下简称“空间数据”)提供符合开放式地理信息系统协会(Open GIS Consortium,OGC)规范的各类处理方法,是OGC规范的Java实现。许多开源地理信息工具,包括Web地图服务、桌面应用程序等均使用了GeoTools。
图1-1 GeoTools的标识
1.1 GeoTools简介
GeoTools始于1996年,最初是英国利兹大学的一个研究生课程项目,主要用于将空间数据可视化。不久之后,利兹大学将空间数据可视化独立为一门课程,并开始研究如何将地理信息系统应用于公众领域,之后使用1.0版本的GeoTools制作了一个地图网页,当地居民可在这个地图网页上讨论本地城乡规划方案。随着实际需求的不断增多,GeoTools的功能逐渐完善,并成为一个独立的地理信息工具类库。需要说明的是,早期的GeoTools开发过程中并没有参考任何OGC规范,而是直接使用了当时流行的Java Applet接口。1.0版本的GeoTools主要用于构建能够交互式展示空间数据的客户端。
1.0版本的GeoTools的开发团队中仅有两位是来自利兹大学的开发者,随着功能的不断增加,代码变得凌乱和难以维护。因此在2002年,开发者们对GeoTools进行了全新的设计与重构,此时GeoTools的开发团队已变成一个去中心化的全球团队,并在这次重构中明确了一套开源的软件设计、决策与实现体系,成立了GeoTools项目管理委员会。2.0版本的GeoTools新增了坐标系转换、栅格数据读取与渲染等功能,并开始明确将自身作为一个Java标准的空间数据类库的开发方向。当时,有很多使用Java程序设计语言的地理信息系统开发者,为了统一这些开发者的成果,GeoTools开始参考OGC规范,并实现了一套被称为GeoAPI的开放地理空间接口。之后的多年里,GeoTools的版本从2.1发展到2.7,GeoAPI已经开发完成,整体结构也与我们今天见到的代码库接近,并在2012年发布了里程碑版本,即GeoTools 8.0。现在版本的GeoTools的软件架构与8.0版本的软件架构相比没有太多改动,即在多年迭代中保持了稳定。
1.2 GeoTools架构
GeoTools作为一个持续迭代了二十多年的开源项目,其代码高度模块化与规范化,了解 GeoTools代码目录结构有助于厘清应用程序所需的依赖包。本节介绍GeoTools代码仓库的各个部分以及它们是如何组合在一起的。为了让特定应用程序仅包含其需要的依赖,用户可以为项目选择适量的GeoTools依赖包。GeoTools主要模块如图1-2所示,从左到右依次为接口层、实现层和插件层,模块的依赖关系为从上到下,即上面的模块依赖下面的模块。
图1-2 GeoTools主要模块
接口层封装了空间数据的核心规范。接口层主要包括三大类规范,分别是:GeoAPI,这是GeoTools提供的一套稳定的空间数据操作接口;Java拓扑库(Java Topology Suite,JTS),这是使用Java代码实现的一套几何类库;OpenGIS接口,这是对OpenGIS各类规范的Java接口的定义。
实现层是GeoTools的核心,是各类空间数据规范的具体代码实现。从底向上包括:元数据模块Metadata,负责处理各类空间数据格式的元数据信息;空间坐标系模块Referencing,负责各类地理坐标系和投影坐标系的定义与转换;栅格数据模块Coverage,负责栅格数据的读写;Main模块,负责各类常用工具、数据结构和框架的定义;矢量数据模块Data,负责所有矢量数据的读写;关系数据库操作模块JDBC,负责读写各类关系数据库和对应的空间数据扩展;空间查询语言模块 CQL,定义了一套逻辑完备的空间查询语言,用于实现各类空间数据查询;空间数据渲染模块Render,负责矢量数据和栅格数据的渲染;XML模块,用来操作各类使用XML格式描述的空间数据和元数据信息。
插件层是GeoTools扩展能力的体现。插件层基于接口层和实现层,是对具体应用的对应实现,具体包括欧洲石油调查组织(European Petroleum Survey Group,EPSG)的空间坐标系定义扩展模块epsg-hsql,该模块记录了欧洲石油调查组织的6000多个地理坐标系定义;Shapefile为空间数据文件格式扩展模块,该模块负责对Shapefile这类十分常用的矢量数据格式提供读写和索引的支持;空间数据库模块PostGIS负责对当前业界十分常用的PostGIS空间数据库提供读写和索引的实现;XSD WMS负责对基于XML的一些OGC的数据格式和服务规范提供实现。
1.3 GeoTools特性
GeoTools能够逐渐流行起来,离不开它本身的丰富特性,本节会对这些特性进行介绍。
(1)定义了空间数据概念和数据结构。
使用JTS作为基础的几何类库。依据OGC规范,实现空间过滤器和属性过滤器。
(2)定义了一套干净的数据访问接口,并支持访问者模式、事务和多线程。
支持访问多种地理空间文件格式和空间数据库。
支持坐标参考系统的转换。
支持常见的地图投影。
能够根据空间和非空间属性过滤和分析数据。
(3)提供了一个无状态、低内存消耗的地图数据渲染器,尤其适用于服务器端的地图渲染。
支持复杂的地图样式。
支持文本标签和文本颜色混合。
(4)支持OGC定义的地理标记语言(Geographic Markup Language,GML)规范、样式图层描述器(Styled Layer Descriptor,SLD)规范等XML格式规范。
(5)提供了一套被称为GeoTools Plugins的开放式插件系统,允许接入任意空间数据格式。
(6)提供了一套地理信息处理工具和扩展接口。
提供了基础的空间数据处理方法,支持图和网络分析、空间数据校验、Web 地图服务器的客户端、XML 解析和编码、地图样式生成器等。
(7)提供开源社区扩展。
GeoTools拥有一个活跃的开源社区,许多具有实验性的功能和最新的功能均是由社区开发者来维护的。这些功能主要包括支持桌面图形化方案、本地和 Web 流程支持、附加符号系统、附加数据格式、网格生成等。
1.4 GeoTools生态
经过多年的发展,GeoTools已经形成了庞大的生态。这个生态包含3个方面:在标准方面,GeoTools遵守并实现了地理信息系统行业的通用标准OGC规范;在其内部,它对不同数据类型、不同数据格式等进行兼容;在其外部,很多组件也实现了和它的对接。本节会对这3个方面进行详细的介绍。
1.4.1 兼容地理信息系统标准
OGC是一个面向地理空间信息的全球化开放组织,它的标识如图1-3所示。该组织包含了500多家企业、政府机构、研究机构和大学,致力于实现地理空间信息的可发现性、可到达性、可交互性和可重用性。OGC提供了一系列针对地理空间信息的基础标准和解决方案,同时OGC也是一个解决地理信息前沿问题的研究平台。
图1-3 OGC的标识
GeoTools的产生依托于OGC,GeoTools也被称为OGC规范的开源Java实现。在GeoTools的源代码中,许多 OGC 规范文本被直接写在代码的注释上。同时,OGC 规范文本中也使用GeoTools 的类图作为自身实现的解释。由于 OGC 已经成为国际标准化组织(International Organization for Standardization,ISO)的一员,因此GeoTools实现的规范也成为相关国际标准。
GeoTools中的JTS是一个提供了平面几何对象模型和常见几何函数实现的开源Java类库。JTS遵循OGC的简单要素规范和简单要素结构查询语言(Structure Query Language,SQL)规范。JTS既可以作为矢量地理信息系统中具有提供点、线、面等的能力的基础组件,又可以作为一种负责提供几何算法实现的通用类库。
GeoTools使用JTS作为自身对平面几何对象的实现,不同版本的GeoTools依赖不同版本的JTS。读者在使用Maven添加GeoTools依赖的时候,其会根据当前GeoTools版本,自动下载对应版本的JTS依赖。同时,GeoTools中的几何对象空间关系判断、几何算法和图算法等矢量计算范畴内的实现也依赖于JTS。
1.4.2 内部生态
GeoTools的内部生态主要是其本身对不同标准和格式的兼容,包含对数据类型的兼容、空间运算逻辑的兼容、地理坐标系的兼容、不同的数据格式的兼容以及不同的查询接口的兼容等。接下来会对每一个具体方面进行介绍。
1.兼容数据类型
我们知道,在计算机程序设计语言中,数据类型有一套定义方式。例如在Java中,原生支持8种基本数据类型,如表1-1所示。当然Java也支持一些引用数据类型,这些一般是用户定义的。
表1-1 Java的基本数据类型
数据类型 | 中文名称 | 占用位数 |
---|---|---|
byte | 字节型 | 8 |
short | 短整型 | 16 |
int | 整型 | 32 |
long | 长整型 | 64 |
float | 单精度浮点型 | 32 |
double | 双精度浮点型 | 64 |
boolean | 布尔型 | 1 |
char | 字符型 | 16 |
在地理信息系统场景下,这些数据类型是不能满足需求的,因此需要更多的矢量数据类型。例如在OGC规范中,就定义了一些空间矢量数据类型,部分常用的空间矢量数据类型如表1-2所示。
表1-2 部分常用的空间矢量数据类型
数据类型 | 中文名称 |
---|---|
Point | 点 |
LineString | 多段线 |
Polygon | 多边形 |
MultiPoint | 多点 |
MultiLineString | 多重多段线 |
MultiPolygon | 多重多边形 |
Geometry | 空间数据 |
GeometryCollection | 几何对象集合 |
除了空间矢量数据类型,还有空间栅格数据类型,甚至有基于上述这两种数据类型形成的矢量切片数据类型和栅格切片数据类型。这些数据类型是比较特殊的,因此需要对前面提到的基本数据类型进行封装才能满足需求。
对于上述这些不同的数据类型,GeoTools都实现了支持,用户可以非常方便地利用GeoTools的内置方法或者类型定义来对上述的任何一种数据类型的数据进行管理。统一数据类型,可以大大提升数据管理效率。
2.兼容空间运算逻辑
对于单个空间数据的描述,GeoTools 是支持的;对于多个空间数据之间的空间关系,GeoTools 也是支持的。它是基于 OGC 规范中的九交模型(Dimensionally Extended Nine- Intersection Model,DE-9IM)进行实现的。九交模型支持的空间关系如表1-3所示。
表1-3 九交模型支持的空间关系
关系名称 | 中文名称 |
---|---|
Contain | 包含 |
Cross | 交叉 |
Disjoint | 相离 |
Equal | 相等 |
Intersect | 相交 |
Overlap | 重叠 |
Touch | 邻接 |
Within | 内部 |
当然九交模型有一套逻辑推导和数学定义,这些细节将在第3章进行介绍。
3.兼容地理坐标系
为了更好地描述地球上的空间实体,人们一般会利用空间坐标系来进行定义。然而由于在不同的国家和地区,使用的大地参考有所不同,目前比较常用的地理坐标系如表1-4所示。
表1-4 常用的地理坐标系
坐标系名称 | 类型 | 坐标原点 |
---|---|---|
WGS-84坐标系 | 地心坐标系 | 地球质心 |
GCJ02坐标系 | 地心坐标系 | 地球质心 |
北京54坐标系 | 参心坐标系 | 苏联普尔科沃 |
CGCS2000坐标系 | 地心坐标系 | 地球质心 |
不同的坐标系无法进行相互转换,对应的空间数据也无法进行统一管理。不过GeoTools对这些地理坐标系都实现了兼容,可以方便用户的开发。
4.兼容不同的数据格式
数据的封装往往涉及不同的数据格式,空间数据也不例外。空间数据的形式往往更加复杂,因此对应的数据格式也更加多样。其中,不仅有比较基本的逗号分隔值(Comma-Separated Values,CSV)格式,还有很多其他的数据格式,例如GeoJSON等。常用的空间数据格式如表1-5所示。
表1-5 常用的空间数据格式
数据格式名称 | 发布机构 |
---|---|
Shapefile | ESRI |
KML | Keyhole |
GeoJSON | IETF |
OSM | OpenStreetMap |
CSV | — |
当然还有很多其他的空间数据格式,GeoTools也实现了支持,在后续章节会有详细的介绍。
5.兼容不同的查询接口
由于地理信息系统行业涉及不同的数据源,因此也会涉及不同的查询接口。GeoTools在这方面也完成了对不同查询接口的适配。
最上层,GeoTools提供了一套完整的数据管理接口——DataStore,用户可以通过配置参数的方式构造对应的DataStore实例,并通过该实例完成对不同数据源的连接。查询接口采用的是OpenGIS的查询语言——上下文查询语言(旧称“通用查询语言”,Common Query Language,CQL),这样就能够保证GeoTools可以兼容所有地理信息系统行业的同类型数据源。
对于传统关系数据库所采用的JDBC接口,GeoTools也实现了支持,是通过将其内部的CQL语句转换成SQL语句来实现的。
对于新兴的非关系数据库,GeoTools也实现了支持。不过对应的数据源的接口往往不一样,因此针对每一种具体的数据源接口,GeoTools都是单独进行实现的。
1.4.3 外部生态
GeoTools的外部生态是指使用GeoTools来进行空间数据管理的其他组件。GeoTools的外部生态主要可以分为3个方面:桌面端应用、互联网服务和大数据组件。本小节会对这3个方面进行介绍。
1.桌面端应用
对于比较传统的软件应用用户来说,他们比较习惯使用桌面端应用。GeoTools在这方面也实现了支持,它是基于uDig来实现的。
uDig是一个使用Eclipse富客户端技术构建的开源桌面地理信息系统。uDig既可以作为一个独立桌面软件独立使用,也可以作为一个Eclipse富客户端的插件集成到用户的开发中。uDig提供了一种基于Java桌面开发技术体系的地理信息系统解决方案,uDig的功能包括空间数据访问、空间数据编辑和空间数据渲染等。uDig的名称来源于它自身的开发理念。
第一,uDig包含一个友好的图形化用户使用界面。第二,它是一个基于Java跨平台技术的原生桌面应用,原生支持Windows操作系统、macOS和Linux操作系统。第三,uDig支持各种互联网地图特性,包括网络地图服务(Web Map Service,WMS)、网络要素服务(Web Feature Service,WFS)、网络处理服务(Web Processing Service,WPS)等各类网络空间数据服务。第四,uDig是一个插件化的、逻辑完备的地理信息平台,它不仅支持现有的各类地理信息数据服务,也能通过扩展支持未来的地理信息数据服务。uDig使用Eclipse公共许可证(Eclipse Public License,EPL)作为自己的开源许可证。
uDig是基于GeoTools构建的一套Java客户端地理信息平台软件。通过uDig,用户可以在图形化的界面中展示空间数据、编辑空间数据,并配置空间数据的样式。uDig导出的地图样式文件,可作为后续空间数据服务化的基础,和GeoServer一起构成一套桌面端和服务端的开源地理信息系统解决方案。
2.互联网服务
互联网应用离不开网络服务。在这个方面,GeoTools是通过兼容GeoServer来实现支持的,GeoServer的标识如图1-4所示。
图1-4 GeoServer的标识
GeoServer是一套使用Java编写的用于编辑和分享空间数据的开源软件。GeoServer能够将各种GeoTools支持的空间数据发布为网络地图数据服务。相对于GeoTools,GeoServer实现了OGC的网络相关规范,主要包括WMS、WFS、WPS等。GeoTools主要实现了对空间数据的读取、存储、处理、分析等,而GeoServer则实现了空间数据的服务化。因此GeoServer是目前最常用的开源地理信息软件之一,许多互联网地图厂商均使用GeoServer作为自家的地图服务器。
3.大数据组件
随着大数据技术的不断成熟,地理信息系统的原有技术与大数据技术的结合成为趋势。GeoTools作为开源地理信息系统的代表,它与很多大数据组件一样,是使用Java和类Java语言开发的,这也让它成为对接大数据生态的一个非常合适的切口。事实上,大量的管理空间数据的组件都采用GeoTools作为空间数据管理的工具,其中比较有代表性的有GeoMesa、GeoWave和GeoTrellis。
GeoMesa是一套基于分布式系统的、用于大规模空间数据查询和分析的开源类库,它的标识如图1-5所示。GeoMesa使用GeoTools的数据源扩展能力,能将点、线、面等矢量数据存储在Accumulo、HBase、BigTable、Cassandra等分布式大数据存储系统当中,并在这些大数据存储系统上提供了一套时空索引。GeoMesa基于自身的时空索引,能够对存储的海量矢量数据进行快速查询和分析。同时,GeoMesa也支持接入Kafka对时空数据进行近实时的流式计算和处理。并且GeoMesa也支持和GeoServer进行集成,将前文提及的大数据存储系统发布为符合OGC规范的网络地图数据服务。更重要的是,GeoMesa支持通过大数据计算引擎Spark对海量矢量数据进行分析,来构建一个分布式的海量时空数据分析系统。
图1-5 GeoMesa的标识
GeoMesa对一系列大数据存储系统的支持,均是通过扩展GeoTools的数据源能力获取的,因此GeoMesa可被认为是GeoTools的大数据存储和分析扩展组件。
GeoWave是美国国家地理空间情报局(National Geospatial-Intelligence Agency,NGA)开发的一个空间数据管理组件,它的标识如图1-6所示。它的作用与GeoMesa类似,也是一个基于分布式系统的、用于管理海量空间数据的组件。不过与GeoMesa不同的是,它管理空间数据的空间填充曲线有所不同,而且在管理的数据类型上,不仅有空间矢量数据,还有栅格数据。在软件的部署和使用方式上,它不仅支持Linux,也支持Windows,产品形态更为完善。
图1-6 GeoWave的标识
GeoTrellis是一个基于分布式系统的、用于对栅格数据进行分析的工具包,它的标识如图1-7所示。其中用于分布式计算的组件主要是Apache Spark,这是一种基于弹性分布式数据集(Resilient Distributed Dataset,RDD)进行分布式计算的组件。通过使用RDD的数据抽象模型,用户可以非常方便地使用多个服务器节点来完成一些复杂的计算操作。对于栅格数据分析这种强数值计算场景,GeoTrellis可以并行地使用更多资源来对栅格数据进行计算和分析,可极大地提升整体的分析效率。
图1-7 GeoTrellis的标识
除此以外,GeoTrellis也可以创建可扩展的地理信息处理Web服务,提升系统的易用性。而且它也对空间矢量数据实现了支持,并对GeoTools的一些空间数据定义方式进行了优化,简化了编码逻辑。
1.5 本章小结
本章介绍了GeoTools的架构、特性、生态和历史发展。GeoTools作为一个持续迭代了二十多年的开源地理信息类库,已经构建了开源地理信息系统生态。基于GeoTools开发的常用开源地理信息软件有桌面端应用uDig、地图服务器应用GeoServer和大数据组件GeoMesa。学习GeoTools,可为后续学习其他开源地理信息软件打下基础。