আরকিপাই ব্যবহার করে শেফফাইলে প্রতিটি বহুভুজের পরিধি অর্জন করছেন?


20

আরকজিআইএস 10 এবং পাইথন-এ আমি একটি শেফফাইলে প্রতিটি বহুভুজগুলির সীমা (xmax, ymax, xmin, ymin) পেতে চাই।

আমি ব্যবহার করে পুরো শেফফিলের ব্যাপ্তি পেতে পারি

file=r"D:\SCRATCH\ARCGIS\100k_trc_tiles_TVM.shp"
desc=arcpy.Describe(file)
print desc.extent.Xmax

394551,52085039532

তবে ডেটাসেটে প্রতিটি সারির জন্য একই তথ্য কীভাবে পাওয়া যায় তা আমি খুঁজে বের করতে পারি না।

rows = arcpy.SearchCursor("100k_trc_tiles_TVM")
for row in rows:
 print row

ডেটাসেটে 31 টি সারি মুদ্রণ করে তবে

for row in rows:
 desc=arcpy.Describe(row)
 print desc.extent.Xmax

একটি ত্রুটি দেয়।

রানটাইম ত্রুটি: অবজেক্ট: বর্ণনা ইনপুট মানটি বৈধ প্রকার নয়

আমি "গণনা জ্যামিতি" ব্যবহার করে সারণিতে সীমাবদ্ধতা মান যুক্ত করার কথা ভাবছিলাম তবে এটি কেবল সেন্ট্রয়েড দেয়। তারপরে আমি অনুমান করি যে আমরা সারি জাতীয় কিছু ব্যবহার করতে পারি etGETValue ("xmax")।

এটি বলা হচ্ছে যে আমি জানি যে আমরা http://www.ian-ko.com/free/free_arcgis.htm থেকে ফাংশনটি ব্যবহার করে এক্স / ওয়াই, সর্বোচ্চ / মিনিট তৈরি করতে পারি তবে আমরা যদি যুক্ত করা এড়াতে পারি তবে ভাল হবে ক্ষেত্রগুলি, বিশেষত যদি আরকপি এই মানগুলি পেতে পারে।

মূলত আমাকে জিওপ্রোসেসিংয়ের জন্য 30 টি ডেটা (1: 100,000 মানচিত্রের শিট অনুসারে) ক্লিপ করার জন্য ক্লিপ সরঞ্জামটিতে ফিড দেওয়ার এক্সটেন্টগুলি পাওয়া দরকার যেহেতু বিভক্ত সরঞ্জামটি ডেটাসেটের বৃহত আকারের কারণে ব্যর্থ হয় (দেখুন কেন ছেদ করে দেয় ত্রুটি 999999: ফাংশনটি কার্যকর করতে ত্রুটি অবৈধ টোপোলজি [অনেকগুলি লিনেগ সমাপ্তি]? )। আমি এটি স্বয়ংক্রিয় করতে চাই কারণ এটি বেশ কয়েকটি ডেটাসেটে পুনরাবৃত্তি হয়।

=== কার্যকারী স্ক্রিপ্ট ===

# Emulates Arc Info SPLIT tool by using Clip but
# Requires a FC from which each row is used as the input clip feature.
# Each row must be rectangular.
# Used on 12GB FGDB with 100 million records.


#Licence: Creative Commons
#Created by: George Corea; georgec@atgis.com.au, coreagc@gmail.com
import arcpy, string

#inFrame=arcpy.GetParameterAsText(0) # Input dataframe FC
#inFile=arcpy.GetParameterAsText(1) # Input FC for splitting
#outDir=arcpy.GetParameterAsText(2) # Output FGDB

inFrame=r"D:\SCRATCH\ARCGIS\100k_trc_tiles_TVM.shp"
inFile=r"c:\junk\106\data\7_Merge.gdb\FullRez_m2b"
outDir=r"D:\SCRATCH\Projects\206\datasplit\test_slaasp.gdb"
#NameField="Name_1"

#arcpy.env.workspace = r"C:/Workspace"
arcpy.env.overwriteOutput = True

rows = arcpy.SearchCursor(inFrame)
shapeName = arcpy.Describe(inFrame).shapeFieldName
for row in rows:
    feat = row.getValue(shapeName)
    Name = row.Name_1
    print "Executing clip on: "+str(Name)
    extent = feat.extent
    #print extent.XMin,extent.YMin,extent.XMax,extent.YMax
# Create an in_memory polygon
    XMAX = extent.XMax
    XMIN = extent.XMin
    YMAX = extent.YMax
    YMIN = extent.YMin
    pnt1 = arcpy.Point(XMIN, YMIN)
    pnt2 = arcpy.Point(XMIN, YMAX)
    pnt3 = arcpy.Point(XMAX, YMAX)
    pnt4 = arcpy.Point(XMAX, YMIN)
    array = arcpy.Array()
    array.add(pnt1)
    array.add(pnt2)
    array.add(pnt3)
    array.add(pnt4)
    array.add(pnt1)
    polygon = arcpy.Polygon(array)
    ShapeFile = outDir+"\\temp_poly"
    arcpy.CopyFeatures_management(polygon, ShapeFile)

    #print Name
### Set local variables
    in_features = inFile
    clip_features = ShapeFile
    out_feature_class = outDir+"\\"+Name
    xy_tolerance = "0.22"

    # Execute Clip

    try:
        arcpy.Clip_analysis(in_features, clip_features, out_feature_class, xy_tolerance)
        print "Completed: "+str(Name)
    except:
        error = arcpy.GetMessages()
        print "Failed on: "+str(Name)+" due to "+str(error)

2
বহুভুজ = arcpy.Polygon (অ্যারে) arcpy.Clip_analysis (in_features, বহুভুজ out_feature_class, xy_tolerance): আপনি ডিস্কে ক্লিপ বৈশিষ্ট্য লিখতে প্রয়োজন হবে না, শুধু মেমরি বহুভুজ মধ্যে যেমন ব্যবহার
user2856

tks। কোনও ধারণা আমি কীভাবে একটি নতুন আকারের ফাইলে সারিটি রফতানি করতে পারি যাতে এটি সারিটির মাত্রার চেয়ে বেশি ব্যবহৃত হয়? এটি এমনটি যাতে এটি অ-আয়তক্ষেত্রাকার ক্লিপগুলিও পরিচালনা করতে পারে।
জর্জসি

1
ভাল আপনি যদি একই স্ক্রিপ্টে সেই বৈশিষ্ট্যটির দ্বারা ক্লিপ করতে চান তবে কেবল বৈশিষ্ট্যটির অবজেক্টটি ব্যবহার করুন। আবার ফাইল আকারে রফতানি করার দরকার নেই, যেমন: আরকিপি.ক্লিপ_অ্যানালাইসিস (in_features, কীর্তি, আউট_ ফিচার_ক্লাস, xy_ টোলারেন্স)
user2856

একটি শেফফিলের জন্য বা একটি শেপফিলের প্রতিটি বহুভুজ জন্য? দেখে মনে হচ্ছে আপনি এখানে দুটি পৃথক বিষয়ে কথা বলছেন।
রায়নার

আপনার শেপফাইলে কেবল একটি বহুভুজ বস্তু আছে? যদি তা না হয় তবে আপনার বস্তুর পরিমাণের জন্য লুপের জন্য ব্যবহার করুন।
আরাগোন

উত্তর:


26

আপনার কার্সারে আকারের অবজেক্টটি পান এবং এর ব্যাপ্তি সম্পত্তিটি অ্যাক্সেস করুন। পাইথনে জ্যামিতির সাথে কাজ করার জন্য আর্কজিআইএস সহায়তা দেখুন :

shapeName = arcpy.Describe(inFeatures).shapeFieldName
for row in rows:
    feat = row.getValue(shapeName)
    extent = feat.extent
    print extent.XMin,extent.YMin,extent.XMax,extent.YMax

1
ধন্যবাদ লুক। এটি দুর্দান্ত কাজ করেছে। যদি কেউ এমন কোনও সরঞ্জাম ব্যবহার করতে চায় তবে আমি নতুন ওয়ার্কিং কোডটি পেতে আমার প্রশ্নটি সম্পাদনা করব - একটি বিশাল বৈশিষ্ট্য শ্রেণীর আয়তক্ষেত্রাকার অঞ্চলগুলি ক্লিপ করতে ক্লিপ টুলসেটটি ব্যবহার করে ie 10 জিবি এফজিডিবি এবং 100 মিলিয়ন রেকর্ড হিসাবে বড় ডেটাসেটগুলির সাথে ক্র্যাশ না করে তোরণ তথ্য স্প্লিট সরঞ্জামটির কার্যকারিতা এমুলেট করে।
জর্জিসি

একটি জিনিস - নাম = সারির সমতুল্য হওয়ার জন্য আমাকে কলামের নামটি হার্ড কোড করতে হয়েছে N নাম_1 হিসাবে নামটির বৈশিষ্ট্যটি চেষ্টা করে; নেমফিল্ড = "নাম_1"; নাম = সারি.নামফিল্ড; বা নাম = সারি + "।" + নেমফিল্ড যেখানে নেমফিল্ড = আরকিপি.গেটপ্যারামিটারঅ্যাসটেক্সট (2) এবং নামটি নাম_1 কলামে রাখা আছে। কোন ধারনা? দ্রষ্টব্য আমি; "ব্যবহৃত" একটি নতুন লাইন বোঝাতে।
জর্জিসি


7

সীমান্ত কনটেইনার টুলসেট ঠিক আছে আপনি যা চান তা। আপনার যদি কেবল কোড স্নিপেটগুলি চান, স্ক্রিপ্টগুলির মধ্যে ফাংশনগুলি পরীক্ষা করা উচিত তবে একটি স্পষ্টভাবে সীমাবদ্ধতার সাথে ডিল করে।

সম্পাদনা

আমার যুক্ত করা উচিত যে স্ক্রিপ্টটি তৈরি আউটপুট ফাইলের বাম, ডান, শীর্ষ এবং নীচে ক্ষেত্রের মান যোগ করবে যা পরবর্তী প্রসেসিংয়ের জন্য ব্যবহার করা যেতে পারে


ধন্যবাদ। এটি পরীক্ষা করে দেখুন। আশা করি আমি আমার অজগর স্ক্রিপ্ট / মডেলগুলির মধ্যে কোডটি ব্যবহার করতে পারি।
জর্জিসি

2

আমি কেবল আর্কজিআইএস 10 এ ন্যূনতম বাউন্ডিং জ্যামিতি (খাম) (ডেটা ম্যানেজমেন্টে) চেষ্টা করেছি এবং সমস্ত ক্ষেত্রের জন্য এটি ঠিক একই রকম বলে মনে হচ্ছে।


1

আর একটি উপায় হ'ল শেফফাইলে সার্চকার্সার () করা, তারপরে আপনি সারি.শ্যাপ.ইসেন্ট ব্যবহার করতে পারেন:

rows = arcpy.SearchCursor(shapefileName)

for row in rows:
   extent = row.shape.extent
   ...
   ...

1

মধ্যে আবৃত হিসাবে ArcMap মধ্যে বহুভুজ ছেদচিহ্ন এর স্থানাঙ্ক নিষ্কাশন হচ্ছে? আপনি বহুভুজের শিখর পেতে পারেন এবং তারপরে বৈশিষ্ট্য সারণীতে ক্ষেত্র হিসাবে প্রতিটি শীর্ষবিন্দুর x এবং y স্থানাঙ্ক যুক্ত করতে পারেন। এটি সরাসরি প্রতিটি বহুভুজের সাথে সর্বাধিক / মিনিট স্থানাঙ্কগুলিতে সংযুক্ত না হওয়ার সীমাবদ্ধতা রয়েছে তবে এটি কয়েকটি উপায়ে অর্জন করা যেতে পারে।

আমি যে পদ্ধতির সাথে সবচেয়ে বেশি পরিচিত তা হ'ল পাই এবং পিএইচপি মডিউলটি ব্যবহার করে পাইথন তালিকায় x এবং y ক্ষেত্রগুলি পড়া , যা প্রতিটি বহুভুজের জন্য সর্বাধিক এবং সর্বনিম্ন মানগুলি সন্ধান করা যায়। মূল বহুভুতে নতুন ক্ষেত্র যুক্ত করতে এবং সঠিক বহুভুজের জন্য এই সর্বাধিক এবং ন্যূনতম মানগুলি লিখতে লেখক শ্রেণীর খোলার জন্য পাইশপ ব্যবহার করা যেতে পারে।

আমি বিশ্বাস করি এটি আরকিটি ব্যবহার করে করা যায় তবে 9.3-এ জিওপ্রসেসর ব্যবহার করে শেফফাইলে লেখার ক্ষেত্রে আমার অনেক সমস্যা হয়েছিল, তাই আমি পাইশপ পদ্ধতিটি পছন্দ করি তবে আরকি মডিউলটি এই সমস্যাগুলি সমাধান করেছে কিনা তা সম্পর্কে আমি নিশ্চিত নই।


0

আপনি কি "এক্সম্যাক্স" এ "এম" কে বড় করার চেষ্টা করেছিলেন? আমার মনে হয় এটি হওয়ার কথা:

print desc.extent.XMax

পরিবর্তে

print desc.extent.Xmax

ডকুমেন্টেশন অনুযায়ী । অবশ্যই এটি আমাকে আপনার প্রথম কোড স্নিপেট কীভাবে কাজ করেছিল তা অবাক করে তোলে। যেভাবেই হোক, শট দিন!

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