我正在研究一个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(“ ...
解决此类问题的技巧是使用gradle
查看gradle -q dependencies
作为依赖项的内容-如果构建良好的构建,您应该会看到类似以下内容: