在Java中从InputStream读取ESRI形状文件

在Java中从InputStream读取ESRI形状文件,java,spring,shapefile,geotools,Java,Spring,Shapefile,Geotools,我有一个web应用程序,它应该从用户的磁盘读取一个shapefile。我使用一个MultipartFileclass()来上传它。据我所知,无法从多部分文件恢复文件路径。这给我带来了一个问题,因为我使用以下代码来解释shapefile内容(我附加了构造函数,这很重要): private ShapeFile(最终文件srcFile){ 试一试{ final Map params=ImmutableMap.of(“url”,srcFile.toURI().toul()); 数据存储=新的Shapef

我有一个web应用程序,它应该从用户的磁盘读取一个shapefile。我使用一个
MultipartFile
class()来上传它。据我所知,无法从
多部分文件
恢复文件路径。这给我带来了一个问题,因为我使用以下代码来解释shapefile内容(我附加了构造函数,这很重要):

private ShapeFile(最终文件srcFile){
试一试{
final Map params=ImmutableMap.of(“url”,srcFile.toURI().toul());
数据存储=新的ShapefileDataStoreFactory().createDataStore(参数);
最终字符串typeName=dataStore.getTypeNames()[0];
featureType=dataStore.getSchema(typeName);
featureSource=dataStore.getFeatureSource(typeName);
}捕获(IOException异常){
抛出新的RuntimeException(异常);
}
}
shapefile需要构造函数中的
文件
,并且
文件
与文件的绝对路径严格关联。因此,我无法使用
多部分文件
,并在此基础上在内存(即不在文件系统中)中创建
文件
。我能做的是从
多部分文件
getInputStream()
getBytes()
中获取
InputStream

是否有方法修改
形状文件
构造函数,使其接受
输入流
或字节表?我希望避免创建临时文件

谢谢您的建议。

A是一个以多个部分发送的单个文件,A是至少3个文件的集合,可能多达12个文件,共享一个通用的基名并具有各种扩展名,例如
.shp
.shx
.dbf
.prj

因此,不可能从
InputStream
或字节集合构造
ShapeFile
对象,因为构造函数需要一次读取3个文件,以将几何体(
.shp
)绑定到属性(
.dbf
)使用分散在其余文件中的索引和其他信息。

A是一个以多个部分发送的单个文件,A是至少3个文件的集合,可能多达12个文件共享一个公共基名,并具有各种扩展名,例如
.shp
.shx
.dbf
.prj


因此,不可能从
输入流
或字节集合构建
形状文件
对象,因为构造函数需要一次读取3个文件,以便使用索引和其他分散在其余文件中的信息将几何体(
.shp
)与属性(
.dbf
)绑定。

您好,说得好!如果我只需要一个Shapefile中的坐标怎么办?也许可以将一些东西拼凑在一起来实现这一点,但库中目前没有任何东西可以实现这一点。您好,您好!如果我只需要一个Shapefile中的坐标怎么办?也许可以将一些东西拼凑在一起来实现这一点,但库中目前没有任何东西可以实现这一点。另见
    private ShapeFile(final File srcFile) {
    try {
        final Map<String, Serializable> params = ImmutableMap.of("url", srcFile.toURI().toURL());
        dataStore = new ShapefileDataStoreFactory().createDataStore(params);
        final String typeName = dataStore.getTypeNames()[0];
        featureType = dataStore.getSchema(typeName);
        featureSource = dataStore.getFeatureSource(typeName);
    } catch (IOException exception) {
        throw new RuntimeException(exception);
    }
}