У меня есть проект, в котором я хочу загрузить в данном шейп-файле и выделять многоугольники выше определенного размера, прежде чем записывать результаты в новый шейп-файл. Может быть, не самый эффективный, но у меня есть код, который успешно делает все это, вплоть до того момента, когда он должен писать шейп-файл. Я не получаю ошибок, но полученный шейп-файл не имеет в нем никаких полезных данных. Я следил за множеством обучающих программ, но по-прежнему я начинаю пустым.Устранение неполадок Shapefile в Geotools
Первый бит кода - это то, где я читаю в шейп-файле, выбираю многоугольники, которые хочу, а затем помещаю в коллекцию объектов. Насколько мне известно, эта часть работает нормально.
public class ShapefileTest {
public static void main(String[] args) throws MalformedURLException, IOException, FactoryException, MismatchedDimensionException, TransformException, SchemaException {
File oldShp = new File("Old.shp");
File newShp = new File("New.shp");
//Get data from the original ShapeFile
Map<String, Object> map = new HashMap<String, Object>();
map.put("url", oldShp.toURI().toURL());
//Connect to the dataStore
DataStore dataStore = DataStoreFinder.getDataStore(map);
//Get the typeName from the dataStore
String typeName = dataStore.getTypeNames()[0];
//Get the FeatureSource from the dataStore
FeatureSource<SimpleFeatureType, SimpleFeature> source = dataStore.getFeatureSource(typeName);
SimpleFeatureCollection collection = (SimpleFeatureCollection) source.getFeatures(); //Get all of the features - no filter
//Start creating the new Shapefile
final SimpleFeatureType TYPE = createFeatureType(); //Calls a method that builds the feature type - tested and works.
DefaultFeatureCollection newCollection = new DefaultFeatureCollection(); //To hold my new collection
try (FeatureIterator<SimpleFeature> features = collection.features()) {
while (features.hasNext()) {
SimpleFeature feature = features.next(); //Get next feature
SimpleFeatureBuilder fb = new SimpleFeatureBuilder(TYPE); //Create a new SimpleFeature based on the original
Integer level = (Integer) feature.getAttribute(1); //Get the level for this feature
MultiPolygon multiPoly = (MultiPolygon) feature.getDefaultGeometry(); //Get the geometry collection
//First count how many new polygons we will have
int numNewPoly = 0;
for (int i = 0; i < multiPoly.getNumGeometries(); i++) {
double area = getArea(multiPoly.getGeometryN(i));
if (area > 20200) {
numNewPoly++;
}
}
//Now build an array of the larger polygons
Polygon[] polys = new Polygon[numNewPoly]; //Array of new geometies
int iPoly = 0;
for (int i = 0; i < multiPoly.getNumGeometries(); i++) {
double area = getArea(multiPoly.getGeometryN(i));
if (area > 20200) { //Write the new data
polys[iPoly] = (Polygon) multiPoly.getGeometryN(i);
iPoly++;
}
}
GeometryFactory gf = new GeometryFactory(); //Create a geometry factory
MultiPolygon mp = new MultiPolygon(polys, gf); //Create the MultiPolygonyy
fb.add(mp); //Add the geometry collection to the feature builder
fb.add(level);
fb.add("dBA");
SimpleFeature newFeature = SimpleFeatureBuilder.build(TYPE, new Object[]{mp, level,"dBA"}, null);
newCollection.add(newFeature); //Add it to the collection
}
На данный момент у меня есть коллекция, которая выглядит правильно - она имеет правильные границы и все. Следующий бит, если код - это место, где я помещаю его в новый Shapefile.
//Time to put together the new Shapefile
Map<String, Serializable> newMap = new HashMap<String, Serializable>();
newMap.put("url", newShp.toURI().toURL());
newMap.put("create spatial index", Boolean.TRUE);
DataStore newDataStore = DataStoreFinder.getDataStore(newMap);
newDataStore.createSchema(TYPE);
String newTypeName = newDataStore.getTypeNames()[0];
SimpleFeatureStore fs = (SimpleFeatureStore) newDataStore.getFeatureSource(newTypeName);
Transaction t = new DefaultTransaction("add");
fs.setTransaction(t);
fs.addFeatures(newCollection);
t.commit();
ReferencedEnvelope env = fs.getBounds();
}
}
я ставлю в самый последний код, чтобы проверить границы с FeatureStore фс, и он возвращается нуль. Очевидно, что загрузка вновь созданного шейп-файла (который создается и имеет неправильный размер), ничего не появляется.
Это не значит, что ограничения функций равны нулю. Сама функция не создана должным образом. Закрытие транзакции не устранило эту проблему. И я загляну в Shapefile DataStore более подробно, спасибо! –
Я пробовал еще более простой код, который просто делает MultiPolygon с отверстием, и получаю ту же проблему ... Мне явно не хватает чего-то в том, как создать эту функцию ... –