Чтение шейп-файлов ESRI из InputStream в Java

У меня есть веб-приложение, которое должно читать шейп-файл с пользовательского диска. Я использую класс MultipartFile (https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/multipart/MultipartFile.html), чтобы загрузить его. Насколько я понимаю, восстановить путь к файлу из MultipartFile невозможно. Это вызывает у меня проблему, потому что я использую следующий код для интерпретации содержимого шейп-файла (я прикрепляю крайне важный конструктор):

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

Шейп-файлу требуется File в конструкторе, а File строго связан с абсолютным путем к файлу. Поэтому я не могу использовать MultipartFile и создать File в памяти (т.е. не в файловой системе) на основе этого. Что я могу сделать, так это получить InputStream из MultipartFile, getInputStream() или getBytes().

Есть ли способ изменить конструктор Shapefile таким образом, чтобы он принимал InputStream или таблицу байтов? Я хотел бы избежать создания временного файла.

Спасибо за предложения.


person Ghostwriter    schedule 27.12.2019    source источник


Ответы (1)


MultiPartFile представляет собой один файл, отправляемый в нескольких частях, ShapeFile представляет собой набор не менее 3 и, возможно, до 12 файлов с общим базовым именем и различными расширениями, такими как .shp, .shx, .dbf, .prj и т. д.

Таким образом, невозможно создать объект ShapeFile из коллекции InputStream или байтов, так как конструктору необходимо одновременно читать из 3 файлов, чтобы связать геометрию (.shp) с атрибутами (.dbf), используя индекс и другую информацию, разбросанную по оставшимся файлам. .

person Ian Turton    schedule 27.12.2019
comment
Привет, хорошая мысль! Что, если мне нужны только координаты из шейп-файла? - person Ghostwriter; 02.01.2020
comment
Возможно, для этого можно что-то взломать, но в настоящее время в библиотеке нет ничего для этого. См. также gis.stackexchange.com/questions/180515 / - person Ian Turton; 02.01.2020