অর্কিপাই ব্যবহার করে মিডপয়েন্টে বহুভুজগুলি বিভক্ত করবেন?


14

আমি তাদের মধ্য বিন্দুতে প্রায় 4000 বহুভুজকে বিভক্ত করার চেষ্টা করছি, যা তাদের দীর্ঘতম অক্ষের লম্ব (লম্বালম্বি প্রস্থের মাঝখানে), নীচের চিত্রের মতো।

এখানে চিত্র বর্ণনা লিখুন

আদর্শভাবে, আমি এটি স্বয়ংক্রিয়ভাবে করতে চাই এবং প্রতিটি বহুভুজকে ম্যানুয়ালি বিভক্ত করা এড়াতে চাই। আমি বহুভুজের মধ্যবিন্দুটি প্রত্যেকে আঁকতে পারে এমন দীর্ঘতম রেখাগুলি রূপান্তরিত করেছি, কেবলমাত্র এই বিন্দুটি স্বয়ংক্রিয়ভাবে প্রস্থের রেখা আঁকার জন্য আমাকে একটি পদ্ধতি নির্ধারণ করতে হবে।

বহুভুজগুলি তাদের প্রস্থে পরিবর্তিত হয় এবং তাই যে সরঞ্জামগুলি নির্দিষ্ট দৈর্ঘ্যের প্রস্থের রেখা নির্ধারণ করে বহুভুজকে বিভক্ত করে সেগুলি আসলে আমি যা খুঁজছি তা নয়।

কোন ধারনা?


সমস্ত বহুভুজ উত্তল হয়?
আনসারজিআইএস

হ্যাঁ, তারা উপরের চিত্রের মতো দেখাবে বলেই কমবেশি আকারের।
ম্যাট

বর্ণিত gis.stackexchange.com/questions/201867/… হিসাবে উল্লিখিতভাবে লম্ব তৈরি করুন বহুভুজের বৈশিষ্ট্যের জন্য এগুলি এবং আসল ইনপুট হিসাবে ব্যবহার করুন। এটি সীমানার পয়েন্টগুলি কাছাকাছি করতে সহায়তা করবে
ফেলিক্সআইপি

@ ম্যাট আমার উত্তরটি আপনার সমস্যার সমাধান করেছে? যদি তা হয় তবে আপনি চেকবক্সের সাথে উত্তর হিসাবে চিহ্নিত করতে পারেন?
বেরো

উত্তর:


23

স্ক্রিপ্ট নীচে বিভক্ত বহুভুজগুলির নতুন বৈশিষ্ট্য শ্রেণি এবং তাদের বিভক্ত করার জন্য ব্যবহৃত লাইনগুলি আউটপুট দেবে। উন্নত লাইসেন্স প্রয়োজন।

বহুভুজগুলি এভাবে বিভক্ত হবে: এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

নূন্যতম বাউন্ডিং জ্যামিতি আয়তক্ষেত্রের সেন্ট্রয়েড মিডপয়েন্ট হিসাবে ব্যবহার করে এবং আয়তক্ষেত্রটি জুড়ে বিভক্ত।

import arcpy
print 'Running'
arcpy.env.workspace = r'C:\TEST.gdb'    #Change to match your data
infc = r'polygons123'                   #Change to match your data
outfc_splitlines = r'splitlines'        
outfc_splitpolygons=r'splitpolygons'    

spatial_ref = arcpy.Describe(infc).spatialReference
arcpy.CreateFeatureclass_management(out_path=arcpy.env.workspace, out_name=outfc_splitlines, geometry_type='POLYLINE',spatial_reference=spatial_ref) #Creates a new feature class to hold the split lines

with arcpy.da.SearchCursor(infc,['SHAPE@','SHAPE@X','SHAPE@Y']) as cursor: #For each input polygon create a minimum bounding rectangle
    for row in cursor:
        arcpy.MinimumBoundingGeometry_management(row[0],r'in_memory\bounding','RECTANGLE_BY_WIDTH')
        arcpy.SplitLine_management(r'in_memory\bounding', r'in_memory\splitline') #Split the rectangle into four lines, one for each side
        linelist=[]
        with arcpy.da.SearchCursor(r'in_memory\splitline',['SHAPE@LENGTH','SHAPE@']) as cursor2:
            for row2 in cursor2:
                linelist.append(row2) #Store the lines lenghts and geometries in a list
            linelist=sorted(linelist,key=lambda x: x[0]) #Sort shortest to longest (the two shortest sides of the rectangles come first and second in list)
        arcpy.CopyFeatures_management(in_features=linelist[0][1], out_feature_class=r'in_memory\templine') #Copy the first line to memory
        with arcpy.da.UpdateCursor(r'in_memory\templine',['SHAPE@X','SHAPE@Y']) as cursor3:
            for row3 in cursor3:
                newcentroidx=row[1] #Find x coord of bounding rectangle centroid
                newcentroidy=row[2] #Find y..
                row3[0]=newcentroidx #Assign this to the shortest line
                row3[1]=newcentroidy #Assign this to the shortest line
                cursor3.updateRow(row3) #Move the line to the centroid of bounding rectangle
        arcpy.Append_management(inputs=r'in_memory\templine', target=outfc_splitlines) #Save this line in splitline feature class
#After all split lines are created convert input polygons to lines, merge with split lines and create new polygons from lines.

arcpy.FeatureToLine_management(in_features=infc, out_feature_class=r'in_memory\polytemp')
arcpy.Merge_management(inputs=[r'in_memory\polytemp',outfc_splitlines], output=r'in_memory\templines')
arcpy.FeatureToPolygon_management(in_features=r'in_memory\templines', out_feature_class=outfc_splitpolygons)
print 'Done'

এখানে চিত্র বর্ণনা লিখুন

বৈশিষ্ট্যগুলি হারিয়ে যাবে তবে এগুলি যুক্ত করতে আপনি স্থানিক যোগ ব্যবহার করতে পারেন।


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

হাই বেরা, ধীর উত্তরের জন্য দুঃখিত। স্ক্রিপ্টটি নিম্নলিখিত ত্রুটিটি আউটপুট করে কাজ করছে বলে মনে হচ্ছে না: ERROR 000466: in_memory \ টেম্পলাইন লক্ষ্য স্প্লিটলাইনের স্কিমার সাথে মেলে না (কার্যকর) ব্যর্থ হয়েছে।
ম্যাট

1
Arcpy.Append_management (ইনপুট = r'in_memory \ templine ', টার্গেট = outfc_splitlines, schema_type =' NO_TEST '): সংযোজন লাইন পরিবর্তন করার চেষ্টা করুন
Bera

এবার অন্য একটি ত্রুটি পেয়েছে বলে মনে হচ্ছে: পার্সিং ত্রুটি ইন্ডেন্টেশনের ত্রুটি: আনইন্ডেন্ট কোনও বাহ্যিক ইনডেন্টেশন স্তরের সাথে মেলে না (লাইন 28)
ম্যাট

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