Ogr2ogr এর সাথে শেফফিলগুলি মার্জ করার সময় ফাইলের সাথে ফিল্ড যুক্ত করা হচ্ছে?


14

আমি কিছু শেফফিলগুলি মার্জ করছি এবং কিউজিআইএস-এর অভ্যন্তরে এটি করতে আমার কিছু সমস্যা হয়েছিল, তাই আমি ogr2ogr সরাসরি ব্যবহার করছি। আমি এটি করছি (একটি ব্যাচে):

ogr2ogr -overwrite %destination% %n1%
ogr2ogr -update -append %destination% %n2% -nln all_new
ogr2ogr -update -append %destination% %n3% -nln all_new
ogr2ogr -update -append %destination% %n4% -nln all_new

এটি সূক্ষ্মভাবে কাজ করে, তবে এখন আমার ফলস্বরূপ শেফফিল থাকা দরকার, এমন এক ক্ষেত্র যা আমি একত্রীকরণ করা আসল আকারের ফাইলগুলির নাম সহ। খুব কঠিন শোনাচ্ছে না, তবে আমি এটি করার জন্য পরিচালনা করছি না।

কেউ সাহায্য করতে পারেন? ধন্যবাদ!

উত্তর:


14

ছোট স্ক্রিপ্টিং সহ এটি করণীয় হবে। অনুসরণ করার মতো কিছু দিয়ে আপনি কোনও ফোল্ডারে সমস্ত শেফফিলায় একটি আকারফাইলে কলাম যুক্ত করতে এবং সেগুলিকে মার্জড.এসপি ফাইলটিতে মার্জ করতে সক্ষম হবেন

for %f in (*.shp) do (
  ogrinfo %f -sql "ALTER TABLE %f ADD COLUMN filename character(15)"
  ogrinfo %f -sql "UPDATE TABLE %f filename = '%f'"
  ogr2ogr -update -append merged.shp %f -f esri shapefile -nln merge 
)

সম্পাদনা করুন: এটি কার্যকর করার জন্য কিছু পরিবর্তন সহ বাশ স্ক্রিপ্টের মতো:

for f in *.shp
do 
  base=${f%.shp}
  ogrinfo $f -sql "ALTER TABLE $base ADD COLUMN filename character(15)"
  ogrinfo $f -dialect SQLite -sql "UPDATE $base SET filename = '$base'"
  ogr2ogr -update -append merged.shp $f
done

এই সমাধানটি কেবল তখনই কাজ করবে যদি আপনার সমস্ত স্তর / আকৃতির ফাইলগুলির একই নাম যেমন "CHEMIN" সঠিক থাকে? আমি বিভিন্ন স্তর নামের ফাইলগুলি স্ক্রিপ্ট করার জন্য একটি সমাধান খুঁজছি।
ওয়ান

সঠিক, আপনি যদি কেমিনকে% f দিয়ে প্রতিস্থাপন করেন তবে এটি কোনও নামের সাথে কাজ করা উচিত, যেমন শেফফাইলে সারণীর নাম স্তর নাম। আমি উত্তর সম্পাদনা করেছি। সত্যই এটি পরীক্ষা করার জন্য আমার উইন্ডোজ নেই
JaakL

9

আমি-এসকিএল বিকল্পটি ব্যবহার করব এবং নিম্নলিখিত পদ্ধতিতে শেফফিলটি আমদানি করব:

ogr2ogr -update -append %destination% %n2% -sql 'SELECT "%n2%" as SHAPE_ORIG, field1, field2, ... FROM %n2%'

পাওলো - আমি এটির কাজ পেতে লড়াই করছি। এটি কি কেবল ogr2ogr দিয়ে করা যায় এবং ওগ্রিনফো দিয়ে নয়? আমি খুব gdal-দেব পোস্ট করেছি, আমার উদাহরণ lists.osgeo.org/pipermail/gdal-dev/2012-November/034849.html ক্যান Windows অথবা ব্যাশ মধ্যে তা না ..
oeon

জো, একক ogrinfo লাইন ব্যর্থ হয়, বা এটি শুধুমাত্র স্ক্রিপ্টের প্রসঙ্গে (লুপের ভিতরে) ব্যর্থ হচ্ছে?
ক্যাপুটি

পাওলো - আমি নীচে আমার জন্য কাজ করে এমন উত্তর যুক্ত করতে যাচ্ছি। আমার সাথে অনুসরণ করার জন্য আপনাকে ধন্যবাদ, দয়ালু স্যার! :)
oeon

7

শেফফিলগুলি মার্জ করার কিছু উপায় রয়েছে।

  • আপনি যদি স্তরগুলিকে এক স্তর হিসাবে মার্জ করতে চান তবে আপনি এমএমকিউজিস সরঞ্জামগুলি মার্জ করার জন্য ব্যবহার করতে পারেন ...

mmqgis

  • আপনি যদি কোনও ফোল্ডারের অধীনে সমস্ত শেফফিলগুলি একত্রীকরণ করতে চান তবে আপনি এখানে ড্যারেন কোপ সরল কোডটি ব্যবহার করতে পারেন ।

mkdir merged
for %f in (*.shp) do (
if not exist merged\merged.shp (
ogr2ogr -f esri shapefile merged\merged.shp %f) else (
ogr2ogr -f esri shapefile -update -append merged\merged.shp %f -nln Merged )
)
  • এর পাশে প্রচুর ফাইল মার্জ করার জন্য জিওমার্জ ফ্রি সরঞ্জাম ব্যবহার করতে পারে তবে এটির সাথে আপনার ফাইলের আকারটি ওয়ার্কিনের জন্য বিবেচনা করতে ভুলবেন না।

এবং শেপফাইলে @ ড্যাঙ্গো ডাইরেক্টনে অ্যাট্রিবিউট যুক্ত করা ভাল। আপনি নতুন কলাম তৈরির জন্য স্তরটি তৈরি করতে পারেন re

import os
shapeFileName = os.path.splitext("your_shape_file_path")[0]

আমি এটি আপনাকে সাহায্য করে আশা করি...


5

ভ্যাসকোবুনিউনস, একসাথে ডেইজি চেইনের জন্য পাইথন স্ক্রিপ্টটি ব্যবহার করে এই সমস্যাটি কীভাবে সম্পন্ন করেছি তা এখানে। আপনি এটিকে সহজেই একটি ব্যাচের স্ক্রিপ্টে রূপান্তর করতে পারেন, মূলত আমি কেবল ogr2ogr নির্দেশাবলী ( cmd) একসাথে একত্রিত করি , তারপরে তাদের ডেকে os.system(cmd)চালনা করে, ogr2ogr কমান্ডটি আমি একত্রিত করে পাস করি passing

গোপন অস্ত্রটি হ'ল ( ক্যাপুটি প্রদর্শিত হিসাবে ) আপনি নিজের মার্জ ফলাফলের সাথে যুক্ত হচ্ছেন উত্স ডেটাসেটের ধ্রুবক মান হিসাবে ফাইল নাম চাপানোর জন্য ওজিআরএসএসকিউএল প্রয়োগ করা।

আমার উদাহরণে, -sqlপতাকাটি হ্যান্ডেল করে, কোডটিতে এটি এর মতো:

-sql "SELECT \'' + filename + '\' AS filename, * FROM ' + filenameNoExt + '"'

তবে এটি পড়তে বিভ্রান্তিকর কারণ আমার ফলস্বরূপ উপসংহারে একক উদ্ধৃতি এবং ডাবল উদ্ধৃতি প্রয়োগ করতে হবে। এটি করার জন্য আমাকে তাদের "বাস্তবের জন্য" ব্যবহার করতে একক উদ্ধৃতি (অর্থাত্ \ ') এড়িয়ে যেতে হবে। সুতরাং পাঠযোগ্যতার জন্য, এটি ভেরিয়েবলগুলি এবং পালানোর ক্রম ছাড়াই এটি দেখতে সহায়তা করে। আপনি যদি কোনও নির্দিষ্ট পুনরাবৃত্তির জন্য ফাইলের নামটি "রোডস 1" হিসাবে ভান করেন তবে ফলস্বরূপ কনটেন্টেশনটি ogr2ogr বাক্যে এই জাতীয় চেহারা দেখাবে:

-sql "SELECT 'roads1.shp' AS filename, * FROM roads1"

এই .py স্ক্রিপ্ট তিন ঠাট আমি থেকে চুরি একজন সংমিশ্রণ হয় অনুজ্জ্বল উইলকি (একটি খালি, একটি shapefile এর ক্লোন), j03lar50n (ogrinfo এবং ogr_sql ব্যবহার করে একটি shapefile করতে একটি কলাম যোগ), এবং capooti (ogr_sql ব্যবহার করে একটি নির্দিষ্ট কলাম মান আরোপ একটি আকারে সমস্ত রেকর্ডে)। সুতরাং এখানে সম্পূর্ণ স্ক্রিপ্ট:


# merge_shps.py
import os    

path = "D:/GIS/01_tutorials/ND_Roads/extracted"  # path to your folder of .shp files
merge = "merge_filename"                         # this will be the name of your merged result

directory = os.listdir(path)

count = 0
for filename in directory:
    if ".SHP" in filename.upper() and not ".XML" in filename.upper():

        # On the first pass, create a clone and add the filename column.
        if count == 0:
            # Make a clone (matt wilkie)..
            cmd = 'ogr2ogr ' + path + '/' + merge + '.shp ' + path + '/' + filename + ' -where "FID < 0"'
            os.system(cmd)

            # Add the field (j03lar50n)..
            cmd = 'ogrinfo ' + path + '/' + merge + '.shp -sql "ALTER TABLE ' + merge + ' ADD COLUMN filename character(50)"'
            os.system(cmd)

        # Now populate the data (capooti)..
        print "Merging: " + str(filename)

        # You'll need the filename without the .shp extension for the OGR_SQL..
        filenameNoExt = filename.replace(".shp","")

        cmd = 'ogr2ogr -f "esri shapefile" -update -append ' + \
                path + '/' + merge + '.shp ' + \
                path + '/' + filename + \
                ' -sql "SELECT \'' + filename + '\' AS filename, * FROM ' + filenameNoExt + '"'

        # Uncomment this line to spit the ogr2ogr sentence to the terminal..
        #print "\n" + cmd + "\n"

        os.system(cmd)

        count += 1

4

শেফফিলের ফোল্ডার থেকে উত্স ফাইল নাম সহ কলাম যুক্ত করুন। জিডিএল 1.10 দেব প্রয়োজন, আমার .shp এক্সটেনশনটি ফেলে দেওয়ার প্রয়াস কাজ করছে না - তবে সামগ্রিকভাবে, কাজ করে। - আমি ধারণা করি এটি ওজিআরের সাথে মিশে যাওয়া লাইনে যুক্ত হতে পারে।

for f in *.shp;

do

name=${f%.shp}

/Users/you/gdal_src/bin/ogrinfo $f -sql "ALTER TABLE $name ADD COLUMN filename character(21)"
/Users/you/gdal_src/bin/ogrinfo $f -dialect SQLite -sql "UPDATE $name SET filename = '$f'"
done;

উপভাষার নির্দিষ্টকরণের জন্য +1। ওজিআর এসকিউএল আপডেট না করায় আমি শীর্ষ উত্তরে ত্রুটি পেয়েছি।
ব্যবহারকারী 15741

3

হাই সম্ভবত এই লিঙ্কটি সাহায্য করবে। এটি দেখায় যে কীভাবে পাইথন জিডাল বাইন্ডিংগুলি ব্যবহার করে একটি শেফফিলায় একটি ফিড যুক্ত করা যায়।


2

কিউজিআইএসের অভ্যন্তরে আপনি মার্জ শেপফিলি প্লাগইন যুক্ত করতে পারেন। "ফাইলের নাম সহ কলাম যুক্ত করুন" বিকল্প রয়েছেএখানে চিত্র বর্ণনা লিখুন


আমি একটি টাইপ এরর পেয়েছি: 'ননটাইপ' টাইপের অবজেক্টটির কোনও লেন নেই ()
হ্যানস লেডেজেন

0

জাএকেএলের উত্তরের একটি সামান্য পরিবর্তিত সংস্করণ। নোট করুন যে -পেন্ড foo.shp এবং -nln foo এর সাথে মেলে নেওয়া দরকার। এছাড়াও, এসকিউএল ডায়ালেক্টের ব্যবহারটি লক্ষ্য করুন (জিডিএল স্পষ্টতই 'আপডেট' কীওয়ার্ডটি গ্রহণ করে না, সুতরাং এসকিউএল ডায়ালেক্টটি ইনস্টাড ব্যবহার করা আবশ্যক), এবং 'আপডেট' শব্দের পরে 'টেবিল' কীওয়ার্ডের অনুপস্থিতি (প্রয়োজন নেই) বা এসকিউএলাইট দ্বারা গৃহীত)।

for %%f in (*.shp) do (
  if not "%%f" == "merge.shp" (
    ogrinfo %%f -sql "ALTER TABLE %%~nf ADD COLUMN fname character(15)"
    ogrinfo %%f -dialect SQLite -sql "UPDATE %%~nf SET fname = '%%~nf'"
    ogr2ogr -update -append merge.shp %%f -f "ESRI SHAPEFILE" -nln merge 
  )
)

0

আলোচনায় খানিকটা দেরি হলেও এখন ওঝে

ogrmerge.py -single -o merged.shp *.shp -src_layer_field_content {DS_BASENAME}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.