কিউজিআইএস ব্যবহার করে কীভাবে 500 সিএসভি ফাইলগুলি পুনরায় প্রজেক্ট করা যায়?


11

আমি জানি, আমার প্রশ্নটি এই সাইটের কিছু পুরানো প্রশ্নের মতো।

আমি বেশ কয়েকটি সিএসভি ফাইল (ভূ-স্থানাঙ্ক) কিগিসে আমদানি করতে (এবং তারপরে সেগুলি রূপান্তর করতে) করেছি এবং সাধারন উপায় এটি করার সবচেয়ে ভাল উপায় নয় (খুব দীর্ঘ)।

আমার কাছে প্রায় 500 সিএসভি ফাইল (wgs84 স্থানাঙ্ক) রয়েছে এবং আমি এটি করতে চাই:

  1. একবারে সমস্ত সিএসভি ফাইল QGIS এ আমদানি করুন
  2. তাদের প্রকল্প
  3. সেগুলি CSV ফাইলে রফতানি করুন (আবার) তবে বিভিন্ন স্থানাঙ্কের সাথে (UTM33N এ রূপান্তর)

আমি পাইথন কনসোলটি কীভাবে ব্যবহার করব তা বোঝার চেষ্টা করছি তবে আমি এগিয়ে যাচ্ছি না :(

কেউ আমাকে কীভাবে ধাপে ধাপে এটি অর্জন করতে পারে তা ব্যাখ্যা করতে পারেন?


নীচে আমার উত্তর দেখুন। সমস্যাটি ইতিমধ্যে সমাধান এবং ব্যাখ্যা করা হয়েছিল
জেনেরিক ওয়েভারস

2
এবং কেন চিহ্নিত নকলটির সাথে সেই সদৃশ? সম্ভবত ওপি পাইকগিস এবং কীভাবে পাইথন ব্যবহার করতে পারে সেগুলি শেখার চেষ্টা করে যদি আপনি তার বোল্ডস বিবেচনা করেন।
nickves

আপনার প্রশ্ন নির্দিষ্ট করুন। আপনি কি এগুলি QGIS এ ম্যানুয়ালি লোড করতে চান না? আপনি কি তাদের অন্য ফর্ম্যাটে রূপান্তর করতে চান? ঠিক আপনার প্রশ্ন কি?
বাগম্যানোট 123

১. একটি প্রক্রিয়াতে সমস্ত ফাইলকে কুইগিসে আমদানি করুন ২. প্রকল্প করুন ৩. সেগুলি আবার সিএসভি হিসাবে রপ্তানি করুন তবে পুরো সমন্বয়
রাকেল রিবেইরো

বিড়াল * .csv> one_file.csv (বা উইন্ডোগুলির সমতুল্য যাই হোক না কেন) আপনার সমস্ত সিএসভি ফাইল এক সাথে সংযুক্ত করবে। 500 সত্যিই এত বড় সংখ্যা নয় :-)
জন পাওয়েল

উত্তর:


15

আপনি যদি কিউজিআইএস-এর পাইথন কনসোল থেকে সিএসভি ফাইল পুনঃপ্রজেজন করতে চান তবে নীচের স্ক্রিপ্টটি ব্যবহার করতে পারেন। আপনাকে যে সমস্ত পরিবর্তন করতে হবে তা হল মন্তব্যে উল্লিখিত তিনটি পথ s

মূলত, স্ক্রিপ্টটি আপনার সিএসভি ফাইলগুলি কিউজিআইএস-এ শেপফিল হিসাবে আমদানি করে (আপনার জ্যামিতিক ক্ষেত্রগুলির নাম Xএবং ধরে নেওয়া হয় Y)। এরপরে প্রসেসিং টুলবক্স থেকে qgis:reprojectlayerএবং qgis:fieldcalculatorঅ্যালগরিদমগুলি নতুন স্থানাঙ্কগুলির সাথে এবং ক্ষেত্রগুলি পুনরায় প্রজেক্ট করতে এবং আপডেট করতে ব্যবহার করে । এরপরে এগুলি একটি ফোল্ডারে সংরক্ষণ করে এবং আপনার নির্দিষ্ট করা পথে সিএসভি ফাইলগুলিতে রূপান্তর করে। সুতরাং শেষ পর্যন্ত, আপনার পৃথক ফোল্ডারে শেডফিল এবং সিএসভি ফাইল আপডেট হয়েছে।XY

import glob, os, processing

path_to_csv = "C:/Users/You/Desktop/Testing//"  # Change path to the directory of your csv files
shape_result = "C:/Users/You/Desktop/Testing/Shapefile results//"  # Change path to where you want the shapefiles saved

os.chdir(path_to_csv)  # Sets current directory to path of csv files
for fname in glob.glob("*.csv"):  # Finds each .csv file and applies following actions
        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)  # Imports csv files to QGIS canvas (assuming 'X' and 'Y' fields exist)

crs = 'EPSG:32633'  # Set crs
shapefiles = QgsMapLayerRegistry.instance().mapLayers().values()  # Identifies loaded layers before transforming and updating 'X' and 'Y' fields
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)  # Sets current directory to path of new shapefiles
for layer in glob.glob("*.shp"):  # Finds each .shp file and applies following actions
        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"  # Change path to where you want the csv(s) saved
        QgsVectorFileWriter.writeAsVectorFormat(new_layer, csvpath, 'utf-8', None, "CSV")   

আশাকরি এটা সাহায্য করবে!


2
দুর্দান্ত উত্তর - আপনার সব আছে! আপনার যদি কিছু মনে না হয় তবে একটি প্রশ্ন: পাইথন কনসোল থেকে জিনিসগুলি করা সত্ত্বেও আপনাকে কিউজম্যাপলায়ারজিস্টিতে স্তরগুলি যুক্ত / সরিয়ে ফেলতে হবে?
nickves

1
@ নিকভস - হাহা অনেক ধন্যবাদ বন্ধু! হুম আমাকে স্তরগুলি যুক্ত / সরাতে হবে না (আমি নিশ্চিত স্ক্রিপ্টটি নাটকীয়ভাবে হ্রাস করা যেতে পারে)। আমি কোনও বিশেষজ্ঞ নই তবে আমি এটি পরে পরীক্ষা করব এবং আপনার কাছে ফিরে আসব। আপনি যদি উত্তর হিসাবে এটি পোস্ট করা উচিত সে ক্ষেত্রে আপনি আরও পরিষ্কার স্ক্রিপ্ট না সরবরাহ করতে পারেন তবে আমি এটিকে উজ্জীবিত করব :)
জোসেফ

@ নিকভস - আপনার পরামর্শ বন্ধুকে আবার ধন্যবাদ! দ্বিতীয় বার স্তরগুলি যুক্ত / অপসারণ এড়ানোর জন্য কোড সম্পাদনা করা হয়েছে :)
জোসেফ

@ রাকেলরিবেইরো - সর্বাধিক স্বাগতম! আনন্দিত এটি সহায়ক ছিল :)
জোসেফ

@ জোসেফ আমি কি আপনাকে আবার কিছু জিজ্ঞাসা করতে পারি? 14 এবং 15 লাইনে, সংখ্যা: 0, 10, 10 ঠিক কী সংজ্ঞা দিচ্ছে? (আউটপুট স্থানাঙ্কগুলির ডানদিকে অনেক বেশি শূন্য রয়েছে এবং আমি সেগুলি হ্রাস করতে চাই)
রাকেল রিবেইরো

8

ডাব্লু জিএস ৮৮-তে "লন ল্যাট" যুক্ত একটি স্পেস বিচ্ছিন্ন ফাইলকে ইউটিএম 33 এন-তে রূপান্তর করার জন্য দ্রুত সমাধান তবে আপনি অন্য কোনও ডেটা পাবেন না:

#!/bin/bash
#
for i in $( ls *.csv ); do
    gdaltransform -s_srs EPSG:4326 -t_srs EPSG:32633 < ${i} > utm${i}
done

এটি কাজ করে এবং এটি ডেটার ক্রম সংরক্ষণ করে তাই সম্ভবত আর একটি লুপ উদাহরণস্বরূপ বর্ণনামূলক ডেটা একত্রিত করতে উদাহরণস্বরূপ ব্যবহার করে?

সম্পাদনা করুন। আমি নীচে তৈরি অগোছালো মন্তব্যের কারণে আমি এখানে পরিবর্তে উত্তর সম্পাদনা করব।

নিম্নলিখিত স্ক্রিপ্টে একাধিক সিএসভি ফাইল পড়ার কাজ করা উচিত, প্রতিটি ফাইলে নতুন স্থানাঙ্ক কলাম যুক্ত করা উচিত।

#!/bin/bash
#
for i in $( ls *.csv ); do
 paste -d',' ${i} <(awk -v OFS="," -F " " 'NR>1 {print $1 " " $2}' ${i} | gdaltransform -s_srs EPSG:4326 -t_srs EPSG:32633 | awk '{gsub(" ",",",$0); print $0}' | /usr/local/bin/sed "1i\X,Y,Z") > utm${i}
#
 #paste -d',' ${i} <(awk -v OFS="," -F " " 'NR>1 {print $1 " " $2}' ${i} | gdaltransform -s_srs EPSG:4326 -t_srs EPSG:32633 | awk '{gsub(" ",",",$0); print $0}' |sed "1i\X,Y,Z") > utm${i}
#
done

ওএসএক্সে আপনাকে সেডের সর্বশেষ (২০০৯) সংস্করণটি ইনস্টল করতে হবে এবং লুপে প্রথম, অনাবৃত লাইনটি ব্যবহার করতে হবে। লিনাক্সের জন্য প্রথমে মন্তব্য করুন এবং দ্বিতীয়টি ব্যবহার করুন। -F " "আপনার সিএসভি ফাইলগুলিতে বিভাজনের বিন্যাস অনুসারে সামঞ্জস্য করুন যেমন -F ","কমা দ্বারা পৃথক করা। আরও মনে রাখবেন যে উঁচু রূপান্তরটি উপবৃত্তাকারে নয় , জিওড নয়, সুতরাং সেই অনুসারে উচ্চতাগুলিকে রূপান্তর করতে ভুলবেন না।


আমি কিছুক্ষণ আগে আমার অনুরূপ কিছু করার এবং আমার ব্লগে একটি সমাধান পোস্ট করার কথা মনে পড়ে। এটি ম্যাকের জন্য লেখা তবে বাশ ভিত্তিক। সবচেয়ে বড় পার্থক্যটি হ'ল ওএস এক্সে সেডের
Mercergeoinfo

শেষ মন্তব্যটি কিছুটা অগোছালো ছিল। সমস্ত ফাইলের লুপ করতে উপরের বাশ স্ক্রিপ্টে এই লাইনটি ব্যবহার paste -d',' ${i} <(awk -v OFS="," -F " " 'NR>1 {print $1 " " $2}' ${i} | gdaltransform -s_srs EPSG:4326 -t_srs EPSG:32633 | awk '{gsub(" ",",",$0); print $0}' | /usr/local/bin/sed "1i\X,Y,Z") > utm${i}করুন / আপনি / ইউএসআর / লোকাল / সেড প্রতিস্থাপন করুন যদি আপনি ওএসএক্সে না থেকে থাকেন। উপরের লাইনটি যেমন অনুমান করে আপনার সিএসভি ফাইলগুলি স্থান পৃথক করা হয় তবে এটি আদর্শ নয় but যদি আপনার কমাটি পৃথক হয়ে থাকে তবে পরিবর্তন -F " "করুন-F ","
Mercergeoinfo

আমি ভাবছি কেন মন্তব্যে আপডেট কোড এবং আপনি উপরে আপনার উত্তর আপডেট করেন নি। মন্তব্যে কোডটি পড়া সত্যিই কঠিন। আপনি নিজের উত্তরের নীচে সম্পাদনা লিঙ্কটি দেখতে পাচ্ছেন?
মিরো

হ্যাঁ, তবে তখন এটি কোনও অতিরিক্তের মতো সত্যই কোনও আপডেট ছিল না। খুব অগোছালো, আমি রাজি। আমি অনুমান করি আমার আসল উত্তরটি আপডেট করা উচিত। ধন্যবাদ
Mercergeoinfo

7

কিউগিস বা এমনকি ওজিআর ব্যবহার এটির জন্য ওভারকিল। পাইথন সিএসভি লেখক এবং কয়েকটি মানক গ্রন্থাগার ট্রিকের সাথে মিলিত ( https://pypi.python.org/pypi/pyproj )
ব্যবহার করুন । এটি ছাড়া আপনার আর কিছু ইনস্টল করার দরকার নেই ! pyprojpyproj

import csv
import pyproj
from functools import partial
from os import listdir, path

#Define some constants at the top
#Obviously this could be rewritten as a class with these as parameters

lon = 'lon' #name of longitude field in original files
lat = 'lat' #name of latitude field in original files
f_x = 'x' #name of new x value field in new projected files
f_y = 'y' #name of new y value field in new projected files
in_path = u'D:\\Scripts\\csvtest\\input' #input directory
out_path = u'D:\\Scripts\\csvtest\\output' #output directory
input_projection = 'epsg:4326' #WGS84
output_projecton = 'epsg:32633' #UTM33N

#Get CSVs to reproject from input path
files= [f for f in listdir(in_path) if f.endswith('.csv')]

#Define partial function for use later when reprojecting
project = partial(
    pyproj.transform,
    pyproj.Proj(init=input_projection),
    pyproj.Proj(init=output_projecton))

for csvfile in files:
    #open a writer, appending '_project' onto the base name
    with open(path.join(out_path, csvfile.replace('.csv','_project.csv')), 'wb') as w:
        #open the reader
        with open(path.join( in_path, csvfile), 'rb') as r:
            reader = csv.DictReader(r)
            #Create new fieldnames list from reader
            # replacing lon and lat fields with x and y fields
            fn = [x for x in reader.fieldnames]
            fn[fn.index(lon)] = f_x
            fn[fn.index(lat)] = f_y
            writer = csv.DictWriter(w, fieldnames=fn)
            #Write the output
            writer.writeheader()
            for row in reader:
                x,y = (float(row[lon]), float(row[lat]))
                try:
                    #Add x,y keys and remove lon, lat keys
                    row[f_x], row[f_y] = project(x, y)
                    row.pop(lon, None)
                    row.pop(lat, None)
                    writer.writerow(row)
                except Exception as e:
                    #If coordinates are out of bounds, skip row and print the error
                    print e

আমি বুঝতে পারি যে পোস্টারটি অজগরটির সাথে বেশ অনভিজ্ঞ। আমি নিয়মিত কিউজিআইএস ব্যবহার করি না, সুতরাং যে প্ল্যাটফর্মটির সাথে আরও অভিজ্ঞতার সাথে কেউ ব্যাখ্যা করতে পারেন যে পাইথনটি কোথায় ইনস্টল করা আছে? পোস্টারটি এটিকে একটি স্বতন্ত্র স্ক্রিপ্ট তৈরি করে এবং সম্ভবত এটি আইডিএল থেকে চালানো উচিত। আমার কোনও বর্তমান ইনস্টলেশন নেই, তাই pyprojপোস্টারটির জন্য আলাদাভাবে ইনস্টল করার প্রয়োজন আছে বা ইতিমধ্যে রয়েছে তা আমি জানি না ।
blord-castillo

1
আগে কখনও আংশিক ফাংশন ব্যবহার করিনি। এখন থেকে করবে। +1
11

4

তোমার পাইথন দরকার নেই কমান্ড লাইন এবং ogr2ogr কেবল ব্যবহার করুন। আপনার ক্ষেত্রে সর্বাধিক গুরুত্বপূর্ণ হল -t_srs srs_def পরামিতি।

ইতিমধ্যে ব্যাখ্যা করা হয় এই উত্তরটি করতে আমি কিভাবে shapefile করতে x সঙ্গে একটি সীমা অতিক্রম করা ফাইল, Y কলাম রূপান্তর করতে পারেন?

আপডেট আপনি আমার সম্পূর্ণ কোড লিখতে আমার কাছে সময় নেই। তবে সমস্যাটি হ'ল অজগরটিতে এর চেয়ে আরও কিছু কোড দরকার যা আপনি ভাবেন।

আপনার মূল সমস্যাটি হ'ল সিএসভি ফাইলগুলির সাথে কাজ করা শেফফাইলগুলি ব্যবহার করার মতো স্বাচ্ছন্দ্যজনক নয়। সুতরাং আপনাকে প্রথমে সিএসভি রূপান্তর করতে হবে যা ভিআরটি ফাইলের প্রয়োজন। এটি প্রথম লিঙ্কে ব্যাখ্যা করা হয়েছে। এখানে আপনাকে নিজের ফাইলগুলির মধ্যে একটি অজগর স্ক্রিপ্ট লুপিং লিখতে হবে যা স্বয়ংক্রিয়ভাবে ভিআরটি ফাইলগুলি তৈরি করে।

এটি আমি নিজে ব্যবহার করেছি এমন একটি স্ক্রিপ্ট। এটি যদি আপনার পক্ষে কাজ করে তবে আপনাকে পরীক্ষা করতে হবে। আমি ইতিমধ্যে WGS 84 থেকে UTM 33N রূপান্তরটি অন্তর্ভুক্ত করেছি

from os import listdir, stat, mkdir, system
path = "your path here"
out_path = "your output path here"
files = filter(listdir(path), '*.csv') #for Python 3.x
# files= [f for f in listdir(path) if f.endswith('.csv')] #for Python 2.7

for x in range(len(files)):
    name = files[x].replace('.csv', '')
    # 2. create vrt file for reading csv
    outfile_path1 = out_path + name + '.vrt'
    text_file = open(outfile_path1, "w")
    text_file.write('<OGRVRTDataSource> \n')
    text_file.write('    <OGRVRTLayer name="' + str(name) + '"> \n')
    text_file.write('        <SrcDataSource relativeToVRT="1">' + name + '.csv</SrcDataSource> \n')
    text_file.write('        <GeometryType>wkbPoint</GeometryType> \n')
    text_file.write('        <LayerSRS>WGS84</LayerSRS> \n')
    text_file.write('        <GeometryField encoding="PointFromColumns" x="Lon" y="Lat"/> \n')
    text_file.write('        <Field name="Name" src="Name" type="String" /> \n')
    text_file.write('    </OGRVRTLayer> \n')
    text_file.write('</OGRVRTDataSource> \n')
    # 3. convert csv/vrt to point shapefile
    outfile_path2 = out_path + name + '.shp'
    command = ('ogr2ogr -f "ESRI Shapefile" -t_srs EPSG:32633' + outfile_path2 + ' ' +  outfile_path1)
    system(command)

আপনার সিএসভি ফাইল অনুসারে আপনাকে ফিল্ডের নাম , src , x এবং y এর জন্য প্যারামিটারগুলি সামঞ্জস্য করতে হবে।

UPDATE2

কিছু চিন্তাভাবনা করার পরে, আমি নিজেকে জিজ্ঞাসা করি আপনি কেন মোটেই কিউজিআইএস ব্যবহার করতে চান? তোমার মত পাইথন স্ক্রিপ্ট ব্যবহার করতে পারে এই সরাসরি WGS থেকে আপনার স্থানাঙ্ক রূপান্তর করতে UTM করতে। এক্ষেত্রে এটি একটি সহজ ওপেন সিএসভি, পড়ার সমন্বয়, সমন্বয় রূপান্তর এবং এটি একটি নতুন ফাইলে সংরক্ষণ করুন।


আমি মনে করি এটি আমি যা খুঁজছি তা নয় ... আমার কাছে প্রায় 500 সিএসভি ফাইল (ডাব্লুএসজি 84 স্থানাঙ্ক) রয়েছে এবং আমি এটি করতে চাই: ১. সমস্ত সিএসভি ফাইল একবারে কিউ 2 তে আমদানি করুন 3 তাদের প্রজেক্ট করুন 3 3 সেগুলি সিএসভি ফাইলগুলিতে (আবার) রফতানি করুন তবে ডাইভারেন্ট স্থানাঙ্কের সাথে (utm33N তে রূপান্তর)
রাকেল রিবেইরো

আমি মনে করি এটি করার জন্য আমার একটি ব্যাচ প্রক্রিয়া বা এটির মতো কিছু দরকার ...
রাকেল রিবেইরো

4
তবে কেন আপনি এটি করতে চান? 1. আপনি কিগিস ছাড়াই কমান্ড লাইন থেকে একই (আপনি যা বর্ণনা করেছেন) করতে পারেন। ২. আপনি এটি ব্যাচ মোডে করতে পারেন। ৩. পাইথনে এটি প্রায় একই রকম। আপনি ogr2ogrও ব্যবহার করবেন
জেনেরিক ওয়েভারস

2
"সহজভাবে" কমান্ড লাইন ব্যবহার করা আসলে কোনও উত্তর নয়। কমান্ড লাইনটি কখনই ব্যবহার করা সহজ হয় না যদি কীভাবে এটি করতে হয় আপনার কোনও ধারণা নেই। এবং আমি লিঙ্কিত উত্তরে সমাধানটি সত্যিই খুঁজে পাচ্ছি না। কেন কেবল দরিদ্র সহকর্মীকে ogr2ogr সহ একটি উদাহরণ ব্যাচ দিচ্ছেন না, এবং সবকিছু ঠিকঠাক হবে?
বার্ড ভি।

1
ঠিক আছে, 1. আপনি gis.stackexchange.com/help/how-to-ask পড়তে পারেন । এর পরে এবং 5 মিনিটের গুগলিংয়ের পরে আপনি স্বীকার করবেন, প্রশ্নটি খুব খারাপভাবে গবেষণা করা হয়েছে এবং ইতিমধ্যে প্রদত্ত উত্তরগুলি দিয়ে সমাধান করা যেতে পারে। ২. যদি এখনও এটি সমাধান করা না যায় তবে আমার ধারণা, সবাই সাহায্য করতে পেরে খুশি হবে। তবে আমি যেমন একজন ভাল ব্যক্তি, আমি আরও কিছু ইঙ্গিত দেব।
জেনেরিক ওয়েভারস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.