2016-05-23 2 views
2

У меня есть проект, в котором я хочу загрузить в данном шейп-файле и выделять многоугольники выше определенного размера, прежде чем записывать результаты в новый шейп-файл. Может быть, не самый эффективный, но у меня есть код, который успешно делает все это, вплоть до того момента, когда он должен писать шейп-файл. Я не получаю ошибок, но полученный шейп-файл не имеет в нем никаких полезных данных. Я следил за множеством обучающих программ, но по-прежнему я начинаю пустым.Устранение неполадок 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 фс, и он возвращается нуль. Очевидно, что загрузка вновь созданного шейп-файла (который создается и имеет неправильный размер), ничего не появляется.

ответ

2

Я считаю, что вам не хватает шага для завершения/закрытия файла. Попробуйте добавить это после строки t.commit.

fs.close(); 

В качестве целесообразной альтернативы, вы можете попробовать утилиту самосвал Shapefile упоминается в DataStores шейп файл docs. Использование этого может упростить ваш второй блок кода на две или три строки.

+0

Это не значит, что ограничения функций равны нулю. Сама функция не создана должным образом. Закрытие транзакции не устранило эту проблему. И я загляну в Shapefile DataStore более подробно, спасибо! –

+0

Я пробовал еще более простой код, который просто делает MultiPolygon с отверстием, и получаю ту же проблему ... Мне явно не хватает чего-то в том, как создать эту функцию ... –

2

Решение фактически не имело никакого отношения к коду, который я опубликовал, - это имело все, что связано с моим определением FeatureType. Я не включил «the_geom» в свой тип объектов многоугольника, поэтому в файл ничего не записывалось.

Смежные вопросы