5

I am using JTS (from VividSolutions) and GeoTools. I have the following code:

public Geometry jsonToGeom(String json) throws IOException {
    Geometry obj = new GeometryJSON().read(json);
    return obj;
}

However, this returns the following 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

On stepping through the code, I found this method in org.geotools.geojson.DelegatingHandler which causes the error:

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

on line return (IContentHandler) clazz.getConstructor(types).newInstance(args).

It fails when it calls FeatureHandler and tries to pass a GeometryFactory as an argument. I am on JTS 1.8 and GeoTools 13-SNAPSHOT.

Any help or workaround would be appreciated.

Abhishek Dey Das
  • 587
  • 7
  • 23

3 Answers3

3

I had this same problem - but it turned out to have nothing to do with the classpath or the version of JTS. It turns out that people use the term "GeoJSON" to mean more than one thing.

I downloaded some GeoJSON files to describe timezones and it contained json like this:

{
  "type": "FeatureCollection", 
  "features": [
    {
      "geometry": {
        "type": "MultiPolygon", 
        "coordinates": [
          [
...

If you use the code in this question to read that file:

Geometry obj = new GeometryJSON().read(json); 

but your json file is actually FeatureJSON like mine, you'll get the (unhelpful) error messages reported. Instead, try something like this:

FeatureJSON fjson = new FeatureJSON();
InputStream is = this.getClass().getClassLoader().getResourceAsStream("test.geojson");
FeatureCollection features = fjson.readFeatureCollection(is);
nont
  • 9,322
  • 7
  • 62
  • 82
  • Hey, Any chance you guys, @nont @Abhishek-Dey-Das, solved this issue in a different way? The [Official geojson specification](http://geojson.org/geojson-spec.html) suggests that _Feature_ and _FeatureCollection_ types are perfectly valid as `GeoJson` types. My problem is I read a json that contains geojson. I don't know which type it will hold, and I don't want to "guess" it using try-catch mechanism – Ghost93 Feb 15 '16 at 21:48
  • The original code uses `new GeometryJSON.read()` - I would expect `GeoJSON.read()` to cope fine, but it's fair for the geometry reader to fail when given objects that are not themselves valid geometries. – James Fry Feb 16 '17 at 09:24
0

You have the wrong version of JTS - which I suspect means you didn't use maven. You need version 1.13 to work with 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
Ian Turton
  • 10,018
  • 1
  • 28
  • 47
  • I think there's more to it - I'm using maven with geotools 13.0, and it's giving me the same error msg. I think there's some other class path conflict – nont Aug 11 '15 at 13:10
  • @nont you'll be better off asking a new question which includes your code so I can try to build and run it – Ian Turton Aug 11 '15 at 13:16
  • 1
    actually, it turns out it had nothing to do with the JTS version or the classpath. – nont Aug 11 '15 at 14:43
0

What solved this for me was that I had one project using JTS 1.8, and Geotools running 1.13. In Spring-Boot apparently only the 1.8 was ending up in the jar, thus causing a conflict and a methodnotfound. I changed my dependant project to the same version as geotools and it was fixed.

Mark Giaconia
  • 3,844
  • 5
  • 20
  • 42