Я работаю над проектом 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, теперь он работает. Думаю, мне нужно поднять вопрос на их гитхабе.