GeoTools:将自定义多边形插入现有的 .shp 文件

GeoTools: insert custom Polygons into existiong .shp file

我是 Geotools 新手。现在我想在奥地利的 Shapefile 中插入一个自定义区域(多边形)。 我的代码:

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

我目前的成绩:

这张图片显示了我当前的输出。我画了一个红色的六边形来表示我未来想要的东西。 如何将此多边形插入并显示到 Shapefile 中?

首先您需要创建一个新的 Shapefile(您可以覆盖旧的,但那样很容易丢失数据)。

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

然后您需要将现有多边形复制到新文件(我假设它们位于名为 collectionSimpleFeatureCollection 中),然后是新特征:

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