Чтение шейп-файла ESRI из zip-файла во время выполнения Runtime в Java - DataStoreFinder.getDataStore (connectParameters) возвращает значение null

Мы создаем службу для загрузки zip-файлов, содержащих ESRI-шейп-файл. Служба должна иметь возможность читать шейп-файл и делать материал с его содержимым. Поэтому я создал класс, который распаковывает zip-файл во временную папку (вложенную папку System.getProperty («java.io.tmpdir»)).

Другой класс вызывает метод unzip из Unzip-класса, а затем пытается прочитать распакованный шейп-файл с использованием Geotools. Он использует метод Geotools DataStoreFinder.getDataStore (Map params) для создания хранилища данных из распакованного шейп-файла. Здесь возникает проблема: метод getDataStore возвращает null. Я тестировал URL-адрес, он выглядит хорошо. Файл, из которого получен URL-адрес, является файлом и может быть прочитан приложением (проверен с использованием shapefile.exists (), shapefile.isFile (), shapefile.canRead ()). Итак, что может быть неправильным? Почему я возвращаю null?

Вот (соответствующий) код:

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.geotools.data.DataStore;
import org.geotools.data.DataStoreFinder;
import org.geotools.data.FeatureSource;
import org.geotools.feature.FeatureCollection;
import org.geotools.feature.FeatureIterator;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;

import com.geodan.equus.entity.dataset.BasicFeature;
import com.geodan.equus.exception.EquusException;
import com.geodan.equus.processor.EquusProcessor;
import com.geodan.util.io.UnzipUtils;
import com.vividsolutions.jts.geom.Geometry;

public class ShapefileProcessor implements EquusProcessor
{

    private static final File TEMP_UNZIP_DIR = new File(
        System.getProperty("java.io.tmpdir") + File.separator
                + "atlas_temp_unzip_dir");

    public static Set importFeatures(final File zipFile)
        throws EquusException
    {
       //Check if the input file has the zipfile extension 
        if (!zipFile.getName().endsWith(".zip"))
        {
            throw new EquusException(
                    "The file is not a zipfile. It cannot be processed.");
        }

       //Unzip the file
        try
        {
            UnzipUtils.unzip(zipFile, TEMP_UNZIP_DIR);
        }
        catch (IOException error)
        {
            throw new EquusException("The zipfile cannot be unzipped.", error);
        }

       //Validate whether the unzipped folder contains a shapefile and return it
        File shapefile = new File("");
        try
        {
            shapefile = findShapefile(TEMP_UNZIP_DIR);
        }
        catch (IOException error)
        {
            throw new EquusException(
                    "The zipfile does not contain a shapefile. Cannot process its contents.",
                error);
        }

       //Collect the features from the shapefile and put them into an iterator 
        FeatureIterator featureIterator;
        try
        {
            featureIterator = readShapefile(shapefile);
        }
        catch (EquusException e)
        {
            throw new EquusException(e.getMessage(), e);
        }

       //Create a Set filled with the features in the FeatureIterator
        Set features = createFeatureSet(featureIterator);

        return features;

    }

    private static File findShapefile(File unzipPath) throws IOException
    {
        File shapefile = new File("");
       //Find first .shp file in the unzip folder
        File[] unzippedFiles = unzipPath.listFiles();
        for (int i = 0; i < unzippedFiles.length; i++)
        {
            if (unzippedFiles[i].getName().endsWith(".shp"))
            {
                shapefile = new File(unzipPath + File.separator
                        + unzippedFiles[i].getName());
                break;
            }
        }
        if (shapefile.toString() == "")
        {
            throw new IOException("No shapefile present in '" + unzipPath
                + "'.");
        }
        return shapefile;
    }

    private static FeatureIterator readShapefile(File shapefile)
        throws EquusException
    {
       //Collects the features from a shapefile and puts them into an iterator
        FeatureCollection featureCollection;
        try
        {
            Map connectParameters = new HashMap();
            connectParameters.put("url", shapefile.toURI().toURL());
            DataStore dataStore = DataStoreFinder.getDataStore(connectParameters);
            String typeName = dataStore.getTypeNames()[0];
            FeatureSource featureSource = dataStore.getFeatureSource(typeName);
                featureCollection = featureSource.getFeatures();
        }
        catch (Exception e)
        {
            throw new EquusException(
                    "Features cannot be retrieved from the shapefile.", e);
        }
        return featureCollection.features();
    }

    private static Set createFeatureSet(
            FeatureIterator featureIterator)
    {
        SimpleFeature simpleFeature = null;
        Set features = new HashSet();
        while (featureIterator.hasNext())
        {
            simpleFeature = featureIterator.next();
            BasicFeature feature = new BasicFeature();
            feature.setGeometry((Geometry) simpleFeature.getDefaultGeometry());
            features.add(feature);
        }
        return features;
    }
}
9
nl ja de

3 ответы

Просто используйте конструктор ShapefileDataStore следующим образом:

// URL url = file.toURI().toURL();
DataStore shapefileStore = new ShapefileDataStore(url)
1
добавлено

Хотя ваш код кажется правильным, я нашел несколько отличную реализацию ключевых строк в нашей кодовой базе:

Map map = new HashMap<>();
map.put(ShapefileDataStoreFactory.URLP.key, url);
map.put(ShapefileDataStoreFactory.CREATE_SPATIAL_INDEX.key, Boolean.TRUE);
DataStore shapefileStore = DataStoreFinder.getDataStore(map);
1
добавлено

Your code is correct, but your classpath is missing the ShapeFileDataStore. Either fix your class path by adding the e.g: gt2-shapefile-2.3.2.jar

Или напрямую используйте

DataStore shapefileStore = new ShapefileDataStore(url)

Это имеет преимущество, которое вы сразу увидите, что ваш код не может скомпилировать, из-за отсутствия библиотеки шейп-файлов.

С

Iterator availableStores =  DataStoreFinder.getAvailableDataStores();

вы можете вывести список всех доступных хранилищ данных. Если пусто или если нет ShapefileDataStoreFactory, вы узнаете, что причиной является путь к классам.

0
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async