۲۴ خرداد ۱۴۰۵، ۰۹:۲۳
چگونه 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")
امیدوارم این کمک کند!