项目上传一个大约2G的shipe文件 需要转换坐标,平时上传小的文件挺正常的, 这次上传了一个大的文件就报BufferUnderflowException异常了,有大神知道怎么回事么, 代码如下:
public static JSONObject generateW84Shapefile(
SimpleFeatureSource featureSource, String shapeFileName, File inputFolder, File outputFolder,
boolean keepFileName, int fileCoordinateType) throws JSONException {
JSONObject jo = new JSONObject();
try {
if (!outputFolder.exists()) {
outputFolder.mkdirs();
}
SimpleFeatureType schema = featureSource.getSchema();
CoordinateReferenceSystem dataCRS = schema.getCoordinateReferenceSystem();
if (dataCRS == null) { // can't find projection
log.error("Error: Can't find the projection of the uploaded shapefile.");
jo.put("Error", "Can't find the projection of the uploaded shapefile.");
} else {
Integer epsgCode = -1;
try {
epsgCode = CRS.lookupEpsgCode(dataCRS, true);
log.info("EPSG code of the source feature: " + epsgCode);
} catch (Exception ee) {
log.error("Error in finding the EPSG code of the source feature", ee);
}
int count = 0;
if (epsgCode == null || epsgCode != 4326 || fileCoordinateType != 1) {
CoordinateReferenceSystem wgs84CRS = CRS.decode("EPSG:4326");
File newShapeFile = new File(outputFolder,
shapeFileName + ((keepFileName || fileCoordinateType == 1) ? ".shp" : "_gcj02.shp"));
DataStoreFactorySpi factory = new ShapefileDataStoreFactory();
Map<String, Serializable> create = new HashMap<String, Serializable>();
create.put("url", newShapeFile.toURI().toURL());
create.put("create spatial index", Boolean.TRUE);
DataStore dataStore = factory.createNewDataStore(create);
SimpleFeatureType featureType = SimpleFeatureTypeBuilder.retype(schema, wgs84CRS);
dataStore.createSchema(featureType);
// Get the name of the new Shapefile, which will be used to
// open the FeatureWriter
String createdName = newShapeFile.getName().substring(0, newShapeFile.getName().lastIndexOf('.'));
Transaction transaction = new DefaultTransaction("Reproject");
FeatureWriter<SimpleFeatureType, SimpleFeature> writer = dataStore
.getFeatureWriterAppend(createdName, transaction);
SimpleFeatureCollection featureCollection = featureSource.getFeatures();
SimpleFeatureIterator iterator = featureCollection.features();
boolean projected = true;
MathTransform transform = null;
boolean lenient = true; // allow for some error due to
// different datums
transform = CRS.findMathTransform(dataCRS,wgs84CRS, lenient);
try {
while (iterator.hasNext()) { **//这一行报的错**
// copy the contents of each feature and transform
// the geometry
SimpleFeature feature = iterator.next();
SimpleFeature copy = writer.next();
copy.setAttributes(feature.getAttributes());
Geometry geometry = (Geometry) feature.getDefaultGeometry();
Geometry geometry2;
if (epsgCode == null || epsgCode != 4326) {
geometry2 = JTS.transform(geometry, transform);
} else {
geometry2 = (Geometry) geometry.clone();
}
if(fileCoordinateType == 2) {//bd09
geometry2 = GCJConverter.bd09toGCJ(geometry2);
}else if(fileCoordinateType == 3) {
geometry2 = GCJConverter.toGCJ(geometry2);
}
copy.setDefaultGeometry(geometry2);
writer.write();
count++;
}
writer.close();
transaction.commit();
} catch (Exception e) {
e.printStackTrace();
projected = false;
log.error("Error: Can't reproject the uploaded shapefile.", e);
log.info("count===>"+count);
transaction.rollback();
} finally {
transaction.close();
dataStore.dispose();
iterator.close();
}
if (!projected) {
jo.put("Error", "Can't reproject the uploaded shapefile.");
} else {
shapeFileName = createdName;
jo.put("reprojected", projected);
}
}
}
} catch (Exception e) {
log.error("Error: Can't reproject the uploaded shapefile.", e);
jo.put("Error", "Can't reproject the uploaded shapefile.");
}
jo.put("shapefileName", shapeFileName);
return jo;
}
报错信息:
java.nio.BufferUnderflowException
at java.nio.Buffer.nextGetIndex(Buffer.java:500)
at java.nio.DirectByteBuffer.get(DirectByteBuffer.java:249)
at org.geotools.data.shapefile.dbf.DbaseFileReader.read(DbaseFileReader.java:427)
at org.geotools.data.shapefile.dbf.DbaseFileReader.readRow(DbaseFileReader.java:321)
at org.geotools.data.shapefile.ShapefileFeatureReader.hasNext(ShapefileFeatureReader.java:187)
at org.geotools.data.store.ContentFeatureCollection$WrappingFeatureIterator.hasNext(ContentFeatureCollection.java:143)
at com.XXX.util.ProjectUtils.generateW84Shapefile(ProjectUtils.java:203)
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.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:151)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:172)
at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:195)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:104)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:384)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:342)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:101)
at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:271)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:297)
at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:254)
at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1030)
at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:377)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:344)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:221)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:494)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:1025)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
at org.apache.coyote.ajp.AjpNioProcessor.process(AjpNioProcessor.java:175)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1775)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1734)