أكثر

تحويل ملف الأشكال إلى ملف CSV باستخدام GeoTools في جافا؟

تحويل ملف الأشكال إلى ملف CSV باستخدام GeoTools في جافا؟


أحاول تحويل ملفات الشكل الخاصة بي إلى csv من خلال معالجة مجمعة في Java باستخدام Geotools. المشكلة هي أن لدي أكثر من 500 ملف شكل (ميزات النقطة). الكود يعمل بشكل جيد لعدد صغير من ملفات shp. ولكن عندما أقوم بتكرار العملية على مجموعة بيانات كبيرة (عدد الملفات) ، فإن بعض الملفات غير مكتوبة ويبلغ حجمها 0 كيلوبايت. ليس لدي أدنى فكرة عن سبب حدوث ذلك.

أريد تحويل جميع الملفات من shp إلى csv.

هذا هو كود جافا الخاص بي-

// shp2csv تحويل استيراد java.io.BufferedWriter ؛ استيراد ملف java.io. استيراد java.io.FileWriter ؛ استيراد java.io.IOException ؛ استيراد org.geotools.data.FileDataStore ؛ استيراد org.geotools.data.FileDataStoreFinder ؛ استيراد org.geotools.data.shapefile.ShapefileDataStore ؛ استيراد org.geotools.data.simple.SimpleFeatureCollection ؛ استيراد org.geotools.data.simple.SimpleFeatureIterator ؛ استيراد org.geotools.data.simple.SimpleFeatureSource ؛ import org.opengis.feature.simple.SimpleFeature؛ فئة عامة GeoOpen {private static SimpleFeatureIterator simpleFeatureIterator؛ مخزن FileDataStore ثابت ؛ سلسلة ثابتة public static boolean openShapeFile (File srcfname) يطرح استثناء {String filename = srcfname.getAbsolutePath () ؛ ملف dataFile = ملف جديد (اسم الملف) ؛ dataFile.setReadOnly () ، store = FileDataStoreFinder.getDataStore (ملف بيانات) ؛ // ShapefileDataStore store = new ShapefileDataStore (dataFile.toURL ()) ؛ SimpleFeatureSource = store.getFeatureSource () ، SimpleFeatureCollection featureCollection = source.getFeatures () ، simpleFeatureIterator = featureCollection.features () ، العودة صحيح } التكرار المنطقي العام الثابت (File srcfname، String dest_path) {File dest_file = srcfname؛ String dest_filename = GeoOpen.getFileNameWithoutExtension (dest_file) + ". csv" ؛ جرب {BufferedWriter bw = new BufferedWriter (new FileWriter (dest_path + dest_filename)) ؛ 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))؛ // المعرف ، الحقل 1: خط العرض ، الحقل 2: طويل // الكتابة في ملف CSV bw.write (" n") ؛ فهرس int = f.getID (). lastIndexOf ('.') ؛ المعرف = f.getID (). سلسلة فرعية (فهرس + 1) ؛ // الحصول على المعرف // فقط بواسطة المعرف الافتراضي يأتي بتنسيق filename.ID عندما تكون طريقة getID () تسمى bw.write (Integer.parseInt (ID) + "،" + f.getAttribute (1) .toString () + " ، "+ f.getAttribute (2) +"، "+ f.getAttribute (3) +"، "+ f.getAttribute (4) +"، "+ f.getAttribute (5) +"، "+ f.getAttribute (6)) ؛ }} catch (IOException e) {e.printStackTrace ()؛ } catch (استثناءً) {ex.printStackTrace ()؛ } أخيرًا {simpleFeatureIterator.close ()؛ store.dispose () ؛ } عودة صحيحة؛ } السلسلة الثابتة العامة getFileNameWithoutExtension (File f) {String؛ فهرس int = f.getName (). lastIndexOf ('.') ؛ //System.out.println (فهرس) ؛ if (index> 0 && index <= f.getName (). length () - 2) {s = f.getName (). substring (0، index)؛ } عائدات؛ } main (String [] args) العامة الثابتة الفارغة {try {String dest_path = "C:  ArcGIS test data  commonfiles csv  001  nr_train "؛ File src_dir = ملف جديد ("C:  ArcGIS test data  commonfiles prj  001  nearTrain") ؛ ملف [] file_nr = src_dir.listFiles () ، // مجموعة تحتوي على ملفات من nearRoad لـ (int i = 0 ؛ i

كان لدي نفس المشكلة. حللت المشاكل.

بلدي الحل:

StringBuffer tmpStr = جديد StringBuffer () ؛ tmpStr.append ("المعرف ، التاريخ ، tstamp ، X_prj ، Y_prj ، NEAR_FID ، NEAR_DIST  n") ؛ SimpleFeature f = null؛ مؤشر كثافة العمليات = 0 ؛ معرف السلسلة = فارغ ؛ while (simpleFeatureIterator.hasNext ()) {f = simpleFeatureIterator.next ()؛ index = f.getID (). lastIndexOf ('.') ؛ المعرف = f.getID (). سلسلة فرعية (فهرس + 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 = new BufferedWriter (new FileWriter (dest_path + dest_filename)) ؛ bw.write (tmpStr.toString ()) ؛ bw.close () ؛


أسهل طريقة للقيام بذلك هي استخدام مخزن بيانات GeoTools CSV ، والذي يتميز بالعديد من المزايا ، وأبرزها عدم وجود حاجة لتخزين مجموعة البيانات بأكملها في الذاكرة ، وبعد ذلك يمكنك بهذه الطريقة اختيار متجر مخرجات مختلف إذا قررت ذلك تغيير طريقة التخزين الخاصة بك دون الحاجة إلى تغيير الكثير من التعليمات البرمجية.

ملف inFile = ملف جديد ("/ home / ian / Data / States / States.shp") ؛ File outFile = ملف جديد ("state.csv") ؛ outFile.createNewFile () ، // قراءة DataStore inputDataStore = DataStoreFinder.getDataStore (Collections.singletonMap ("url"، URLs.fileToUrl (inFile))) ؛ String inputTypeName = inputDataStore.getTypeNames () [0] ، SimpleFeatureType inputType = inputDataStore.getSchema (inputTypeName) ، FeatureSource المصدر = inputDataStore.getFeatureSource (inputTypeName) ، ميزةجمع inputFeatureCollection = source.getFeatures () ، // اكتب FileDataStore newDataStore = FileDataStoreFinder.getDataStore (outFile) ؛ newDataStore.createSchema (inputType) ، String typeName = newDataStore.getTypeNames () [0] ؛ SimpleFeatureStore featureStore = (SimpleFeatureStore) newDataStore.getFeatureSource (typeName) ؛ featureStore.addFeatures (inputFeatureCollection) ؛

شاهد الفيديو: تحويل ملفات إكسل إلى صيغة سي إس في دون تحول الحروف العربية إلى علامات استفهام