آماگ
۲۴ خرداد ۱۴۰۵، ۰۹:۲۳

چگونه 500 فایل CSV را به صورت کارآمد و آسان با استفاده از QGIS پروژکشن مجدد انجام دهم؟

می‌دانم، سؤال من شبیه برخی سؤال‌های قدیمی در این سایت است. من تعداد زیادی فایل CSV (مختصات جغرافیایی) دارم که باید به qgis وارد کنم (و سپس آن‌ها را تبدیل کنم)، و روش معمول بهترین راه برای انجام این کار نیست (بیش از حد طولانی است). من تقریباً 500 فایل CSV (مختصات wgs84) دارم و این کاری است که می‌خواهم انجام دهم: همه فایل‌های CSV را به یک باره وارد QGIS کنم آن‌ها را پروژکت کنم آن‌ها را دوباره به فایل‌های CSV (با مختصات مختلف - تبدیل به UTM33N) صادر کنم دارم سعی می‌کنم بفهمم چگونه از کنسول پایتون استفاده کنم اما پیش نمی‌رویم :( آیا کسی می‌تواند به من توضیح دهد که چگونه قدم به قدم به آن دست یابم؟

پاسخ‌ها (2)

۲۴ خرداد ۱۴۰۵، ۱۰:۲۳
اگر به دنبال پروژکشن مجدد فایل‌های csv از کنسول پایتون در QGIS هستید، می‌توانید از اسکریپت زیر استفاده کنید. تنها چیزی که باید تغییر دهید سه مسیری است که در کامنت‌ها ذکر شده‌اند.
اساساً، اسکریپت فایل‌های csv شما را به عنوان shapefile به QGIS وارد می‌کند (با فرض اینکه فیلدهای هندسی شما X و Y نام داشته باشند). سپس از الگوریتم‌های qgis:reprojectlayer و qgis:fieldcalculator از جعبه‌ابزار پردازش برای پروژکشن مجدد و به‌روزرسانی فیلدهای X و Y با مختصات جدید استفاده می‌کند. سپس آن‌ها را در یک پوشه ذخیره می‌کند و در مسیری که مشخص می‌کنید به فایل‌های csv تبدیل می‌کند. پس در نهایت، فایل‌های shapefile و csv به‌روزرسانی‌شده را در پوشه‌های جداگانه دارید. import glob, os, processing path_to_csv = "C:/Users/You/Desktop/Testing//" # مسیر را به دایرکتوری فایل‌های csv خود تغییر دهید shape_result = "C:/Users/You/Desktop/Testing/Shapefile results//" # مسیر را به جایی که می‌خواهید shapefileها ذخیره شوند تغییر دهید os.chdir(path_to_csv) # دایرکتوری فعلی را به مسیر فایل‌های csv تنظیم می‌کند for fname in glob.glob("*.csv"): # هر فایل .csv را پیدا می‌کند و اقدامات زیر را اعمال می‌کند uri = "file:///" + path_to_csv + fname + "?delimiter=%s&crs=epsg:4326&xField=%s&yField=%s" % (",", "x", "y") name = fname.replace('.csv', '') lyr = QgsVectorLayer(uri, name, 'delimitedtext') QgsMapLayerRegistry.instance().addMapLayer(lyr) # فایل‌های csv را به بوم QGIS وارد می‌کند (با فرض وجود فیلدهای 'X' و 'Y') crs = 'EPSG:32633' # تنظیم crs shapefiles = QgsMapLayerRegistry.instance().mapLayers().values() # لایه‌های بارگذاری‌شده را قبل از تبدیل و به‌روزرسانی فیلدهای 'X' و 'Y' شناسایی می‌کند for shapes in shapefiles: outputs_0 = processing.runalg("qgis:reprojectlayer", shapes, crs, None) outputs_1 = processing.runalg("qgis:fieldcalculator", outputs_0['OUTPUT'], 'X', 0, 10, 10, False, '$x', None) outputs_2 = processing.runalg("qgis:fieldcalculator", outputs_1['OUTPUT_LAYER'], 'Y', 0, 10, 10, False, '$y', shape_result + shapes.name()) os.chdir(shape_result) # دایرکتوری فعلی را به مسیر shapefileهای جدید تنظیم می‌کند for layer in glob.glob("*.shp"): # هر فایل .shp را پیدا می‌کند و اقدامات زیر را اعمال می‌کند new_layer = QgsVectorLayer(layer, os.path.basename(layer), "ogr") new_name = layer.replace('.shp', '') csvpath = "C:/Users/You/Desktop/Testing/CSV results/" + new_name + ".csv" # مسیر را به جایی که می‌خواهید csvها ذخیره شوند تغییر دهید QgsVectorFileWriter.writeAsVectorFormat(new_layer, csvpath, 'utf-8', None, "CSV") امیدوارم این کمک کند!