gpt4 book ai didi

java - geotools 20.5错误:无法实例化提供者org.geotools.referencing.factory.epsg.CartesianAuthorityFactory

转载 作者:行者123 更新时间:2023-12-03 05:04:21 29 4
gpt4 key购买 nike

我正在研究一个Java项目,该项目需要将WGS84转换为UMT。我使用geotools v20.5通过以下代码创建了一个转换:

transform = CRS.findMathTransform(
CRS.decode("EPSG:4326", true),
CRS.decode("EPSG:3857", true),
false);

直到geotools更改了其存储库,它才能正常工作。
当前,当我运行该程序时,我会收到警告:
WARNING: Can't load a service for category "CRSAuthorityFactory". Cause is "ServiceConfigurationError: org.opengis.referencing.crs.CRSAuthorityFactory: Provider org.geotools.referencing.factory.epsg.CartesianAuthorityFactory could not be instantiated".

然后出现以下错误:
Caused by: java.lang.NoSuchFieldError: ONE
Execution failed for task ':Application.main()'.
> Process 'command '/usr/lib/jvm/java-8-openjdk-amd64/bin/java'' finished with non-zero exit value 255

我的环境:带有OpenJDK 8(64位)的Ubuntu 20.04
我在其他Windows机器上进行了测试,但遇到相同的错误。
这是我从org.geotools使用的库
def geotoolsVersion=20.5

compile group: 'org.geotools', name: 'gt-opengis', version: geotoolsVersion
compile group: 'org.geotools', name: 'gt-referencing', version: geotoolsVersion
compile group: 'org.geotools', name: 'gt-epsg-wkt', version: geotoolsVersion
compile group: 'org.geotools', name: 'gt-geometry', version: geotoolsVersion

您可能会注意到,我正在使用gt-epsg-wkt代替那些带有db的目录,因为我可能没有生产环境中某些目录的写入权限。但是我用db测试了其他插件,仍然遇到相同的错误。
我尝试调试geotools中的代码的哪一部分导致了该错误,然后我发现了。
该错误开始于 gt中引用库的 Parser.java 类中以下代码的最后一行 Units.autoCorrect(...)
    /**
* Parses an "UNIT" element. This element has the following pattern:
*
* <blockquote>
*
* <code>
* UNIT["<name>", <conversion factor> {,<authority>}]
* </code>
*
* </blockquote>
*
* @param parent The parent element.
* @param unit The contextual unit. Usually {@link SI#METRE} or {@link SI#RADIAN}.
* @return The "UNIT" element as an {@link Unit} object.
* @throws ParseException if the "UNIT" can't be parsed.
* @todo Authority code is currently ignored. We may consider to create a subclass of {@link
* Unit} which implements {@link IdentifiedObject} in a future version.
*/
@SuppressWarnings("unchecked")
private <T extends Quantity<T>> Unit<T> parseUnit(final Element parent, final Unit<T> unit)
throws ParseException {
final Element element = parent.pullElement("UNIT");
final String name = element.pullString("name");
final double factor = element.pullDouble("factor");
final Map<String, ?> properties = parseAuthority(element, name);
element.close();
Unit<T> finalUnit = (factor != 1) ? unit.multiply(factor) : unit;
return Units.autoCorrect(finalUnit);
}

然后我进入了它,并在gt-reference lib中的 DefaultUnitParser.java 类中找到了以下方法
DefaultUnitParser.getInstance() 
//this method returns null, with error said org.geotools.measure.units failed to instantialize.

现在我完全迷失了,为什么在他们更改了远程仓库后,它仍然可以正常工作,却又无法正常工作?
如果您需要我的更多信息,请发表评论,由于我无法轻松更改geotools lib,因此我仍在等待解决方案。
谢谢大家

顺便说一句,我确认通过代码EPSG:4326或EPSG:3857获得了正确的WKT

更新
我将geotools版本更改为 12.5 ,该版本写在他们的网站 https://geotools.org/about.html上,并将JTS lib切换到com.vividsolutions.jts,现在可以正常工作了。我想可能需要在他们的github上提出一个问题。

最佳答案

解决此类问题的技巧是使用gradle来查看gradle -q dependencies是作为依赖而产生的-如果您具有良好的构建版本,则应该看到类似以下内容的内容:

+--- org.locationtech.jts:jts-core:1.16.1
+--- org.geotools:gt-opengis:23.1
| +--- commons-pool:commons-pool:1.5.4
| +--- systems.uom:systems-common-java8:0.7.2
| | +--- tec.uom:uom-se:1.0.8
| | | +--- javax.measure:unit-api:1.0
| | | \--- tec.uom.lib:uom-lib-common:1.0.2
| | | \--- javax.measure:unit-api:1.0
| | +--- si.uom:si-quantity:0.7.1
| | | \--- javax.measure:unit-api:1.0
| | \--- si.uom:si-units-java8:0.7.1
| | +--- javax.measure:unit-api:1.0
| | +--- tec.uom:uom-se:1.0.8 (*)
| | \--- si.uom:si-quantity:0.7.1 (*)
| \--- javax.media:jai_core:1.1.3
+--- org.geotools:gt-epsg-wkt:23.1
| +--- org.geotools:gt-referencing:23.1
| | +--- org.ejml:ejml-ddense:0.34
| | | \--- org.ejml:ejml-core:0.34
| | +--- commons-pool:commons-pool:1.5.4
| | +--- org.geotools:gt-metadata:23.1

但是,如果您看到类似以下内容:
+--- org.locationtech.jts:jts-core:1.16.1
+--- org.geotools:gt-opengis:23.1
+--- org.geotools:gt-epsg-wkt:23.1
+--- org.geotools:gt-geometry:23.1
+--- org.geotools:gt-referencing:23.1
+--- org.geotools:gt-main:23.1
\--- org.geotools:gt-metadata:23.1

那出事了从我对gradle的简短实验中,您似乎需要以下内容:
repositories {
maven { url "http://download.java.net/maven/2" }
maven { url "https://repo.osgeo.org/repository/release/" }
maven { url "http://maven.geo-solutions.it/" }
maven { url "https://repo.maven.apache.org/maven2" }
}

确保gradle可以找到您(和GeoTools)所需的所有依赖项。请注意,如果您使用的是GeoTools的快照,则需要 https://repo.osgeo.org/repository/snapshot/而不是 https://repo.osgeo.org/repository/release/

关于java - geotools 20.5错误:无法实例化提供者org.geotools.referencing.factory.epsg.CartesianAuthorityFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62042099/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com