我正在使用JTS(来自VividSolutions)和GeoTools。我有以下代码:
public Geometry jsonToGeom(String json) throws IOException {
Geometry obj = new GeometryJSON().read(json);
return obj;
}
但是,这将返回以下RunTimeException:
java.lang.RuntimeException: java.lang.NoSuchMethodException: org.geotools.geojson.feature.FeatureHandler.<init>(com.vividsolutions.jts.geom.GeometryFactory)
at org.geotools.geojson.DelegatingHandler.createDelegate(DelegatingHandler.java:130)
at org.geotools.geojson.geom.GeometryHandler.primitive(GeometryHandler.java:68)
at org.json.simple.parser.JSONParser.parse(Unknown Source)
at org.json.simple.parser.JSONParser.parse(Unknown Source)
at org.geotools.geojson.GeoJSONUtil.parse(GeoJSONUtil.java:236)
at org.geotools.geojson.geom.GeometryJSON.parse(GeometryJSON.java:655)
at org.geotools.geojson.geom.GeometryJSON.read(GeometryJSON.java:196)
at am.abhi.experiments.geotoolstest.GeoJson.jsonToGeom(GeoJson.java:13)
at am.abhi.experiments.geotoolstest.SomeTest.testSomething(SomeTest.java:22)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at junit.framework.TestCase.runTest(TestCase.java:176)
at junit.framework.TestCase.runBare(TestCase.java:141)
at junit.framework.TestResult$1.protect(TestResult.java:122)
at junit.framework.TestResult.runProtected(TestResult.java:142)
at junit.framework.TestResult.run(TestResult.java:125)
at junit.framework.TestCase.run(TestCase.java:129)
at junit.framework.TestSuite.runTest(TestSuite.java:255)
at junit.framework.TestSuite.run(TestSuite.java:250)
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:84)
at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
Caused by: java.lang.NoSuchMethodException: org.geotools.geojson.feature.FeatureHandler.<init>(com.vividsolutions.jts.geom.GeometryFactory)
at java.lang.Class.getConstructor0(Class.java:2849)
at java.lang.Class.getConstructor(Class.java:1718)
at org.geotools.geojson.DelegatingHandler.createDelegate(DelegatingHandler.java:123)
... 33 more
在单步执行代码时,我在org.geotools.geojson.DelegatingHandler中找到了这个导致错误的方法:
protected IContentHandler createDelegate(Class clazz, Object[] args) {
try {
if (args != null && args.length > 0) {
Class[] types = new Class[args.length];
for (int i = 0; i < args.length; i++) {
types[i] = args[i].getClass();
}
return (IContentHandler) clazz.getConstructor(types).newInstance(args);
}
else {
return (IContentHandler) clazz.newInstance();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
在return (IContentHandler) clazz.getConstructor(types).newInstance(args)
行。
当它调用FeatureHandler并尝试将GeometryFactory作为参数传递时失败。我在JTS 1.8和GeoTools 13-SNAPSHOT上。
任何帮助或解决方法都将不胜感激。
答案 0 :(得分:1)
我遇到了同样的问题 - 但事实证明它与类路径或JTS版本无关。事实证明,人们使用术语&#34; GeoJSON&#34;意味着不止一件事。
我下载了一些GeoJSON files to describe timezones,其中包含json:
{
"type": "FeatureCollection",
"features": [
{
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
...
如果您使用此问题中的代码来阅读该文件:
Geometry obj = new GeometryJSON().read(json);
但是你的json文件实际上就像我的FeatureJSON,你会得到报告的(无用的)错误消息。相反,尝试这样的事情:
FeatureJSON fjson = new FeatureJSON();
InputStream is = this.getClass().getClassLoader().getResourceAsStream("test.geojson");
FeatureCollection features = fjson.readFeatureCollection(is);
答案 1 :(得分:0)
您的JTS版本错误 - 我怀疑这意味着您没有使用maven。您需要1.13版才能使用GeoTools 13-SNAPSHOT。
$ mvn dependency:tree
[INFO] Scanning for projects...
[INFO]
[INFO] Using the builder org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder with a thread count of 1
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building GeoJSON Support 13-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ gt-geojson ---
[INFO] org.geotools:gt-geojson:jar:13-SNAPSHOT
[INFO] +- org.geotools:gt-main:jar:13-SNAPSHOT:compile
[INFO] | +- org.geotools:gt-api:jar:13-SNAPSHOT:compile
[INFO] | +- com.vividsolutions:jts:jar:1.13:compile
[INFO] | \- org.jdom:jdom:jar:1.1.3:compile
[INFO] +- com.googlecode.json-simple:json-simple:jar:1.1:compile
[INFO] +- org.geotools:gt-epsg-hsql:jar:13-SNAPSHOT:test
[INFO] | +- org.geotools:gt-referencing:jar:13-SNAPSHOT:compile
[INFO] | | +- java3d:vecmath:jar:1.3.2:compile
[INFO] | | +- commons-pool:commons-pool:jar:1.5.4:compile
[INFO] | | +- org.geotools:gt-metadata:jar:13-SNAPSHOT:compile
[INFO] | | | \- org.geotools:gt-opengis:jar:13-SNAPSHOT:compile
[INFO] | | | \- net.java.dev.jsr-275:jsr-275:jar:1.0-beta-2:compile
[INFO] | | \- jgridshift:jgridshift:jar:1.0:compile
[INFO] | \- org.hsqldb:hsqldb:jar:2.2.8:test
[INFO] +- javax.media:jai_core:jar:1.1.3:compile
[INFO] \- junit:junit:jar:4.11:test
[INFO] \- org.hamcrest:hamcrest-core:jar:1.3:test
答案 2 :(得分:0)
为我解决这个问题的原因是我有一个使用JTS 1.8的项目,以及运行1.13的Geotools。在Spring-Boot中,显然只有1.8结束于jar中,从而导致冲突和方法未被发现。我将我的依赖项目更改为与geotools相同的版本,并且已修复。