অর্জজিআইএস ছাড়াই পাইথনের মাধ্যমে বিদ্যমান শেফিলটিতে অ্যাট্রিবিউট ফিল্ড যুক্ত করবেন কীভাবে?


24

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

আমি ওজিআর দিয়ে এটি ব্যর্থ চেষ্টা করেছি , যেহেতু আমার শেপফাইলে বৈশিষ্ট্য রয়েছে

আমি পাইশপ দেখেছি , তবে একইভাবে স্কিমাটি তৈরির পরে এটি সংশোধন করার কোনও উপায় নেই। আমি শেফফাইল (পাইথনের জন্য) দিয়ে চেষ্টা করিনি, তবে আমি এই বৈশিষ্ট্যটির বিজ্ঞাপন দেখছি না। ডিবিএফপি-র মাধ্যমে ডিবিএফ ফাইলের সাথে টিঙ্কারিং করে কীভাবে এটি করা যায় তা আমিও দেখতে পাচ্ছি না ।

কারো কি কোন ধারনা আছে?


বিদ্যমান শেফফাইল কাঠামোটিকে ক্লোন করা, একটি নতুন কলাম যুক্ত করা এবং তারপরে এটি মূল শেফফিলের উপর ভিত্তি করে পপুলেশন করা কি গ্রহণযোগ্য হবে?
ডেভিডএফ


এই প্রশ্নটি gis.stackexchange.com/q/3623/664 এর সদৃশ হিসাবে বন্ধ করা উচিত ।
whuber

হ্যাঁ, মূলত একই। আমি তাকালাম, কিন্তু দেখতে পেলাম না।
মাইক টি

উত্তর:


8

আপনার এই প্রশ্নগুলির উপর নজর রাখা উচিত কারণ এটি ইতিমধ্যে উত্তর দেওয়া হয়েছে: পাইথন ব্যবহার করে শেফিলিতে কাস্টম বৈশিষ্ট্যযুক্ত বৈশিষ্ট্যগুলি কীভাবে যুক্ত করবেন?

/programming/4215658/adding-custom-feature-attributes-to-esri-shapefile-with-python

আপনি যদি ফলাফল হিসাবে চান, কেবলমাত্র একটি শেপফাইল, কেবল আপনার স্ক্রিপ্টের শেষে আপনার ইনপুট ফাইলগুলি মুছুন।


যা gis.stackex بدل.com/ অনুরূপ / 3623/… এর সমান এটিও খনন করার জন্য ধন্যবাদ
মাইক টি


4

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

পর্যায়ক্রমে, আপনি কেবল ডিবিএফ ফাইল দিয়ে উপরেরটি করতে dbfpy ব্যবহার করতে পারেন। পদক্ষেপের ক্রম একই থাকে:

  1. মূলতে অভিন্ন কাঠামো সহ একটি নতুন ডিবিএফ তৈরি করুন
  2. নতুন ডিবিএফ-এ নতুন বৈশিষ্ট্য ক্ষেত্র তৈরি করুন
  3. মূল ডিবিএফ থেকে নতুন ডিবিএফ-তে ডেটা অনুলিপি করুন
  4. পুরানো ডিবিএফ সরান, পুরানো ডিবিএফ-তে নতুন ডিবিএফের নামকরণ করুন

আপনাকে নিজেই শেপফাইলে (.shp) বা অন্য কোনও ফাইলে কোনও পরিবর্তন করার দরকার নেই, কারণ তারা ডিবিএফ-এ থাকা বৈশিষ্ট্য সম্পর্কিত তথ্য উল্লেখ করে না। তবে আপনাকে রেকর্ডের ক্রমটি পুরানো এবং নতুন ডিবিএফ-তে ঠিক একইভাবে রাখা দরকার।


3

ডিবিএফপি এর জন্য কাজ করা উচিত। আপনি কি এই পৃষ্ঠায় উদাহরণস্বরূপ দেখেছেন:

http://dbfpy.sourceforge.net/

নিশ্চিত হয়ে নিন যে সেই সময় আরকজিআইএস সহ অন্য কোনও অ্যাপ্লিকেশন দ্বারা শেফফিল সম্পাদনা করা হচ্ছে না কারণ এটি লকিংয়ের মাধ্যমে সমস্যার কারণ হতে পারে।


আমি মনে করি না যদি আপনার ডিবিএফ ফাইলে ইতিমধ্যে ডেটা থাকে তবে এটি কাজ করে। আমি এর আগে এটি দেখেছিলাম তবে আমি একটি ত্রুটি পেয়েছি: "কমপক্ষে একটি রেকর্ড যুক্ত হয়েছিল, কাঠামো পরিবর্তন করা যায় না"। আপনার মনে কোন নির্দিষ্ট উদাহরণ আছে?
মাইক টি

আহ আমি এখন হ্যাঁ মনে করি যেমন সাসা বলেছিলেন একটি নতুন ডিবিএফ তৈরির প্রয়োজন হবে। স্কিমার অনুলিপি করুন (ক্ষেত্র ইত্যাদির মতো) এরপরে আপনার সংযোজনগুলি তৈরি করুন, তারপরে রেকর্ডগুলি অনুলিপি করুন। "দুর্দান্ত" ডিবিএফ ... :(
রব ক্লার্ক

@ মাইক আপনি কী করতে চান সমস্ত একটি ক্ষেত্র যুক্ত করার সাথে সাথে একটি রেকর্ড কীভাবে যুক্ত হয়েছিল ?? একটি রেকর্ড যুক্ত করা একটি ত্রুটি কারণ এটি বৈশিষ্ট্য এবং আকারগুলির মধ্যে সংযোগ নষ্ট করে দেয়। ক্ষেত্র যুক্ত করা মোটেই কোনও ক্ষতি করে না। যে কোনও লাইব্রেরি dbf ফাইল সম্পাদনা করতে পারে তা কাজটি সঠিকভাবে করবে।
whuber

@ ভুবার: এটি তাদের ত্রুটির বার্তা। ডেটা রয়েছে এমন একটি বিদ্যমান ডিবিএফ খুলুন এবং দেখুন:from dbfpy import dbf; db = dbf.Dbf('my.dbf'); db.addField(("FOO", "C", 15))
মাইক টি

@ মাইক পরিস্থিতি স্পষ্ট করার জন্য ধন্যবাদ। এটি ডিবিএফপি :-( এ অপ্রয়োজনীয় সীমাবদ্ধতার ফলাফলের মতো বলে মনে হচ্ছে why আমি কেন অনুমান করতে পারি: খালি খালি ডাটাবেসে ক্ষেত্র যুক্ত করার জন্য সমস্ত রেকর্ড শারীরিকভাবে পড়া, প্রসারিত এবং আবার বাইরে লেখা দরকার A একটি ভাল সমাধান হ'ল একটি ভিন্ন ডিবেস লাইব্রেরি সন্ধান করতে বা অন্যান্য সফ্টওয়্যার ব্যবহার করতে ;-)।
whuber

1

আমি ওজিআর ব্যবহার করে একটি সমাধান পেয়েছি এবং পূর্ববর্তী প্রশ্নের সাহায্যের জন্য ধন্যবাদ । এখানে একটি সম্পূর্ণ উদাহরণ:

from osgeo import ogr

# Open a Shapefile, and get field names
source = ogr.Open('my.shp', update=True)
layer = source.GetLayer()
layer_defn = layer.GetLayerDefn()
field_names = [layer_defn.GetFieldDefn(i).GetName() for i in range(layer_defn.GetFieldCount())]
print len(field_names), 'MYFLD' in field_names

# Add a new field
new_field = ogr.FieldDefn('MYFLD', ogr.OFTInteger)
layer.CreateField(new_field)

# Close the Shapefile
source = None

আমার সমস্যাটি ছিল আমি layer_defn.AddFieldDefn(new_field)বরং ব্যবহার করেছিলাম layer.CreateField(new_field)। সহায়তার জন্য অনেক ধন্যবাদ, এবং অনুরূপ অন্যান্য প্রশ্নের জন্য পুরোপুরি পরীক্ষা না করার জন্য দুঃখিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.