编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

GeoTools数据解析(geo分析)

wxchong 2024-09-14 15:12:43 开源技术 9 ℃ 0 评论

前言

Geotools作为一款开源的GIS业务处理库,其内置了多种开源数据的解析算法,包括常见的TIFF、IMG、Shape、CSV、Geojson以及集成了Gdal工具库,可解析Gdal支持的所有数据格式。今天主要来介绍下Geotools自身支持的数据解析类以及其中的代码设计模式。

环境搭建

在开始今天的讲解以及后续所有的代码级别的知识之前,请大家先在开发环境(Eclipse或Idea),搭建一个Maven工程,具体搭建过程网上教程很多,这里不介绍maven的搭建过程,请自行完成。本系列内容是以Geotools25.2版本为基础讲解的。引入我们今天依赖包,具体如下:

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.opengis</groupId>
    <artifactId>giser</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>giser</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-shapefile</artifactId>
            <version>25.2</version>
        </dependency>

        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-geotiff</artifactId>
            <version>25.2</version>
        </dependency>

        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-epsg-hsql</artifactId>
            <version>25.2</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-swing</artifactId>
            <version>25.2</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11-beta-1</version>
            <scope>compile</scope>
        </dependency>

    </dependencies>

    <repositories>
        <repository>
            <id>osgeo</id>
            <name>OSGeo Release Repository</name>
            <url>https://repo.osgeo.org/repository/release/</url>
            <snapshots><enabled>false</enabled></snapshots>
            <releases><enabled>true</enabled></releases>
        </repository>
        <repository>
            <id>osgeo-snapshot</id>
            <name>OSGeo Snapshot Repository</name>
            <url>https://repo.osgeo.org/repository/snapshot/</url>
            <snapshots><enabled>true</enabled></snapshots>
            <releases><enabled>false</enabled></releases>
        </repository>
    </repositories>

</project>

栅格数据解析

今天主要来看tiff数据的解析,tiff数据是GIS行业栅格数据的主要存储格式,包括卫片影像,栅格影像,以及地形数据,geotools中对于tiff数据的读取直接使用GeoTiffReader即可,该类可以直接传递一个tiff文件,也可以传递对应的输入流,以及文件网络路径。

而对于实际tiff的读取,主要由三方库TIFFImageReader完成的,这个类是我们之前介绍的三方库ImageIO-ext的核心类,由这个类解析tiff数据的所有格式以及存储的信息,当然如你有自己的解析算法,系统也支持传递自定义的解析类。

TIFFImageReader按照tiff数据的标准格式去解析,getools将解析后的tiff元数据分装到GeoTiffIIOMetadataDecoder,可以从这个类中获取到tiff的元数据信息,包括数据的bbox、投影信息、图像网格信息以及是否含有nodata数据等。下面来简单看下代码的实现,其实代码实现很简单,具体如下:

其核心读取内容主要在GeoTiffReader的geHRInfo()中

在构造函数中最主要的就是getHRInfo()这个方法,用来获取tiff中的元数据,最主要的是通过spi技术,通过TIFFImageReader的getImageMetadata()方法进一步解析tiff数据,关于tiff数据格式的解析,可以参考TIFFImageReader中的seekToImage(int imageIndex, boolean optimized),其中第一个参数imageIndex是tiff页索引,因为tiff数据有时候数据是由多页构成的,这也是tiff相比较其它图像格式的优势,关于该类中的详细代码大家感兴趣可以自行阅读源码,因为它就是按照tiff标准格式挨个解析的。

矢量数据解析

Geotools对于矢量数据解析也是比较全面的,下面就以shape数据的解析为为例,来说明geotools对矢量数据的解析,目前geotools提供了通用接口,通过DataStoreFinder解析获取一个DataStore的类对象,然后通过DataStore获取SimpleFeatureSource,SimpleFeatureSource是geotools对opengis定义的SimpleFeatureType和SimpleFeature的实现,通过这个类我们就可以获取到Shape中定义的gis相关信息,具体代码如下:

自定义扩展

由于Geotools采用的是模块化开发的方式,所有的实现都是基于SPI技术,当然这个技术在Java领域有很多可扩展架构都是基于它实现的。

因此,如果我们希望自定义一个矢量类型,然后按照geotools这种模式无缝的衔接进来,比如矢量数据我们只需要实现geotools的DataStoreFactorySpi接口即可,如果我们是以三方库的形式集成到系统中,那么需要再jar包的META-INF目录下,新建一个services文件下,并在该目录下创建一个文件,文件名称是DataStoreFactorySpi的全名(就是从包名开始),里面的内容就是我们自定义的实现类的全名。

比如,下面是geotools的shape解析库的services的文件信息:

这样配置好后,我们重启系统,就可以使用我们自定义的解析类了。而栅格的解析也是一样,只需要实现ImageReaderSpi即可。

好了,今天关于geotools数据解析的内容就说到这里,基本都是基础的接口调用,如果大家对哪方面感兴趣或者遇到什么问题,欢迎咨询交流,下一期针对这一期解析的数据,将做一个简单的应用,就是如何实现矢量和栅格的wms协议,欢迎持续关注!

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表