ошибка geotools 20.5: поставщик org.geotools.referencing.factory.epsg.CartesianAuthorityFactory не может быть создан - PullRequest
0 голосов
/ 27 мая 2020

Я работаю над проектом 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

моя среда: Ubuntu 20.04 с OpenJDK 8 (64 бит) Я тестировал с другой машиной 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, но все равно обнаружил ту же ошибку. Я попытался отладить, какая часть кода в геоинструментах вызвала эту ошибку, и я узнал. Ошибка началась с последней строки Units.autoCorrect (...) следующих кодов в Parser. java class в gt-referencing lib.

    /**
     * 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);
    }

Затем я вошел в него и обнаружил следующий метод в DefaultUnitParser. java class в gt-referencing lib

DefaultUnitParser.getInstance() 
//this method returns null, with error said org.geotools.measure.units failed to instantialize.

Теперь я полностью потерялся, почему он работал и не работал после того, как они изменили свое удаленное репо ?! Если вам нужна дополнительная информация от меня, оставьте комментарий, и я все еще жду решения, так как я не могу легко изменить библиотеку geotools. Спасибо всем

Кстати, я подтвердил, что он получает правильный WKT с помощью кода: EPSG: 4326 или EPSG: 3857

UPDATE Я изменил версию geotools вниз на 12.5 , который написан на их веб-сайте https://geotools.org/about.html и переключил JTS lib на com.vividsolutions.jts, теперь он работает. Думаю, мне нужно поднять вопрос на их гитхабе.

1 Ответ

1 голос
/ 07 июня 2020

Уловка для решения такой проблемы заключается в том, чтобы увидеть, что gradle втягивает в качестве зависимостей, используя gradle -q dependencies - если у вас хорошо построенная сборка, вы должны увидеть что-то вроде: Однако если вы видите что-то вроде:

+--- 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/.

...