Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OperatorImportFromESRIShape causes java.lang.OutOfMemoryError #146

Open
sebastianfrey opened this issue Sep 6, 2017 · 3 comments
Open
Labels

Comments

@sebastianfrey
Copy link

Hi together,

currently I play arround with your geometry-api-java (version 1.2.1 from maven) to read an entire shape file and stumbled over the following issue:

java.lang.OutOfMemoryError: Java heap space
	at com.esri.core.geometry.AttributeStreamOfInt32.<init>(AttributeStreamOfInt32.java:61)
	at com.esri.core.geometry.AttributeStreamBase.createIndexStream(AttributeStreamBase.java:465)
	at com.esri.core.geometry.OperatorImportFromESRIShapeCursor.importFromESRIShapeMultiPath(OperatorImportFromESRIShapeCursor.java:268)
	at com.esri.core.geometry.OperatorImportFromESRIShapeCursor.importFromESRIShape(OperatorImportFromESRIShapeCursor.java:190)
	at com.esri.core.geometry.OperatorImportFromESRIShapeCursor.next(OperatorImportFromESRIShapeCursor.java:55)
	at com.esri.core.geometry.ShapeUtilTest1.readShape(ShapeUtilTest1.java:68)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:53)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123)
	at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

The below snippet shows how I try to read the shape file.

public List<Geometry> readShape(InputStream shape) throws IOException
  {
    List<Geometry> geometries = new ArrayList<>();

    ByteBuffer bb = ByteBuffer.wrap(IOUtils.toByteArray(shape));
    
    GeometryCursor cursor = OperatorImportFromESRIShape.local().execute(0,
             Geometry.Type.Unknown, new SimpleByteBufferCursor(bb));

    Geometry geometry;
    while ((geometry = cursor.next()) != null)
    {
      geometries.add(geometry);
    }

    return geometries;
  }

I Hope you can help me out with my problem. I also attached the shape file.

data.zip

@sebastianfrey
Copy link
Author

sebastianfrey commented Sep 7, 2017

Thank your for your reply.

When I try to run the provided test class in this sample, a NullPointerException is thrown. It seems that the call to ShapefileGeometryCursor#next() returns null. Any ideas?

@stolstov
Copy link
Member

stolstov commented Sep 7, 2017

@sebastianfrey I tried your data and it read 16 polygons. The GeometryCursor.next() has to return null when there are no more geometries to read.

        {
            File file = new File("c:/temp/vg/vg2500_lan.shp");
            ShapefileGeometryCursor geometryCursor = new ShapefileGeometryCursor(file);

            Geometry geom;
            int i = 0;
            while ((geom = geometryCursor.next()) != null) {
            	Polygon polygon = (Polygon) geom;
            	i++;
            }
            assertTrue(i == 16);

            Geometry.Type geometryType = geometryCursor.getGeometryType();
            assertTrue(geometryType.equals(Geometry.Type.Polygon));
        }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants