Daha çox

Java-da GeoTools istifadə edərək shapefile CSV sənədinə çevrilir?


Geotools istifadə edərək Java-da toplu işləmə yolu ilə formalı sənədlərimi CSV-yə çevirməyə çalışıram. Problem 500-dən çox formalı sənədimin (nöqtə xüsusiyyətləri) olmasıdır. Kod az sayda shp faylı üçün yaxşı işləyir. Ancaq prosesi böyük bir verilənlər bazası (fayl sayı) üzərində təkrarlayarkən, bəzi fayllar yazılmamış və 0 KB. Bunun niyə baş verdiyinə dair bir məlumatım yoxdur.

Bütün faylların shp-dən CSV-ə çevrilməsini istəyirəm.

Budur java kodum-

// shp2csv dönüşüm idxal java.io.BufferedWriter; idxal java.io.File; idxal java.io.FileWriter; idxal java.io.IOException; idxal org.geotools.data.FileDataStore; idxal org.geotools.data.FileDataStoreFinder; idxal org.geotools.data.shapefile.ShapefileDataStore; idxal org.geotools.data.simple.SimpleFeatureCollection; idxal org.geotools.data.simple.SimpleFeatureIterator; idxal org.geotools.data.simple.SimpleFeatureSource; idxal org.opengis.feature.simple.SimpleFeature; public class GeoOpen {private static SimpleFeatureIterator simpleFeatureIterator; statik FileDataStore mağazası; statik simli; public statik boolean openShapeFile (File srcfname) Exception {String filename = srcfname.getAbsolutePath (); File dataFile = yeni Fayl (fayl adı); dataFile.setReadOnly (); store = FileDataStoreFinder.getDataStore (dataFile); // ShapefileDataStore mağazası = yeni ShapefileDataStore (dataFile.toURL ()); SimpleFeatureSource source = store.getFeatureSource (); SimpleFeatureCollection featureCollection = source.getFeatures (); simpleFeatureIterator = featureCollection.features (); doğru qayıt; } ümumi statik boolean yineleme (File srcfname, String dest_path) {File dest_file = srcfname; String dest_filename = GeoOpen.getFileNameWithoutExtension (dest_file) + ". Csv"; {BufferedWriter bw = yeni BufferedWriter (yeni FileWriter (dest_path + dest_filename)) cəhd edin; bw.write ("ID" + "," + "date" + "," + "tstamp" + "," + "X_prj" + "," + "Y_prj" + "," + "NEAR_FID" + ", "+" NEAR_DIST "); while (simpleFeatureIterator.hasNext ()) {SimpleFeature f = simpleFeatureIterator.next (); // System.out.println ("" + f.getID () + "," + f.getAttribute (1) + "," + f.getAttribute (2)); // ID, sahə 1: lat, sahə 2: uzun // CSV sənədində yazma bw.write (" n"); int index = f.getID (). lastIndexOf ('.'); ID = f.getID (). Alt sətir (indeks + 1); // yalnız identifikatoru əldə edin // varsayılan identifikator, bID.write (Integer.parseInt (ID) + "," + f.getAttribute (1) .toString () + "adlanan getID () metodu olduqda filename.ID formatı ilə gəlir. , "+ f.getAttribute (2) +", "+ f.getAttribute (3) +", "+ f.getAttribute (4) +", "+ f.getAttribute (5) +", "+ f.getAttribute (6)); }} tutmaq (IOException e) {e.printStackTrace (); } tutmaq (istisna ex) {ex.printStackTrace (); } nəhayət {simpleFeatureIterator.close (); store.dispose (); } true qayıt; } ümumi statik String getFileNameWithoutExtension (File f) {String; int index = f.getName (). lastIndexOf ('.'); //System.out.println (indeks); if (index> 0 && index <= f.getName (). length () - 2) {s = f.getName (). substring (0, index)); } s; } public static void main (String [] args) {try {String dest_path = "C:  ArcGIS test data  commonfiles csv  001  nr_train "; File src_dir = yeni Dosya ("C:  ArcGIS test data  commonfiles prj  001  nearTrain"); Fayl [] file_nr = src_dir.listFiles (); // üçün yaxınRoad-dan faylları olan sıra (int i = 0; i

Eyni problemim var idi. Problemi həll etdim.

Mənim həll yolum:

StringBuffer tmpStr = yeni StringBuffer (); tmpStr.append ("ID, tarix, tstamp, X_prj, Y_prj, NEAR_FID, NEAR_DIST  n"); SimpleFeature f = null; int indeksi = 0; String ID = null; while (simpleFeatureIterator.hasNext ()) {f = simpleFeatureIterator.next (); index = f.getID (). lastIndexOf ('.'); ID = f.getID (). Alt sətir (indeks + 1); tmpStr.append (Integer.toString (Integer.parseInt (ID))). append (",") .append (f.getAttribute (1) .toString ()). append (",") .append (f.getAttribute) (2) .toString ()). Append (",") .append (f.getAttribute (3) .toString ()). Append (",") .append (f.getAttribute (4) .toString ()) .append (",") .append (f.getAttribute (5) .toString ()). append (",") .append (f.getAttribute (6) .toString ()). append (" n") ; } BufferedWriter bw = yeni BufferedWriter (yeni FileWriter (dest_path + dest_filename)); bw.write (tmpStr.toString ()); bw.close ();


Bunu etmək üçün ən asan yol, bir neçə üstünlüyü olan GeoTools CSV məlumat deposundan istifadə etməkdir, ən açıq şəkildə bütün verilənlər bazasını yaddaşda saxlamağa ehtiyac olmadığı, bundan sonra qərar verdiyiniz təqdirdə fərqli bir çıxış mağazası seçə biləcəyiniz açıqdır. bir çox kodu dəyişdirmək məcburiyyətində qaldığınız üçün saxlama metodunuzu dəyişdirin.

Fayl inFile = yeni Fayl ("/ home / ian / Data / states / states.shp"); File outFile = new File ("states.csv"); outFile.createNewFile (); // DataStore inputDataStore = DataStoreFinder.getDataStore oxuyun (Collections.singletonMap ("url", URLs.fileToUrl (inFile))); String inputTypeName = inputDataStore.getTypeNames () [0]; SimpleFeatureType inputType = inputDataStore.getSchema (inputTypeName); Xüsusiyyət mənbəyi source = inputDataStore.getFeatureSource (inputTypeName); XüsusiyyətCollection inputFeatureCollection = source.getFeatures (); // FileDataStore yazın newDataStore = FileDataStoreFinder.getDataStore (outFile); newDataStore.createSchema (inputType); String typeName = newDataStore.getTypeNames () [0]; SimpleFeatureStore featureStore = (SimpleFeatureStore) newDataStore.getFeatureSource (typeName); xüsusiyyətStore.addFeatures (inputFeatureCollection);


Videoya baxın: EXCEL Vers Shapefile CSV to SHP QGis (Oktyabr 2021).