GeoTools: вставьте пользовательские полигоны в файл existiong .shp - PullRequest
0 голосов
/ 05 августа 2020

Я новичок в Geotools. Теперь я хочу вставить произвольную область (многоугольник) в шейп-файл Австрии. Мой код:

 public static void main(String[] args) throws IOException {
        File file = new File("src/main/java/org/geotools/austria.shp");
        Map<String, Object> map = new HashMap<>();
        map.put("url", file.toURI().toURL());

        DataStore dataStore = DataStoreFinder.getDataStore(map);
        String typeName = dataStore.getTypeNames()[0];
        FeatureSource<SimpleFeatureType, SimpleFeature> source =
                dataStore.getFeatureSource(typeName);

        MapContent showmap = new MapContent();
        showmap.setTitle("Austria");

        Style style = SLD.createSimpleStyle(source.getSchema());
        Layer layer = new FeatureLayer(source, style);
        showmap.addLayer(layer);

        // display the map
        JMapFrame.showMap(showmap);
    }

Мой текущий результат:

Файл формы Австрия с нарисованным многоугольником

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

1 Ответ

0 голосов
/ 06 августа 2020

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

SimpleFeatureType TYPE = dataStore.getSchema(typeName);
File newFile = new File("output.shp");
ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory();

Map<String, Serializable> params = new HashMap<String, Serializable>();
params.put("url", URLs.fileToURL(newFile));
params.put("create spatial index", Boolean.TRUE);

ShapefileDataStore newDataStore = (ShapefileDataStore) dataStoreFactory.createNewDataStore(params);
newDataStore.createSchema(TYPE);

Затем вам нужно скопировать существующие многоугольники в новые файл (я предполагаю, что они находятся в SimpleFeatureCollection с именем collection), за которым следуют новые функции:

Transaction transaction = new DefaultTransaction("create");

String typeName = newDataStore.getTypeNames()[0];
SimpleFeatureSource featureSource = newDataStore.getFeatureSource(typeName);

if (featureSource instanceof SimpleFeatureStore) {
    SimpleFeatureStore featureStore = (SimpleFeatureStore) featureSource;

    featureStore.setTransaction(transaction);
    try {
        featureStore.addFeatures(collection);
        
        // Now add the hexagon
        featureStore.addFeatures(DataUtilities.collection(hexagon));
        transaction.commit();
     } catch (Exception problem) {
        problem.printStackTrace();
        transaction.rollback();
        System.exit(-1);
     } finally {
        transaction.close();
     }
} else {
    System.out.println(typeName + " does not support read/write access");
    System.exit(1);
}
...