此页面汇集了每个模块的各个常见问题解答页面。即使您不确定究竟是哪个模块负责,这也允许您搜索答案。
请将有关此页面的任何意见或建议发送至GeoTools 用户列表。
地理工具常见问题
问:什么是地理工具?
GeoTools 是一个免费的开源 Java 地理空间工具包,用于处理矢量和栅格数据。它由大量模块组成,允许您:
访问多种文件格式和空间数据库的 GIS 数据
使用广泛的地图投影
根据空间和非空间属性过滤和分析数据
用复杂的样式组合和显示地图
创建和分析图形和网络
GeoTools 实现了开放地理空间联盟的规范,包括:
简单的功能
网格覆盖
样式层描述符
过滤编码
GeoTools 可以通过添加新模块轻松扩展,用于自定义应用程序或作为库的贡献。
问:如何搜索 GeoTools 邮件列表的档案?
转到此页面。
问:GeoTools 库有哪些功能?
这是一个很难回答的问题,因为 GeoTools 是一个通用的地理空间库。
以下是当今库中一些重要功能的示例:
-
支持 OGC Grid Coverage 实施
-
坐标参考系统和转换支持
-
使用 OGC 样式层描述符 (SLD) 规范的符号系统
-
使用 OGC 过滤器编码规范的属性和空间过滤器
-
支持图形和网络
-
Java 拓扑套件 (JTS) - 支持 OGC 简单特征规范 - 用作矢量特征的几何模型。
-
无状态、低内存渲染器,在服务器端环境中特别有用
-
强大的“模式辅助”解析技术,使用 XML 模式绑定到 GML 内容
-
通过 Web Map Server 和 Web Feature Server 支持与 OGC Web 服务交互
-
开放式插件系统允许您教授图书馆其他格式
-
ImageIO-EXT 项目的插件允许 GeoTools 从 GDAL 读取额外的光栅格式
问:好的,GeoTools 支持哪些数据格式?
GeoTools 通过使用插件支持其他格式。您可以通过仅包含您需要的插件来控制您的应用程序支持的格式。
-
arcgrid
-
db2
-
光栅格式
-
geotiff
-
grassraster
-
image
- 使用常见图像格式(例如 JPEG、TIFF、GIF 和 PNG)的 world plus 图像文件 -
imageio-ext-gdal
(由于 ImageIO 项目,允许访问其他 GDAL 格式) -
imagemoasaic
-
imagepyramid
-
JP2K
-
-
数据库
gt-jdbc-ng
``支持-
db2
-
geopackage
-
hana
-
h2
-
mysql
-
oracle
-
postgis
-
sqlserver
-
teradata
-
-
property
- 通常用于测试的简单文本文件格式 -
shapefile
也许不受支持的模块或插件之一可能满足您的需求。这些模块由社区提供,尚未达到图书馆预期的质量:
还有一些流行或正在开发的“不受支持”的格式:
-
dfx
-
geojson
-
wfs
目前权威的插件列表当然是源码:
-
https://github.com/geotools/geotools/tree/main/modules/plugin
-
https://github.com/geotools/geotools/tree/main/modules/unsupported
地理工具版本
问:GeoTools 版本是如何组织的?
像许多开源项目一样,GeoTools 有一个开发版本和一个或多个在任何给定时间处于活动状态的稳定版本。活跃是指项目开发人员正在开发新功能、改进和错误修复。
开发版本是 GitHub 存储库 ( https://github.com/geotools/geotools ) 中的主要分支。这是正在处理最新功能的“前沿”代码。最终这段代码将成为下一个稳定的分支。
稳定版本是 GitHub 存储库中的一个分支。例如,可以在GitHub - geotools/geotools at 14.x找到 14.x 稳定分支 。稳定版本不会获得新功能,但会修复错误,有时还会获得其他小改进。
正式发布是 GitHub 存储库中的一个标签。例如,可以在https://github.com/geotools/geotools/releases/tag/14.0找到 GeoTools 14.0 。同样,可以在https://github.com/geotools/geotools/releases/tag/13.1找到 13.1 版本 。
从 GeoTools 版本 8 开始,major.minor.patch 编号系统适用。
重大的
主要标识符的增加(例如从 8.xy 版本到 9.0.0)表示可能破坏与以前版本的二进制兼容性的实质性更改。
次要的
次要标识符的增量(例如从 8.0.y 版到 8.1.y 版)表示不会破坏与先前版本的二进制兼容性的新功能和/或改进。
修补
补丁标识符的增量(例如从版本 8.0.0 到 8.0.1)表示自上一版本以来的修复和小调整。
问:什么是 SNAPSHOT 版本,我该如何使用它?
快照是开发人员正在积极处理的 GeoTools 代码。
通常会有三个活动快照:
-
一个与稳定分支相关的(例如 GeoTools 23-SNAPSHOT);
-
与维护分支相关的第二个(例如 22-SNAPSHOT);
-
第三个用于主分支(例如 24-SNAPSHOT)。
有时也会有应用了错误修复的早期分支的快照版本(例如 GeoTools 19-SNAPSHOT)。
每晚构建新的快照 jar 并将其部署到与用于正式发布的存储库分开的存储库中。如果您使用 Maven 作为构建工具,则可以通过将以下内容添加到您的pom.xml
:
<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>
您现在可以通过将项目设置为您的版本属性来针对快照版本构建您的项目,如下所示:
<properties> <geotools.version>24-SNAPSHOT</geotools.version> </properties>
在您的应用程序中主动测试修复时,这是一种很好的方法。
常见的许可证问题
问:GeoTools 使用什么许可证?
所有 GeoTools 模块均在 GNU 宽松通用公共许可证 (LGPL) 下发布。GeoTools 可用于商业应用,对 GeoTools 所做的任何更改都需要提供给您的客户。
一个简单的方法是将更改贡献回 GeoTools 项目(但这不是必需的)。
问:我可以在我的商业项目中使用 GeoTools 吗?
是的。这是我们选择 LGPL 许可证的原因之一。您可以构建一个使用 GeoTools 作为库的商业应用程序,并在您选择的任何许可下重新分发您的应用程序。您的用户将根据您的许可条款获得您的应用程序的许可,并根据 LGPL 的条款获得 GeoTools 库的许可。您只需要为您的用户提供某种方式来获取 GeoTools 库的源代码,最简单的方法是将您的用户指向 GeoTools 项目的服务器。
但是,如果您选择修改 GeoTools 库本身,那么您必须将这些更改的源代码发布给您的应用程序用户。
最简单的方法是将这些更改提交回 GeoTools 项目,以便将更改合并到核心源代码中。
问:我可以在我的 GPL 项目中使用 GeoTools 吗?
是的。这是我们选择 LGPL 许可证的原因之一。您可以构建一个使用 GeoTools 作为库的免费软件应用程序,并在 GPL 许可下重新分发您的应用程序。您的用户将根据 GPL 的条款获得您的应用程序的许可,并根据 LGPL 的条款获得 GeoTools 库的许可。您只需要为您的用户提供某种方式来获取 GeoTools 库的源代码,或者通过将您的用户指向 GeoTools 项目的服务器,或者通过向他们提供 GeoTools 代码的方式向他们提供您的 GPL 代码应用。
但是,如果您选择修改 GeoTools 库本身,那么您必须将这些更改的源代码发布给您的用户。
最简单的方法是将这些更改提交回 GeoTools 项目,以便将更改合并到核心源代码中。
笔记
您还可以将 GeoTools 代码直接合并到您的 GPL 应用程序中。从法律上讲,后者相当于根据 GPL 重新许可 GeoTools,这是 LGPL 明确允许的。这种重新许可是单向的,需要特定的操作 - 请参阅 LGPL。
问:我使用 GeoTools 有哪些限制?
没有任何。您可以使用 GeoTools 代码阅读、运行、复制或执行任何您想做的事情。这是我们根据 LGPL 授予您的*软件的四项核心*之一:为您选择的任何目的使用软件的*。
LGPL 的唯一限制是当您重新分发 GeoTools 时,即当您将它单独或作为更大产品的一部分传递给其他人时,例如当您共享或出售它时。
问:我重新分发 GeoTools 有哪些限制?
从技术上讲,您必须向从您那里收到 GeoTools 副本的每个人提供某种方式来获取库的源代码。实际上,将这些用户指向 GeoTools 项目本身被认为是一个合适的解决方案。
但是,如果您要重新分发 GeoTools 的修改版本,则需要向用户提供对修改后代码的访问权限。这意味着您必须为您的用户提供某种方式来获取修改后的代码,例如自己发布代码。为您的用户提供修改的另一种方法是与我们合作,将您的更改集成到 GeoTools 库中——然后您可以直接使用新库。最好的方法是在我们的问题跟踪器上打开一个更改请求,并向该请求添加一个包含您的更改的代码补丁。
问:如果我仍然不确定我可以做什么,我该怎么办?
您可以通过将问题发送到用户邮件列表来澄清您的任何问题:
问:为什么我在 GeoTools 发行版或 javadocs 中找不到模块 X?
如果您正在使用最新的 GeoTools 版本,那么您正在寻找的模块很可能是 不受支持的模块。这些模块不是标准 GeoTools 发行版的一部分,但可从GIT 存储库的modules/unsupported文件夹中获得。如果你使用 Maven 作为你的构建工具,你可以像任何其他 GeoTools 模块一样包含一个不受支持的模块的依赖项。
问:什么是不受支持的模块?
不受支持的模块是在GIT 存储库中每个 GeoTools 版本的modules/unsupported文件夹中找到的模块。它们不是标准 GeoTools 发行版的一部分,但仍可通过 Subversion、Maven 和手动下载使用。
由于以下一个或多个原因,模块可能不受支持:
-
它正在开发中,尚未满足通用 GeoTools 发行版中包含的可用性、测试覆盖率、文档等的所有标准。
-
它缺少模块维护者。
-
它已被另一个模块取代并从一般发行版中删除,但仍有足够的有用位或活跃用户使其值得保留(至少一段时间)。
不受支持的模块好坏参半:有些是可靠且经常使用的,而有些则处于各种发展或衰退状态。找出任何特定模块状态的最佳方法是查看用户列表档案,然后,如果您想进一步检查,请将问题发布到列表中。
OpenGIS 常见问题
问:与“GeoAPI”的关系?
-
GeoAPI 始于 2002 年 James McGill(他还创立了 GeoTools)。当时的目标是为 GeoTools、deegree 和 OpenJump 等独立项目提供通用 API,允许轻松交换代码。
-
后来,开放地理空间联盟以类似的目标启动了“GO-1”项目。“地理空间对象”项目由当时位于美国的 Polexis 领导。
-
鉴于 GO-1 和 GeoAPI 目标之间的相似性,我们相互联系并设法合并了两个项目。
-
Polexis 基于 GeoAPI 2.0 制定了以下官方 OGC 规范:http : //www.opengeospatial.org/standards/go(现已停用)。
-
后来 Polxis 被 Sys Technology 收购,新的所有者和优先事项停止了他们对 GeoAPI / GO-1 的投资。
-
OGC 的 GO-1 / GeoAPI 工作组因缺乏活动而解散。
-
GeoTools 贡献者逐渐接管了 GeoAPI 项目,并在 GeoTools 2.7 中将这些接口折叠回 GeoTools OpenGIS 模块。
问:为什么我会看到与 org.opengis 命名空间相关的 Java 异常?
您可能在同一个应用程序中同时拥有 GeoAPI 和 GeoTools,并且类加载器首先查找 GeoAPI 实现。检查您的类路径,包括可能包含 GeoAPI 类的任何带阴影的 jar。
JTS 常见问题
问:JTS 和 GeoTools 是什么关系?
我们使用 Java Topology Suite 来表示“简单”几何,并使用 OpenGIS 接口来表示其他所有内容。在某些情况下,我们*定义自己的 API 模块,例如数据访问,其中“标准”不可用。
您将经常使用 JTS,因为它实际上就是 GeoTools 的“形状”。它使用像Coordinate
Point
Polygon
和LineString
-
请记住,JTS 是纯拓扑结构,而 Geometry 对象是没有意义的纯形状。对于含义,将该形状放置在地球上,您需要咨询
CoordinateReferenceSystem
. -
JTS 拓扑操作在二维笛卡尔平面中工作。考虑到这一点,可以表示三维形状,但不能用它来计算。
-
JTS 专注于线性拓扑,您需要将曲线表示为
LineString
具有许多小段的曲线。
有了这些笔记,JTS 听起来可能是有限的;相反,它专注于手头的任务——地理信息系统。虽然 3D 和曲线在 CAD 系统中可能很常见,但我们需要大量资金和原始科学才能使其适用于 GIS。其中一些工作是在带有 ISO 几何的 GeoTools 中进行的。
问:什么几何规格?
JTS 是 OGC Simple Features for SQL Specification(即 SFSQL)的实现。它涵盖了 2D 结构,如点、线和多边形。JTS 愿意携带第三点,但不将其用于计算 - 使其成为笛卡尔空间的 2.5D 解决方案。
规格 |
支持 |
执行 |
---|---|---|
SQL 的简单功能 |
2.5D,线性 |
Java 拓扑套件 |
ISO几何 |
3D,曲线 |
OpenGIS ISO 几何接口 |
GeoTools 强调使用这两种实现,但坦率地说,ISO Geometry 实现还没有准备好。
元数据常见问题
问:实用程序类?
GeoTools 还包括用于支持 GeoTools 实现的实用程序类。
在大多数情况下,这些类被视为内部类,作为消除 Java 版本之间差异的示例。
问:元数据的接口在哪里?
接口位于gt-opengis模块中。
如果您无权访问 ISO 文档(谁访问?),仅阅读 javadoc 是一个很好的起点。
问:你为什么要在 Java 6 中实现这个类?
如果您正在运行 Java 6,请随意使用 Java 6 工具。
一些实用程序类只是为了在 Java 1.4 中完成工作——它们与空间无关。您会找到已检查集合的示例(是的,我知道在 Java 5 中可用);对象缓存的实现(有一个 JSR);等等 …
问:为什么这些实用程序类在元数据模块中?
因为元数据是我们软件堆栈中“最低”的实现 jar;其他人都需要。这些类真的不够有趣,无法分离到它们自己的模块中。
问:为什么gt-metadata
包含所有这些工厂的东西?
该gt-metadata
模块介绍了一些用于将 GeoTools 连接到项目提供的服务所需的“粘合代码”。您将在此处找到涵盖日志记录和 JNDI 集成的页面。
有关如何将 GeoTools 集成到您的应用程序中的更详细讨论,请查看有关集成的高级部分。
参考常见问题
问:为什么我不能在 WMS 图层上显示 shapefile?
当 shapefile 使用的坐标参考系统和 WMS 图层使用的坐标参考系统之间的轴定义(即 X 是哪个方向?)不同时,就会发生这种情况。可以通过在显示图层之前在代码中包含此语句来请求 GeoTools 强制实施经度 - 纬度轴顺序来修复它……
Hints.putSystemDefault(Hints.FORCE_LONGITUDE_FIRST_AXIS_ORDER, Boolean.TRUE);
如果这不起作用,您可以尝试这种更残酷的系统范围方法......
System.setProperty("org.geotools.referencing.forceXY", "true");
也可以看看:
问:如何选择EPSG授权机构?
引用模块开箱即用的功能并不多 - 它需要有人
告诉它所有有趣的代码是什么意思(例如“EPSG:4326”)。
您需要在类路径中选择一个 EPSG jar;如果您的类路径上有多个 EPSG jar,您将获得一个FactoryException
.
对于大多数需求,只需使用gt-epsg-hsql
插件:
-
gt-epsg-hsql
: 将包含官方 EPSG 数据库的 HSQL 数据库解压到临时目录中,这是桌面应用程序的绝佳解决方案。
有几种选择:
-
gt-epsg-wkt
: 使用内部属性文件并且是轻量级的而不是官方和正确的。一个很好的小程序解决方案 -
gt-epsg-postgres
: 使用官方的 EPSG 数据库,你必须自己加载到 PostgreSQL 中。Java EE 应用程序的绝佳解决方案。 -
gt-epsg-access
: 直接使用官方的EPSG 数据库作为分布式。对于需要最新官方数据库的 Windows 用户来说,这是一个很好的解决方案。
问:是否支持除 EPSG 之外的其他机构?
主要模块包括 AUTO 和 AUTO2 的定义以及其他几个受 OGC 启发的想法。
Q: gt-reference 需要什么 Jars?
作为使用示例,gt-epsg-hsql
您将需要:
C:\geotools\trunk\modules\plugin\epsg-hsql>mvn dependency:tree ... ------------------------------------------------------------------------ Building EPSG Authority Service using HSQL database task-segment: [dependency:tree] ------------------------------------------------------------------------ [dependency:tree] org.geotools:gt2-epsg-hsql:jar:2.5-SNAPSHOT +- junit:junit:jar:3.8.1:test +- javax.media:jai_core:jar:1.1.3:provided +- org.geotools:gt2-referencing:jar:2.5-SNAPSHOT:compile | +- java3d:vecmath:jar:1.3.1:compile | +- commons-pool:commons-pool:jar:1.3:compile | \- org.geotools:gt2-metadata:jar:2.5-SNAPSHOT:compile | +- org.opengis:geoapi:jar:2.2-SNAPSHOT:compile | +- javax.units:jsr108:jar:0.01:compile | \- edu.oswego:concurrent:jar:1.3.4:compile +- org.geotools:gt2-sample-data:jar:2.5-SNAPSHOT:test +- hsqldb:hsqldb:jar:1.8.0.7:compile +- net.sourceforge.groboutils:groboutils-core:jar:5:test \- commons-dbcp:commons-dbcp:jar:1.2.2:test ------------------------------------------------------------------------
问:需要 Bursa-Wolf 参数吗?
GeoTools 此时使用 Bursa-Wolf 参数执行基准面偏移。如果无法从您的数据中确定这些,CoordinateReferenceSystem
我们将无法进行转换。
大多数情况下,这并不重要,因为用户在收集信息的同一数据中处理他们的信息。
-
答:宽容
快速修复包括在搜索
MathTransform
.时将“lenient”设置为 true :MathTransform transform = CRS.findMathTransform(sourceCRS, targetCRS, true);
这种方法对于显示来说已经足够好了,但不推荐用于编辑或仔细分析工作。
-
答:匹配您的 PRJ 文件
通常,当您
CoordinateReferenceSystem
从prj
shapefile 中包含的 文件加载 a 时,会发生这种情况。修复使用 CRS 实用程序类在 EPSG 数据库中查找完整定义。EPSG 数据库包含的信息多于您的
prj
文件中无法表达的信息。 -
A: Grid 基准面偏移
最后,在极少数情况下,由网格支持的基准偏移仅部分实现。Reuben Schulz 为 NADCON 实施了由网格支持的数据转移,但存在以下限制:
-
尚未集成 NADCON 网格的使用
DefaultCoordinateOperationFactory
(因此您需要手动设置) -
不包括网格提供的基准偏移的一般情况,例如西班牙基准更改 ED50-ETRS89 将不起作用
-
问:gt-reference 有什么作用?
您最终会关心这一点,因为它定义了 2D 数据实际上意味着 3D 数据的方式。
您可以进行测量(即坐标)加上坐标参考系统(含义),然后确定地球上的某个位置在 3D 空间中的位置。
很容易假设坐标在 double[] 中记录为重复的 x/y 值,这在 CAD 程序中经常进行。
在 GIS 应用程序中,我们只能希望它们是 X、Y。它们实际上是 LAT/LONG 或 LONG/LAT 或角度、角度、角度或像时间一样疯狂的东西。
给定两个,CoordinateReferenceSystems
您可以进行从一个到另一个的数学转换。所以你可以把角度/角度/角度咀嚼成你喜欢的东西,用于 3D 或 2D 显示。
当您真正拥有一些数据时,我们将再次讨论这个问题——CoordinateReferenceSystem
遗嘱会告诉您这些数据“意味着”什么。
很像3.0和“三米”。第一个是数字,第二个是长度。
问:我可以只使用引用而不使用 GeoTools 的其余部分吗?
是的,您将需要使用元数据模块和 EPSG 模块之一。以及它们的依赖项,例如单元。
问:我找不到 EPSG 代码?
您需要在您的 CLASSPATH 上安装一个且只有一个 EPSG 插件。我们推荐 gt-epsg-hsql
用于大多数用途。
问:我无法重新投影我的 shapefile(缺少“Bursa wolf 参数”)?
当您尝试使用自定义坐标参考系统重新投影 shapefile 时,会发生此错误:
MathTransform transform = CRS.findMathTransform(DefaultGeographicCRS.WGS84, moroccoCRS);
这个问题在使用自定义坐标参考系统时经常发生,如果您查看 shapefile 的 PRJ 文件,您将看到内容是正常的“众所周知的文本”。
“Bursa-Wolf 参数”定义了 shapefile 使用的球体与普通 WGS84 球体之间的关系(和转换)。
该opengis
的javadoc这里有你一些帮助:
最好的办法是查找您所在地区的普通 EPSG 代码;并更新您的prj
文件以包含官方定义。
问:如何转型?
MathTransform 接口用于一次转换(或“重新投影”)一个 DirectPosition。
您还可以使用具有辅助方法的实用程序类JTS来转换几何图形。
问:如何变换几何?
您可以使用 JTS 实用程序类在所需的投影中创建新几何:
MathTransform transform = CRS.findMathTransform(sourceCRS, targetCRS, false); Geometry targetGeometry = JTS.transform( sourceGeometry, transform);
问:如何转换信封?
对于引用的包络,您可以直接转换:
CoordinateReferenceSystem sourceCRS = CRS.decode("EPSG:4326"); ReferencedEnvelope envelope = new ReferencedEnvelope(0, 10, 0, 20, sourceCRS); // Transform using 10 sample points around the envelope CoordinateReferenceSystem targetCRS = CRS.decode("EPSG:23032"); ReferencedEnvelope result = envelope.transform(targetCRS, true, 10);
对于 JTS Envelope,请使用JTS实用程序类:
CoordinateReferenceSystem sourceCRS = CRS.decode("EPSG:4326"); CoordinateReferenceSystem targetCRS = CRS.decode("EPSG:23032"); Envelope envelope = new Envelope(0, 10, 0, 20); MathTransform transform = CRS.findMathTransform(sourceCRS, targetCRS); Envelope quick = JTS.transform(envelope, transform); // Sample 10 points around the envelope Envelope better = JTS.transform(envelope, null, transform, 10);
问:如何转换一个GridCoverage
?
您可以使用重采样操作GridCoverage
在所需的投影中生成 a 。
问:如何使用自己的自定义 CRS 扩展系统?
如果您想作为您自己的授权人,您可以在系统中注册一个额外的工厂。
这通常被那些与维护自己的官方代码集的国家标准机构合作的人使用。
您可以使用该gt-epsg-wkt
插件作为以下选项的示例:
-
通过属性文件和工厂的程序化注册
您可以使用 WKT 格式的 CRS 创建一个文件,
PropertyAuthorityFactory
使用该 CRS实例化 a :-
使用众所周知的文本 (WKT) 格式的 CRS 定义创建属性文件。
-
文件的每一行都应该是.
someUniqueCodeValue = crsInWKT
-
将该文件作为您的代码在运行时可用的资源
-
org.geotools.referencing.factory.PropertyAuthorityFactory
使用自定义代码创建权限,例如“CUSTOM”和文件的 URI -
使用
ReferencingFactoryFinder.addAuthorityFactory(..)
方法注册您的工厂
之后,可以调用所需的CRS
CUSTOM:someUniqueCodeValue
,例如,可以使用CRS.decode(..)
带有authority-colon-code的字符串命名法的方法创建CRS对象。以这种方式定义的 CRS 也将被参考子系统的其余部分考虑在内。 -
-
通过属性文件和工厂的自动注册
更复杂的方法更改步骤 3 以创建一个新类,该类既扩展
PropertyAuthorityFactory
又具有无参数构造函数,该构造函数使用正确的 URI 参数调用父类。当工厂系统初始化时,这样一个类将被自动选取,因此不再需要上面列表中的步骤 4。
问:如何添加我自己的 EPSG 代码?
该 gt-epsg-wkt
插件旨在单独使用,不应与任何其他插件gt-epsg-h2
或 gt-epsg-hsql
插件结合使用, 因为它们最终会发生冲突。
如果您想在官方数据库(即gt-epsg-hsql
或gt-epsg-h2
)提供的定义之上添加更多定义,请使用以下内容(取自 uDig 应用程序):
URL url = new URL(url, "epsg.properties"); // application directory or user directory? // where you are looking for epsg.properties if ("file".equals(proposed.getProtocol())) { File file = new File(proposed.toURI()); if (file.exists()) { epsg = file.toURI().toURL(); } } // you may try several locations... if (epsg != null) { Hints hints = new Hints(Hints.CRS_AUTHORITY_FACTORY, PropertyAuthorityFactory.class); ReferencingFactoryContainer referencingFactoryContainer = ReferencingFactoryContainer.instance(hints); PropertyAuthorityFactory factory = new PropertyAuthorityFactory( referencingFactoryContainer, Citations.fromName("EPSG"), epsg); ReferencingFactoryFinder.addAuthorityFactory(factory); ReferencingFactoryFinder.scanForPlugins(); // hook everything up }
这是一个示例 ::download:: epsg.properties。uDig 使用的文件:
18001=PROJCS["Geoscience Australia Standard National Scale Lambert Projection",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS_1978",6378135,298.26],TOWGS84[0,0,0]],PRIMEM["Greenwich",0],UNIT["Decimal_Degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["central_meridian",134.0],PARAMETER["latitude_of_origin",0.0],PARAMETER["standard_parallel_1",-18.0],PARAMETER["standard_parallel_2",-36.0],UNIT["Meter",1]] 41001=PROJCS["WGS84 / Simple Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Decimal_Degree",0.0174532925199433]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],UNIT["Meter",1]] 42101=PROJCS["WGS 84 / LCC Canada",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Decimal_Degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["central_meridian",-95.0],PARAMETER["latitude_of_origin",0],PARAMETER["standard_parallel_1",49.0],PARAMETER["standard_parallel_2",77.0],PARAMETER["false_northing",-8000000.0],UNIT["Meter",1]] 42102=PROJCS["BC_Albers",GEOGCS["GCS_North_American_1983",DATUM["North_American_Datum_1983",SPHEROID["GRS_1980",6378137,298.257222101],TOWGS84[0,0,0]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Albers_Conic_Equal_Area"],PARAMETER["False_Easting",1000000],PARAMETER["Central_Meridian",-126],PARAMETER["Standard_Parallel_1",50],PARAMETER["Standard_Parallel_2",58.5],PARAMETER["Latitude_Of_Origin",45],UNIT["Meter",1]] 42103=PROJCS["WGS 84 / LCC USA",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS_1978",6378135,298.26]],PRIMEM["Greenwich",0],UNIT["Decimal_Degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["central_meridian",-100.0],PARAMETER["latitude_of_origin",0],PARAMETER["standard_parallel_1",33.0],PARAMETER["standard_parallel_2",45.0],UNIT["Meter",1]] 42104=PROJCS["NAD83 / MTM zone 8 Québec",GEOGCS["GRS80",DATUM["GRS_1980",SPHEROID["GRS_1980",6378137,298.257222101]],PRIMEM["Greenwich",0],UNIT["Decimal_Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-73.5],PARAMETER["scale_factor",0.9999],PARAMETER["false_easting",304800],UNIT["Meter",1]] 42105=PROJCS["WGS84 / Merc NorthAm",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Decimal_Degree",0.0174532925199433]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",-96],UNIT["Meter",1]] 42106=PROJCS["WGS84 / Lambert Azim Mozambique",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Decimal_Degree",0.0174532925199433]],PROJECTION["Lambert_Azimuthal_Equal_Area"],PARAMETER["latitude_of_origin",5],PARAMETER["central_meridian",20],UNIT["Meter",1]] 42301=PROJCS["NAD27 / Polar Stereographic / CM=-98",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.978698213901],TOWGS84[-9,151,185]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Stereographic"],PARAMETER["latitude_of_origin",90],PARAMETER["central_meridian",-98.0],PARAMETER["scale_factor",0.9996],UNIT["Meter",1]] 42302=PROJCS["JapanOrtho.09 09",GEOGCS["Lon/Lat.Tokyo Datum",DATUM["Tokyo Datum",SPHEROID["anon",6377397.155,299.15281310608]],PRIMEM["Greenwich",0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["Central_Meridian",139.833333333333],PARAMETER["Latitude_of_Origin",36],PARAMETER["Scale_Factor",0.9999],UNIT["Meter",1]] 42303=PROJCS["NAD83 / Albers NorthAm",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS_1980",6378137,298.257222101],TOWGS84[0,0,0]],PRIMEM["Greenwich",0],UNIT["Decimal_Degree",0.0174532925199433]],PROJECTION["Albers_conic_equal_area"],PARAMETER["central_meridian",-96.0],PARAMETER["latitude_of_origin",23],PARAMETER["standard_parallel_1",29.5],PARAMETER["standard_parallel_2",45.5],UNIT["Meter",1]] 42304=PROJCS["NAD83 / NRCan LCC Canada",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS_1980",6378137,298.257222101],TOWGS84[0,0,0]],PRIMEM["Greenwich",0],UNIT["Decimal_Degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["central_meridian",-95.0],PARAMETER["latitude_of_origin",49.0],PARAMETER["standard_parallel_1",49.0],PARAMETER["standard_parallel_2",77.0],UNIT["Meter",1]] 42305=PROJCS["France_II",GEOGCS["GCS_NTF_Paris",DATUM["Nouvelle_Triangulation_Francaise",SPHEROID["Clarke_1880_IGN",6378249.2,293.46602]],PRIMEM["Paris",2.337229166666667],UNIT["degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["False_Easting",600000],PARAMETER["False_Northing",2200000],PARAMETER["Central_Meridian",0],PARAMETER["Standard_Parallel_1",45.898918964419],PARAMETER["Standard_Parallel_2",47.696014502038],PARAMETER["Latitude_Of_Origin",46.8],UNIT["Meter",1]] 42306=PROJCS["NAD83/QC_LCC",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS_1980",6378137,298.257222101],TOWGS84[0,0,0]],PRIMEM["Greenwich",0],UNIT["Decimal_Degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["central_meridian",-68.5],PARAMETER["latitude_of_origin",44],PARAMETER["standard_parallel_1",46],PARAMETER["standard_parallel_2",60],UNIT["Meter",1]] 42307=PROJCS["NAD83 / Texas Central - feet",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.257222101],TOWGS84[0,0,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["standard_parallel_1",31.8833333333333],PARAMETER["standard_parallel_2",30.1166666666667],PARAMETER["latitude_of_origin",29.6666666666667],PARAMETER["central_meridian",-100.333333333333],PARAMETER["false_easting",2296583.33333333333333],PARAMETER["false_northing",9842500],UNIT["US_Foot",0.30480060960121924]] 42308=PROJCS["NAD27 / California Albers",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.978698213901],TOWGS84[-9,151,185]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Albers_conic_equal_area"],PARAMETER["central_meridian",-120.0],PARAMETER["latitude_of_origin",0],PARAMETER["standard_parallel_1",34],PARAMETER["standard_parallel_2",40.5],PARAMETER["false_northing",-4000000],UNIT["Meter",1]] 42309=PROJCS["NAD 83 / LCC Canada AVHRR-2",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.257222101],TOWGS84[0,0,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["central_meridian",-95.0],PARAMETER["latitude_of_origin",0],PARAMETER["standard_parallel_1",49.0],PARAMETER["standard_parallel_2",77.0],UNIT["Meter",1]] 42310=PROJCS["WGS84+GRS80 / Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["GRS 1980",6378137,298.257222101],TOWGS84[0,0,0]],PRIMEM["Greenwich",0],UNIT["Decimal_Degree",0.0174532925199433]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],UNIT["Meter",1]] 42311=PROJCS["NAD83 / LCC Statcan",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS_1980",6378137,298.257222101],TOWGS84[0,0,0]],PRIMEM["Greenwich",0],UNIT["Decimal_Degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["central_meridian",-91.866667],PARAMETER["latitude_of_origin",63.390675],PARAMETER["standard_parallel_1",49],PARAMETER["standard_parallel_2",77],PARAMETER["false_easting",6200000],PARAMETER["false_northing",3000000],UNIT["Meter",1]] 45555=PROJCS["WRF_Lambert_Conformal_Conic 2",GEOGCS["GCS_North_American_1983",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.25722356300003]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943299]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["False_Easting",0],PARAMETER["False_Northing",0],PARAMETER["Central_Meridian",-97],PARAMETER["Standard_Parallel_1",33],PARAMETER["Standard_Parallel_2",60],PARAMETER["Latitude_Of_Origin",40.003338],UNIT["Meter",1],AUTHORITY["EPSG","45555"]] 45556=PROJCS["Albers Equal area",GEOGCS["WGS 84", DATUM["World Geodetic System 1984", SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], AUTHORITY["EPSG","6326"]], PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], UNIT["degree", 0.017453292519943295], AUTHORITY["EPSG","4326"]], PROJECTION["Albers Equal Area", AUTHORITY["EPSG","9822"]], PARAMETER["central_meridian", -96.0], PARAMETER["latitude_of_origin", 37.5], PARAMETER["standard_parallel_1", 29.833333333333336], PARAMETER["false_easting", 0.0], PARAMETER["false_northing", 0.0], PARAMETER["standard_parallel_2", 45.833333333333336], UNIT["m", 1.0], AUTHORITY["EPSG","45556"]] 54004=PROJCS["WGS84 / Simple Mercator", GEOGCS["WGS 84", DATUM["WGS_1984", SPHEROID["WGS_1984", 6378137.0, 298.257223563]], PRIMEM["Greenwich", 0.0], UNIT["degree", 0.017453292519943295]], PROJECTION["Mercator_1SP_Google"], PARAMETER["latitude_of_origin", 0.0], PARAMETER["central_meridian", 0.0], PARAMETER["scale_factor", 1.0], PARAMETER["false_easting", 0.0], PARAMETER["false_northing", 0.0], UNIT["m", 1.0], AXIS["x", EAST], AXIS["y", NORTH], AUTHORITY["EPSG","54004"]] 100001=GEOGCS["NAD83 / NFIS Seconds",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.257222101],TOWGS84[0,0,0]],PRIMEM["Greenwich",0],UNIT["Decimal_Second",4.84813681109536e-06]] 100002=PROJCS["NAD83 / Austin",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.257222101],TOWGS84[0,0,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["standard_parallel_1",31.8833333333333],PARAMETER["standard_parallel_2",30.1166666666667],PARAMETER["latitude_of_origin",29.6666666666667],PARAMETER["central_meridian",-100.333333333333],PARAMETER["false_easting",2296583.333333],PARAMETER["false_northing",9842500.0000000],UNIT["Meter",1]] 100003=PROJCS["WGS84 / Google Mercator", GEOGCS["WGS 84", DATUM["World Geodetic System 1984", SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], AUTHORITY["EPSG","6326"]], PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], UNIT["degree", 0.017453292519943295], AUTHORITY["EPSG","4326"]], PROJECTION["Mercator (1SP)", AUTHORITY["EPSG","9804"]], PARAMETER["semi_major", 6378137.0], PARAMETER["semi_minor", 6378137.0], PARAMETER["latitude_of_origin", 0.0], PARAMETER["central_meridian", 0.0], PARAMETER["scale_factor", 1.0], PARAMETER["false_easting", 0.0], PARAMETER["false_northing", 0.0], UNIT["m", 1.0], AUTHORITY["EPSG","900913"]] 900913=PROJCS["WGS84 / Google Mercator", GEOGCS["WGS 84", DATUM["World Geodetic System 1984", SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], AUTHORITY["EPSG","6326"]], PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], UNIT["degree", 0.017453292519943295], AUTHORITY["EPSG","4326"]], PROJECTION["Mercator (1SP)", AUTHORITY["EPSG","9804"]], PARAMETER["semi_major", 6378137.0], PARAMETER["semi_minor", 6378137.0], PARAMETER["latitude_of_origin", 0.0], PARAMETER["central_meridian", 0.0], PARAMETER["scale_factor", 1.0], PARAMETER["false_easting", 0.0], PARAMETER["false_northing", 0.0], UNIT["m", 1.0], AUTHORITY["EPSG","900913"]] 30031000=PROJCS["Monte Mario / Italy zone 1 - Peninsular Part/Accuracy 3-4m", GEOGCS["Monte Mario", DATUM["Monte Mario", SPHEROID["International 1924", 6378388.0, 297.0, AUTHORITY["EPSG","7022"]], TOWGS84[-104.1, -49.1, -9.9, 0.971, -2.917, 0.714, -11.68], AUTHORITY["EPSG","6265"]], PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], UNIT["degree", 0.017453292519943295], AXIS["Geodetic longitude", EAST], AXIS["Geodetic latitude", NORTH], AUTHORITY["EPSG","4265"]], PROJECTION["Transverse_Mercator"], PARAMETER["central_meridian", 9.0], PARAMETER["latitude_of_origin", 0.0], PARAMETER["scale_factor", 0.9996], PARAMETER["false_easting", 1500000.0], PARAMETER["false_northing", 0.0], UNIT["m", 1.0], AXIS["Easting", EAST], AXIS["Northing", NORTH], AUTHORITY["EPSG","30031000"]] 30031001=PROJCS["Monte Mario / Italy zone 1 - Sardinia/Accuracy 3-4m", GEOGCS["Monte Mario", DATUM["Monte Mario", SPHEROID["International 1924", 6378388.0, 297.0, AUTHORITY["EPSG","7022"]], TOWGS84[-168.6,-34.0,38.6,-0.374,-0.679,-1.379,-9.48], AUTHORITY["EPSG","6265"]], PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], UNIT["degree", 0.017453292519943295], AXIS["Geodetic longitude", EAST], AXIS["Geodetic latitude", NORTH], AUTHORITY["EPSG","4265"]], PROJECTION["Transverse_Mercator"], PARAMETER["central_meridian", 9.0], PARAMETER["latitude_of_origin", 0.0], PARAMETER["scale_factor", 0.9996], PARAMETER["false_easting", 1500000.0], PARAMETER["false_northing", 0.0], UNIT["m", 1.0], AXIS["Easting", EAST], AXIS["Northing", NORTH], AUTHORITY["EPSG","30031001"]] 30031002=PROJCS["Monte Mario / Italy zone 1 - Sicily/Accuracy 3-4m", GEOGCS["Monte Mario", DATUM["Monte Mario", SPHEROID["International 1924", 6378388.0, 297.0, AUTHORITY["EPSG","7022"]], TOWGS84[-50.2,-50.4,84.8,-0.690,-2.012,0.459,-28.08], AUTHORITY["EPSG","6265"]], PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], UNIT["degree", 0.017453292519943295], AXIS["Geodetic longitude", EAST], AXIS["Geodetic latitude", NORTH], AUTHORITY["EPSG","4265"]], PROJECTION["Transverse_Mercator"], PARAMETER["central_meridian", 9.0], PARAMETER["latitude_of_origin", 0.0], PARAMETER["scale_factor", 0.9996], PARAMETER["false_easting", 1500000.0], PARAMETER["false_northing", 0.0], UNIT["m", 1.0], AXIS["Easting", EAST], AXIS["Northing", NORTH], AUTHORITY["EPSG","30031002"]] 30041000=PROJCS["Monte Mario / Italy zone 2 - Peninsular Part/Accuracy 3-4m", GEOGCS["Monte Mario", DATUM["Monte_Mario", SPHEROID["International 1924", 6378388.0, 297.0, AUTHORITY["EPSG","7022"]], TOWGS84[-104.1, -49.1, -9.9, 0.971, -2.917, 0.714, -11.68], AUTHORITY["EPSG","6265"]], PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], UNIT["degree", 0.017453292519943295], AXIS["Lon", EAST], AXIS["Lat", NORTH], AUTHORITY["EPSG","4265"]], PROJECTION["Transverse_Mercator"], PARAMETER["central_meridian", 15.0], PARAMETER["latitude_of_origin", 0.0], PARAMETER["scale_factor", 0.9996], PARAMETER["false_easting", 2520000.0], PARAMETER["false_northing", 0.0], UNIT["m", 1.0], AXIS["x", EAST], AXIS["y", NORTH], AUTHORITY["EPSG","30041000"]] 30041001=PROJCS["Monte Mario / Italy zone 2 - Sardinia/Accuracy 3-4m", GEOGCS["Monte Mario", DATUM["Monte_Mario", SPHEROID["International 1924", 6378388.0, 297.0, AUTHORITY["EPSG","7022"]], TOWGS84[-168.6,-34.0,38.6,-0.374,-0.679,-1.379,-9.48], AUTHORITY["EPSG","6265"]], PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], UNIT["degree", 0.017453292519943295], AXIS["Lon", EAST], AXIS["Lat", NORTH], AUTHORITY["EPSG","4265"]], PROJECTION["Transverse_Mercator"], PARAMETER["central_meridian", 15.0], PARAMETER["latitude_of_origin", 0.0], PARAMETER["scale_factor", 0.9996], PARAMETER["false_easting", 2520000.0], PARAMETER["false_northing", 0.0], UNIT["m", 1.0], AXIS["x", EAST], AXIS["y", NORTH], AUTHORITY["EPSG","30041001"]] 30041002=PROJCS["Monte Mario / Italy zone 2 - Sicily/Accuracy 3-4m", GEOGCS["Monte Mario", DATUM["Monte_Mario", SPHEROID["International 1924", 6378388.0, 297.0, AUTHORITY["EPSG","7022"]], TOWGS84[-50.2,-50.4,84.8,-0.690,-2.012,0.459,-28.08], AUTHORITY["EPSG","6265"]], PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], UNIT["degree", 0.017453292519943295], AXIS["Lon", EAST], AXIS["Lat", NORTH], AUTHORITY["EPSG","4265"]], PROJECTION["Transverse_Mercator"], PARAMETER["central_meridian", 15.0], PARAMETER["latitude_of_origin", 0.0], PARAMETER["scale_factor", 0.9996], PARAMETER["false_easting", 2520000.0], PARAMETER["false_northing", 0.0], UNIT["m", 1.0], AXIS["x", EAST], AXIS["y", NORTH], AUTHORITY["EPSG","30041002"]]
覆盖范围常见问题
问:与 ISO Coverage 的关系?
在 GeoTools 中,coverage 模块位于主模块下方(定义了 Feature),因此 GeoTools GridCoverage 不是特征。
这与 ISO 19123 规范提供的 ISO Coverage 模型(其中 Coverage 扩展功能)相反。
GeoTools 'Coverage' 对象出现于开放地理空间联盟 (OGC) 发布的早期规范,称为“网格覆盖服务实现”(OGC 01-004)。
问:如何支持栅格数据?
覆盖模块的设计与 Java 中图像处理的设计密切相关。Java 在其 Java 媒体 API 中提供了三个主要子系统,这些子系统在 GeoTools 中使用和扩展。
图像输入/输出系统
访问包含图像内容的文件。这提供了访问许多标准图像格式的代码。
Java 高级成像 (JAI) 系统
它提供了一种对图像执行操作的强大方法。JAI 不仅为执行大量操作提供了高效的代码,而且还创建了一个系统,用户可以通过该系统创建操作链,这些操作链可以重复应用于图像或应用于整个图像。
JAI 图像输入/输出系统
通过将图像访问视为允许不同访问的 JAI 操作之一并将文件访问处理作为操作链中的标准步骤来组合其他两个系统。该模块还提供对其他文件格式的访问。
结合起来,这些子系统为 GeoTools 覆盖模块提供了强大的功能,但这种依赖性确实要求希望使用和扩展该模块的程序员必须学会使用这些其他 Java 模块。
为了充分利用gt-coverage
模块,开发人员应该熟悉基本的数学思想。需要了解诸如仿射变换(用于旋转和缩放)之类的想法,才能有效地使用覆盖模块。如果您需要复习,可以在任何计算机图形教科书和许多网站上对 Affines 进行解释。
问:如何使栅格数据在基于 NetBeans 的应用程序中工作?
据称,NetBeans 类加载器破坏了 ImageIO 插件机制,该机制用于定位图像格式读取器、图像输入和输出流等。要解决此问题,请在任何光栅访问之前运行以下代码行,仅运行一次:
IIORegistry.getDefaultInstance().registerApplicationClasspathSpis();
主要常见问题
问:gt-main
负责什么?
使用gt-main
扩展gt-opengis
.
该gt-main
模块负责对接口的默认实现 gt-main
和gt-opengis
。这包括特征模型、过滤器支持和样式定义的默认实现。
该gt-main
模块通过插件系统提供此功能,允许您使用 CommonFactoryFinder 而不是直接依赖此处提供的默认实现。
问:如何制作 FeatureType?
您可以使用 DataUtilities 类快速创建要素类型:
SimpleFeatureType lineType = DataUtilities.createType("LINE", "centerline:LineString,name:\"\",id:0");
为了更好的控制考虑直接使用 a FeatureTypeBuilde
:
SimpleFeatureTypeBuilder b = new SimpleFeatureTypeBuilder(); //set the name b.setName( "Flag" ); //add some properties b.add( "name", String.class ); b.add( "classification", Integer.class ); b.add( "height", Double.class ); //add a geometry property b.setCRS( DefaultGeographicCRS.WSG84 ); // set crs first b.add( "location", Point.class ); // then add geometry //build the type final SimpleFeatureType FLAG = b.buildFeatureType();
问:如何修改 FeatureType?
您不能直接修改要素类型,因为它被认为是不可变的且不会发生变化。
但是,您可以使用 FeatureTypeBuilder 创建修改后的副本:
SimpleFeatureType lineType = DataUtilities.createType("LINE", "geom:LineString,name:\"\",id:0"); SimpleFeatureTypeBuilder b = new SimpleFeatureTypeBuilder(); b.init( lineType ); b.setName("POINT"); b.add(0, "geom", Point.class ); SimpleFeatureType pointType = b.buildFeatureType();
问:如何让 FeatureCollection 与“for each”循环一起工作?
特征集合是实时数据流的包装器;因此,我们需要确保 在完成后关闭迭代器:
try (SimpleFeatureIterator iterator = featureCollection.features()) { while (iterator.hasNext()) { SimpleFeature feature = iterator.next(); // process feature } }
这个要求阻止了我们实现 Collection(并与“for each”语法兼容。恐怕这是 Java 的一个基本限制,而不是可以或应该在未来版本中解决的问题。
Q:为什么要gt-main
定义自己的Style接口?
用于 Style 的 GeoTools 接口是gt-opengis
允许可变性的接口的直接扩展。这确实有一个缺点。我们需要请您注意线程安全。
JDBC 常见问题
问:如何从 Java 企业版访问数据库?
根据您的应用程序容器(和组织策略),您可能被限制只能使用受管理员控制的数据库连接池。
您的管理员将向应用程序服务器注册数据库连接池,并使用 Java 命名和目录接口 (JNDI) 参考配置您的应用程序。
要使用带有 JNDI 名称的 GeoTools:
Map map = new HashMap(); map.put( "dbtype", "postgis"); map.put( "jndiReferenceName", "java:comp/env/jdbc/geotools"); DataStore store = DataStoreFinder.getDataStore(map);
具体dbtype
标记您将用于与数据库通信的插件。
常见问题解答
问:CQL 有什么用?
所述CQL工具类具有静态方法来解析的输入字符串为任一个过滤器 或一个表达。
这是 CQL 类最常见的用途 - 要求功能:
Filter filter = CQL.toFilter("population >= 10000000");
生成的 CQL 实用程序类是一个过滤器;您可以手动创建过滤器(使用 aFilterFactory
但这要容易得多。
问:CQL 的实现是什么版本?
定义 CQL 接受的查询谓词的输入字符串必须响应 OGC 公共查询语言的语法,该语言在来自 OGC 的 Web 目录服务 v2.0.1 中定义。
我们为该语法添加了一些扩展和修复,以修复时间表达式定义中的错误并利用它在 GeoTools 库中的使用。
问:我可以试试 CQL 吗?
如果您使用 GeoTools 进行开发,您可以通过依赖gt-cql
jar 并将CQL类作为普通 Java 应用程序运行来轻松试用 CQL 解析器。
它将在控制台(标准输入)上显示一个提示,您可以在其中输入 CQL 字符串,并以 XML 编码取回相应的过滤器。:
Expression Tester ("quit" to finish) >attr > 10 <?xml version="1.0" encoding="UTF-8"?> <ogc:PropertyIsGreaterThan xmlns="http://www.opengis.net/ogc" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml"> <ogc:PropertyName>attr</ogc:PropertyName> <ogc:Literal>10</ogc:Literal> </ogc:PropertyIsGreaterThan> >quit Bye!
问:ECQL 提供什么?
ECQL 类提供了基本 CQL 语言的扩展,它向后兼容,因此以下仍然有效:
Filter filter = ECQL.toFilter("POPULTATION >= 1000");
ECQL 的语法更灵活,更接近自然语言。例如,ECQL 允许在比较的左侧使用表达式,如下例所示
Filter filter = ECQL.toFilter("1000 <= population");
XML 常见问题解答
问:GeoTools 使用什么解析器?
我们有一系列工具可以帮助您解析和编码 XML。作为一个通用库,GeoTools 没有选择解析器来使用的奢侈。
以下解析器基于 W3C API(SAX、DOM 和 XML 转换)。您可以为要在其中使用 GeoTools 的系统选择最合适的解决方案。
技术 |
萨克斯 |
DOM |
编码 |
支持 |
笔记 |
---|---|---|---|---|---|
萨克斯 |
萨克斯 |
dom |
过滤 GML SLD |
难以追溯,解析不易扩展 |
|
DOM |
dom |
过滤 GML SLD |
宽容且易于跟踪和调试,GIS 数据的内存限制 |
||
转变 |
XML |
过滤器 GML2 SLD |
易于追溯和调试,难以针对特定数据进行配置 |
||
JABX |
萨克斯 |
dom |
XML |
不适用 |
快速但不适合动态数据,预编译 |
拉 |
萨克斯 |
dom |
不适用 |
应该将 DOM 的易用性与 XDO 和 GTXML 的流性能结合起来 |
|
XDO |
萨克斯 |
dom |
XML |
过滤器 GML SLD WMS WFS1.0 XSD |
模式辅助解析的概念证明允许流式传输到 Java 对象。代码速度快且经过良好测试,但难以追踪 |
GTXML |
萨克斯 |
dom |
XML |
过滤器 GML SLD WMS WFS1.0 WFS1.1 WPS XSD |
由 Eclipse XSD 支持的模式辅助解析来表示模式。 更容易追踪,但仍然不直接 允许流式传输大型 GIS 数据量。 |
XDO 和 GTXML 解决方案是基于配置的。您设置一个与您希望使用的数据相匹配的配置,该技术将利用任何可用的 XML 模式来帮助正确解析或编码您的内容。
Java 中的 JAXB 库有点不同,因为您从 XML 模式开始并生成解析器或编码器类以供使用。此解决方案性能良好,但不能用于 GML 等动态内容。
问:什么是 SAX?
SAX 是 XML 早期的 W3C 技术。SAX 解析器使用回调工作,它们在几个硬编码实现之间传递控制。对于基本使用,您创建自己的 SAX 解析器(比如响应正在解析的新几何)并将控制权交给 GeoTools 实现并等待它调用您。
-
允许流式传输大量内容。
-
设置相当棘手
-
重用 SAX 解析器是可能的,但重用非常棘手
因此,SAX 解析器相当“脆弱”且难以维护,目前通过硬编码在它们之间传递控制,使得对新规范的支持变得棘手。
示例:在解析过滤器控件时,如果表达式包含字面几何,则需要将其移交给几何解析器。
后来的 Schema Assisted 解析器试图让普通人即时创建一个处理程序树(他们使用模式文档来做一堆繁重的工作),它是为 SAX 解析器硬编码的。
问:什么是 DOM?
W3C 文档对象模型 (DOM) 最常用于将网页内容表示为一系列节点。这些注释形成树状结构,可用于表示内存中 XML 文档的内容。
因此,GeoTools DOM 解析器是可以在内存 DOM 中游荡的函数,尽最大努力提取内容。
委派的硬编码方式与使用 SAX 解析器的方式大致相同。
-
易于理解的技术
-
非常适合快速示例
-
很明显如何使用解析器
-
解决方案无法扩展到大量内容,因为 Steaming 不可用
-
只能处理直接使用 GML
-
总是需要额外的编码来解析你自己的内容
问:什么是 XML 转换?
传统的 XML 生成,遍历您的数据结构并调用方法来生成。
-
非常快,即使很难维护,我们也将它用于 GeoServer
-
可扩展(不将特征加载到内存中)
-
未开放结束
-
使用前需要仔细提供提示
-
可能会多次重新访问数据(对于边界框,然后是内容)
问:Schema Assisted - 你编的吗?
是的我们做了。
这种“模式辅助”解析器的想法是 GeoTools 特定的技术。那么一般的想法是利用 XML Schema 信息来最小化您需要编写的代码量。
解析器提供了一个绑定配置;每个绑定将一个 XML 元素或 XML 属性映射到 Java 类。
虽然这听起来与其他 XML 解析技术相似,但我们确实有一些主要区别:
-
在运行时特别注意模式(因此我们可以使用可用的“最佳”绑定解析新文档而不是失败)
-
确保数据没有加载到内存中;允许我们通过应用程序“流式传输”XML 文档。
-
我们正在使用第三代模式辅助解析器。
问:XDO?
XML 数据对象 (XDO) 是我们的模式辅助解析器思想的第三代(其中 SAX 绑定由 XMLSchema 引用,而不是直接硬编码)。这是一种支持读写的快速可扩展解决方案。
-
快速且经过验证的地理空间数据解决方案
-
处理 FeatureCollections 等海量内容的能力
-
如何创建新绑定并不明显
问:GTXML?
GeoTools XML (GTXML) 是第四代模式辅助解析器,使用 XML 模式数据结构(而不是硬编码)来确定要调用的绑定。XSD 用于在运行时保存我们对模式的表示。
-
模式感知允许使用新内容而无需额外编码
-
用于制作自定义绑定的代码生成器
-
大量内容的流媒体内容,如功能集合
-
支持内容生成
-
难以调试和跟踪解析或编码过程
-
代码生成器可用于快速启动绑定的开发
-
如何使用基于 Eclipse 建模对象 (EMF) 的绑定直接从模式工作的示例
问:为什么 GeoTools 不使用 JAXB?
JAXB 是一组 Java 技术(现在包含在 Java 6 中),它们能够从 XML 模式生成解析器。
有几个小组使用 JAXB 绑定了诸如 OGC 过滤器之类的东西。总的来说效果很好;但是,它确实无法响应动态协商的内容……例如 GML。
问:对于 WFS,为什么 Parser 会返回 Map?
这显示为以下错误:
-
ClassCastException java.util.HashMap cannot be cast to FeatureCollection
要理解这个错误,请记住 WFS GetFeatures 请求返回的 GML 是一个普通的 XML 文件,在顶部有对 XML 模式的引用。
对于 WFS GetFeature 响应,架构引用通常是返回 XML 架构的 DescribeFeatureType 调用。
如果此模式配置不正确(常见于 MapServer)或无法访问(常见于受限环境),我们的解析器将放弃猜测 Feature 是什么,只返回HashMap
.
笔记
如果您使用 GML 实用程序类,它将执行一些分析并创建一个临时 FeatureType 以返回您的功能。
-
查看返回的 HashMaps
-
构建与那种内容匹配的特征类型
-
构建与该 FeatureType 匹配的特征
这类似于 OGR 采取的方法;OGR 计算出“几何”在哪里;然后上升两个级别并假设这些东西是功能。
这两种方法严格来说都是解决 WFS 服务器配置错误的常见问题的方法。
以下是查看 WFS 服务器配置的方法:
-
如果您
HashMap
在期望功能时遇到返回问题,您应该检查远程服务器的 GetCapabilities 响应,例如使用浏览器:http://{URL}?SERVICE=WFS&VERSION=1.1.0&REQUEST=GetCapabilities
-
之后,确保
<ows:Operation>
元素包含实际工作的 URL -
特别是检查
DescribeFeatureType
以预期的 XML 模式响应
问:我在受限环境中,如何配置 SchemaLocator?
您可以使用 a 配置解析器SchemaLocator
(我们在内部使用它来强制解析器复制包含在 GeoTools jar 中的 GML 模式;而不是强制解析器每次都下载 GML 模式)。
-
自定义 XML 模式在受限环境中的位置(例如需要授权的多个 WFS 服务的 Web 门户,或需要对模式请求使用 HTTP 代理)。
-
创建自定义 SchemaLocator 我们从配置开始,如下所示:
GMLConfiguration configuration = new GMLConfiguration() { public void configureContext(final MutablePicoContainer container) { super.configureContext(container); String username = "geotools user"; String password = "support osgeo"; Boolean useProxy = true; XSDSchemaLocator locator = new CachingSchemaLocator(username, password, useProxy); QName key = new QName("mycustom", "schemaLocator"); container.registerComponentInstance(key, locator); } };
-
在上面的代码中,CachingSchemaLocator 是一个自定义的 XSDSchemaLocator:
public class CachingSchemaLocator implements XSDSchemaLocator { public XSDSchema locateSchema(XSDSchema schema, String namespaceURI, String rawSchemaLocationURI, String resolvedSchemaLocationURI) { ... Implementation ... } }
-
设置与解析器一起使用的配置:
Parser parser = new Parser(configuration); parser.setValidating(false); parser.setFailOnValidationError(false); parser.setStrict(false); FeatureCollection<SimpleFeatureType, SimpleFeature> features = parser.parse(... WFS response InputStream Here ...);
渲染常见问题
如何显示 shapefile?
看看教程,它提供了一个快速入门,展示了如何做到这一点。
问:什么是 SLD?
样式层描述符规范 (SLD) 是定义绘制地图时使用的样式的 OGC 标准。将其视为地图的 CSS。
GeoTools 渲染基于样式层描述符标准,详情请参见gt-opengis
模块。
本标准分为两部分:
-
Style Layer Descriptor 1.1 涵盖了样式与 Web 地图服务器的集成。
-
Symbology Encoding 1.1 涵盖了控制渲染引擎如何绘制要素的要素类型样式的定义。
问:什么是地图内容?
MapContent 对象包含一个或多个按添加顺序呈现的图层。
这不是正式gt-opengis
模块的一部分,因为它不被视为完成、完成或完成。GeoTools 社区正在积极寻求与其他项目(例如 OpenJUMP、uDig 和 Deegree)合作,以便在这些想法上进行合作。如果开源协作失败,我们将寻求与 OGC 工作组“开放 Web 上下文”文档形式的标准机构进行传统协作。
问:小部件呢?
此模块仅绘制到 Graphics2D 上下文(因此打印机或图像缓冲区)。您可以在自己的 Swing 小部件中使用此功能,以便在屏幕上绘制某些内容。
-
``gt-swing``
GeoTools 不提供全面的 GUI 组件,但
``gt-swing``
在 GeoTools 示例代码中使用的模块中有一个基本的 Swing 小部件 JMapFrame 。这可以直接在您的应用程序中使用,也可以作为编写您自己的 Swing 组件的起点。有关更多详细信息,请参阅 JMapFrame。 -
gt-swt
该
gt-swing
JMapFrame已经被移植到了SWT小部件不支持的模块。 -
挖
uDig 是围绕 Eclipse 平台构建的应用程序和 SDK,请将此视为适用于桌面应用程序的真实世界解决方案。它利用了 SWT 工具包,因此虽然您可以将其用作如何进行真正快速渲染的示例,但您将无法直接在 Swing 应用程序中使用代码。
问:光栅高级投影处理怎么样?
高级投影处理是GridCoverageRenderer
该类提供的 用于处理栅格重投影的功能。尝试读取时,这是非常有用的GridCoverage
一个BoundingBox
道口日线:最终的图像不会削减在日线,但它被复制多次的日线交叉。
可以使用同一类中的相关方法setAdvancedProjectionHandlingEnabled()启用/禁用此功能 。
问:为什么我的 SVG 外部图形显示为灰色方块?
GeoTools 使用可插拔的外部图形工厂系统在屏幕上呈现图标(有关更多详细信息,请参阅图标)。要将 SVG 文件呈现为图标,它需要访问 SVGExternalGraphics 工厂,该工厂包含在SVG Plugin 中。
啤酒常见问题
问:我有 47 个类要表示,而 ColorBrewer 最多只能表示 12 个!
随意创建您自己
Color[]
的与 StyleGenerator 一起使用。
问:但为什么它只上升到 12?
这是一个令人惊讶的常见问题!
看看上面的ColorBrewer: Color Advice for Maps网站;研究的重点是人眼无法区分很多颜色。事实上,这个数字会下降,这取决于您尝试沟通的内容(即所显示的事物具有同等重要性,或者它们是否形成了价值观的平滑传播?)。
换句话说,您可以*创建超过 12 种颜色的漂亮地图;但是如果这太复杂以至于人们无法理解,您不应该感到惊讶。
仓储管理系统常见问题
问:乱码的 PNG 图像?
几个版本的 Java 附带损坏的原生 PNG 支持(喘不过气来!)。如果您发现 WMS 图像乱码,您可以尝试以下操作:
ImageUtilities.allowNativeCodec("png", ImageReaderSpi.class, false);
此代码片段禁用了本机 PNG 阅读器(纯 Java 阅读器很好;在某些平台上速度更快)。
秋千常见问题
问:JMapPane 有什么用?
JMapPane 类主要用作用于探索 GeoTools 库的教程的教学辅助 工具。
它是与用户列表合作开发的,虽然不打算用作 GIS 应用程序,但它是尝试您的想法的一个很好的起点。
问:模拟汽车在地图上移动的最佳方法是什么?
您可以查看一个飞碟演示;但真正的答案是设置第二个栅格来吸引您的移动汽车;并将其绘制在由 呈现的地图的顶部gt-renderer
。
请记住,JMapPane 只是一个演示,展示了如何使用 StreamingRenderer 绘制到 BufferedImage 中。你可以在自己的代码中做同样的事情;并为地图提供一张缓冲图像,并为您的“叠加层”(包括行驶的汽车)提供第二张缓冲图像。
问:JMapPane 很慢我如何使它更快?
这实际上取决于您如何使用 GeoTools 渲染器。请记住,GeoTools 渲染器正在执行大量计算和数据访问;不是你在动画中间想要的。
所述gt-renderer
针对存储器使用进行了优化; 它不会将您的数据加载到内存中(它每次都从磁盘或数据库中提取)。如果您想要更快的性能,您可以尝试将数据加载到内存中(特别是加载到空间索引中)。
对于光栅渲染,除了将光栅转换为有效格式(任何格式都比 JPEG 更好)之外,您还可以使用 JAI TileCache 设置对性能进行大量控制。
参考:
建筑常见问题
什么版本的JDK?
我们的政策是在迁移到 Java 语言的新版本之前等待我们的大多数用户。总的来说,我们对 Java 企业版环境(如 websphere)的缓慢迁移感到困扰。
GeoTools 15.x 使用 Java 8。
如何从源代码构建?
用户指南中提供了完整的构建说明:
GeoTools 使用了 Maven 构建系统(部分是为了帮助我们重用来自许多其他 Java 项目的代码)。
要构建所有模块:
mvn install -Dall
将模块加载到 Eclipse IDE 中。
-
使用Windows ‣ Preferences打开首选项对话框。使用左侧的树导航到 Java > Build path > Classpath Variables 首选项页面。
-
添加一个M2_REPO类路径变量,指向 Maven 下载 jar 的本地存储库。
平台
本地存储库
视窗 XP:
C:\Documents and Settings\Jody\.m2\repository
视窗:
C:\Users\Jody.m2\repository
Linux 和 Mac:
~/.m2/repository
-
生成eclipse所需的
.project
和.classpath
文件:mvn eclipse:eclipse -Dall
-
您现在可以使用 eclipse 导入向导加载现有项目。
为什么 Maven 3 更慢?
使用默认设置,Maven 3 开箱即用并不快。
然而,新的是您可以要求它使用多个核心:
mvn install -Dall -T 2C
以上要求构建进入“线程”模式;每个核心使用两个线程。
什么构建最快?
这是我机器上最快的构建:
mvn install -DskipTests -o -T 2C
以上选项:
安装(不清理)只重新编译修改后的代码
没有配置文件或标志用于构建可选代码;只构建了核心库
skipTests
- 测试仍在构建中;他们只是没有运行
o
- 允许构建“离线”工作(因此在构建过程中不会检查外部服务器)T 2C - 每个内核使用两个线程构建
我使用此配置将所有本地更改快速推送到我的本地 maven 存储库中,以便我可以在下游应用程序(例如 uDig 或 GeoServer)中进行测试。
如何为我的 GeoTools 应用程序创建可执行 jar?
如果您熟悉 Maven,您可能已经使用程序集插件来创建独立的、可执行的 jar。坏消息是这通常不适用于 GeoTools。问题在于,GeoTools 模块通常在其META-INF/services
目录中定义一个或多个与其他模块中定义的文件同名的文件。程序集插件只是将具有相同名称的文件复制到彼此的顶部,而不是合并它们的内容。
好消息是可以使用Maven shade 插件代替它,它将正确合并META-INF/services
来自应用程序使用的每个 GeoTools 模块的文件。
下面的 pom 将为 GeoTools Quickstart模块创建一个可执行的 jar,其中包括所有必需的 GeoTools 模块及其依赖项。
<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> <groupId>org.geotools.demo</groupId> <artifactId>quickstart</artifactId> <packaging>jar</packaging> <version>1.0</version> <name>GeoTools Quickstart example</name> <url>http://geotools.org</url> <properties> <geotools.version>14.1</geotools.version> </properties> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <encoding>UTF-8</encoding> <target>1.8</target> <source>1.8</source> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>1.3.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <!-- This bit sets the main class for the executable jar as you otherwise --> <!-- would with the assembly plugin --> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <manifestEntries> <Main-Class>org.geotools.demo.Quickstart</Main-Class> </manifestEntries> </transformer> <!-- This bit merges the various GeoTools META-INF/services files --> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>org.geotools</groupId> <artifactId>gt-shapefile</artifactId> <version>${geotools.version}</version> </dependency> <dependency> <groupId>org.geotools</groupId> <artifactId>gt-epsg-hsql</artifactId> <version>${geotools.version}</version> </dependency> <dependency> <groupId>org.geotools</groupId> <artifactId>gt-swing</artifactId> <version>${geotools.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.5</version> <scope>test</scope> </dependency> </dependencies> </project>