geotools 20.5错误:提供程序org.geotools.referencing.factory.epsg.CartesianAuthorityFactory无法实例化

问题描述 投票:0回答:1

我正在研究一个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-referencing lib。]中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

UPDATE

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

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

java geotools
1个回答
0
投票

解决此类问题的技巧是使用gradle查看gradle -q dependencies作为依赖项的内容-如果构建良好的构建,您应该会看到类似以下内容:

© www.soinside.com 2019 - 2024. All rights reserved.