প্রতিটি বহুভুজের কোণে সংখ্যা বের করা?


14

আমার কাছে আরকজিআইএস ডেস্কটপ 10.2 রয়েছে এবং আমার চ্যালেঞ্জটি হ'ল এই জাতীয় সমস্ত বৈশিষ্ট্যগুলির জন্য প্রতিটি বহুভুজের মধ্যে সংখ্যার শীর্ষাংশকে কীভাবে বের করতে হবে:

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

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

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

আমার বৈশিষ্ট্য শ্রেণিতে আমার অনেকগুলি পার্সেল রয়েছে এবং আমি সমস্ত বৈশিষ্ট্যের জন্য পৃথক্ সংখ্যাটি আলাদাভাবে বের করতে চাই, তারপরে আমি সমস্ত শীর্ষকোষের জন্য এক্সওয়াই স্থানাঙ্ক প্রদর্শন করতে চাই।

আরও তথ্যের জন্য, আমি কেবল প্রতিটি বহুভুজের জন্য উল্লম্ব রূপান্তর করতে চাই এবং প্রতিটি সংখ্যাটি 1 সংখ্যা থেকে শুরু করে প্রতিটি উল্লম্বের প্রদর্শনের সংখ্যাটি দেখতে চাই, সুতরাং আমার যদি বহুভুজ থাকে এবং এটির একটি 4 টি শীর্ষ থাকে, বহুভুজকে শীর্ষে রূপান্তর করতে চান আমি এই জাতীয় শীর্ষকোষকে প্রদর্শন করি (1,2,3,4,5), তারপরে প্রতিটি শীর্ষকোষের জন্য এক্সওয়াই প্রদর্শন করে, আমি মনে করি যে আসল চ্যালেঞ্জ আইডিতে কীভাবে সমস্ত বহুভুজকে শীর্ষে রূপান্তর করা যায় এবং প্রতিটি সংখ্যাটি 1 নম্বর থেকে শুরু করে তৈরি করা হয়।


আপনার সম্পাদনার উপর ভিত্তি করে, আপনি কি প্রতিটি বৈশিষ্ট্যের বৈশিষ্ট্য এবং এক্সওয়াই স্থানাঙ্কের জন্য একটি অনন্য আইডি (1 .... এন) রাখতে চান? আপনি কি লেবেলিং উদ্দেশ্যে এই সমস্ত তথ্যের জন্য একটি কলাম / ক্ষেত্র পছন্দ করতে পারেন যেমন [[1, 942744.1234, 924654.1234] [২, 952744.1234, 925654.1234] ...?
হারুন

হ্যাঁ, ভুল না হলে এই ফাইলের জন্য প্রতিটি বহুভুজের (1,2,3,4), (1,2,3,4,5), (1,2,3,4), এক 1,2,3,4, উল্লম্ব সংখ্যার জন্য একটি আইডি আছে 5,6,), (1,2,3,4,5,6,7,8,9) ইত্যাদি, তারপর আমি মনে করি XY সম্পর্কে সহজ হতে পারে যদি আমরা আর্টলবক্স থেকে xy সরঞ্জাম যোগ করি
জিআইএস ম্যান

উত্তর:


5

নীচের কোডটি অন্য উত্তরগুলিকে একত্রিত করে এবং শীর্ষবিন্দুগুলিকে সংখ্যায় সামান্য যোগ করে। ফলাফল

import arcpy
arcpy.env.workspace = "in_memory"
#paths
fc = r"...\polygons"
fc_out = r"...\vertices"
arcpy.MakeFeatureLayer_management(fc, "lyr")
# add fields if needed
for FIELD in ["DRAW_ORDER", "COUNT"]:
    if FIELD not in [field.name for field in arcpy.ListFields(fc)]:
        try:
            arcpy.AddField_management("lyr", FIELD, "SHORT")
        except Exception as e:
            print e
# get the number of points minus overlapping (@dmahr - GSE)
arcpy.CalculateField_management("lyr", "COUNT", "!Shape!.pointCount-!Shape!.partCount", "PYTHON")
# dict to iterate and check count
OIDS = {}
for row in arcpy.da.SearchCursor("lyr", ["OBJECTID", "COUNT"]):
    OIDS[row[0]] = row[1]
del row
# get vertices as points and add XY (@Aaron - GSE)
arcpy.FeatureVerticesToPoints_management("lyr", fc_out)
arcpy.AddXY_management(fc_out)
# start adding a number to the points
for OID in OIDS:
    order_count = 1
    rows = arcpy.da.UpdateCursor(fc_out, ["DRAW_ORDER", "COUNT"], "ORIG_FID = %d"%OID)
    for row in rows:
        # will leave the overlapping as NULL
        if order_count <= OIDS[OID]:
            row[0] = order_count
            rows.updateRow(row)
            order_count += 1
##        # this can set the overlapping to 0 or some unique value (999)
##        else:
##            row[0] = 0
##            rows.updateRow(row)

পয়েন্টগুলি অঙ্কন ক্রমে লেবেলযুক্ত। শেষ পয়েন্টটির (প্রথমটির নীচে) কোনও লেবেল থাকবে না এবং পুনর্নির্মাণের প্রয়োজন না হলে নুল বা অনন্য, "DRAW_ordER" মান রয়েছে এমন সমস্ত পয়েন্ট নির্বাচন করে মুছে ফেলা যাবে। একটি সংজ্ঞা কোয়েরি প্রদর্শন থেকে ওভারল্যাপিং পয়েন্টগুলি সরাতে ব্যবহার করা যেতে পারে।

এক্সওয়াই ডেটা উপস্থিত, তবে আমি এটি আপনার লেবেলিং / আকাঙ্ক্ষাগুলি প্রদর্শন করব। লেবেলিংয়ের জন্য এক্সওয়াই ফিল্ড যুক্ত করার বিষয়ে হারুনের উত্তর দেখুন।

আমি ফিচারক্লাসের সাথে নাম্পার অ্যারেতেও টোয়িং করছিলাম তবে আমি এটি প্রথম শেষ করেছি।


আপনাকে @ gm70560 ধন্যবাদ, আমি আপনার কোড ভেরিয়েবলগুলি অনুসরণ করেছি এবং এটি .py হিসাবে সংরক্ষণ করেছি, কিন্তু যখন আমি এটি সম্পাদন করতে চাই, একটি ত্রুটি বার্তা উপস্থিত হয়, "নির্দিষ্ট ক্ষেত্রের নামটি টেবিলের মধ্যে বিদ্যমান নেই", তাই আমি কী করতে পারি ?
জিআইএস ম্যান

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

এটি ক্ষেত্রটি যোগ করেনি (?) ফলাফলগুলিতে আরও কী ঘটেছিল? পুরো ফলাফল ডাম্প করার জন্য আমার কাছে একটি চ্যাট রুম রয়েছে । একটি মন্তব্য ছেড়ে দিন যাতে আমি রুমটি চেক করতে পারি।
gm70560

22

এটি করার সহজতম উপায় হ'ল পার্সেল স্তরের বৈশিষ্ট্য টেবিলটিতে একটি নতুন পূর্ণসংখ্যার ক্ষেত্র যুক্ত করা। তারপরে, নিম্নলিখিত অভিব্যক্তি সহ ফিল্ড ক্যালকুলেটর চালান:

!Shape!.pointCount-!Shape!.partCount

!Shape!.pointCountবৈশিষ্ট্য ছেদচিহ্ন মোট সংখ্যা ফেরৎ। তবে বৈশিষ্ট্যটি বন্ধ করার জন্য প্রতিটি অংশের প্রথম ভার্টেক্সটি শেষে পুনরাবৃত্তি করা হয়। এটি পরিচালনা করতে, প্রতিটি অংশ ব্যবহার করে একটি ভার্টেক্স বিয়োগ করে -!Shape!.partCount

নোট করুন যে এই অভিব্যক্তিটি কাজ করতে আপনাকে পাইথন পার্সার ব্যবহার করতে হবে।

ক্ষেত্র ক্যালকুলেটর


এটি সত্যিই দুর্দান্ত, তবে এই প্রতিটি শীর্ষকে XY সরবরাহ করবে না। উত্তরটি মনে হচ্ছে সমস্ত অনুরোধ করা তথ্য পেতে উভয় প্রতিক্রিয়া (যেমন, @ অ্যারোন এর) ব্যবহার করা হবে।
রোল্যান্ড

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

আপনাকে অনেক ধন্যবাদ @ দমাহার, আমি মনে করি একটি পদক্ষেপ অনুপস্থিত রয়েছে, যখন আমি মূল্য গণনা করি, ফলাফলটি অনুপাতের সংখ্যা গণনা করে, তাই যদি আমার 5 টি উল্লম্ব সহ পার্সেল বৈশিষ্ট্য শ্রেণি থাকে তবে আমি এটি 1,2,3 এর মতো প্রদর্শন করতে চাই , প্রতিটি শীর্ষে 4,5, সমস্ত সংখ্যাকে একটি সংখ্যায় গণনা করা না, এটি আসল চ্যালেঞ্জ, প্রতিটি পার্সেলের 1 নম্বর থেকে শুরু করে প্রতিটি শীর্ষে জন্য কীভাবে সংখ্যা প্রদর্শন করা যায় display
জিআইএস ম্যান

12

dmahr শীর্ষে গণনা করার জন্য একটি ভাল সমাধান সরবরাহ করেছে। এক্সওয়াই কন্ডোর্ডের সাথে প্রতিটি পয়েন্টকে লেবেল করার জন্য একটি অ-প্রোগ্রামিক পদ্ধতিতে, নিম্নলিখিত কর্মপ্রবাহটি চেষ্টা করুন:

  1. পয়েন্টগুলিতে বৈশিষ্ট্যগুলি
  2. নতুন পয়েন্ট এফসি "এক্স", "ওয়াই" তে দুটি নতুন ক্ষেত্র (টাইপ করুন: ডাবল) যুক্ত করুন
  3. জ্যামিতি গণনা করুন। ডান ক্লিকের ক্ষেত্র> জ্যামিতির গণনা করুন ...> পয়েন্টের এক্স স্থানাঙ্ক (ওয়াই ক্ষেত্রের জন্য পুনরাবৃত্তি)
  4. অন্য একটি ক্ষেত্র "XY" যুক্ত করুন (প্রকার: পাঠ্য)
  5. ক্ষেত্র ক্যালকুলেটরে "XY" ক্ষেত্র গণনা করুন, যেখানে XY =

    str (! x!) + "," + টিআর (! ওয়াই!)

  6. লেবেল বৈশিষ্ট্য। ডান ক্লিক স্তর> লেবেল> লেবেল ক্ষেত্র: XY

এটি নিম্নলিখিত ফলাফল উত্পাদন করে:

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

আপনি সার্চ কার্সর (শুরু হিসাবে) explode_to_pointsদিয়ে প্রোগ্রামগুলি ব্যবহার করে এই ক্রিয়াগুলি সম্পাদন করতে পারেন ।

একটি বৈশিষ্ট্যটিকে এর পৃথক পয়েন্ট বা শীর্ষে বিভক্ত করুন। যদি এক্সপ্লোড_ টু পয়েন্টগুলি সত্যতে সেট করা থাকে, উদাহরণস্বরূপ, পাঁচটি পয়েন্ট সহ একটি মাল্টিপয়েন্ট বৈশিষ্ট্য।

(ডিফল্ট মান মিথ্যা)

arcpy.da.SearchCursor (in_table, field_names, {where_clause}, {spatial_reference}, {explode_to_points}, {sql_clause})

দেখে মনে হচ্ছে যে কোনওটির জন্য একটি পোস্ট প্রক্রিয়া প্রয়োজন হবে বা @ ডিএমআর এর উত্তরটি ব্যবহার করতে হবে शिरোখণ্ডের প্রতি # বৈশিষ্ট্যের সংমিশ্রণ পেতে।
রোল্যান্ড

4

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

কাস্টম স্ক্রিপ্ট সরঞ্জাম কোড:

import arcpy
in_fc = arcpy.GetParameterAsText(0)

features = [feature[0] for feature in arcpy.da.SearchCursor(in_fc,"SHAPE@")]
count_vertices = sum([f.pointCount-f.partCount for f in features])
arcpy.AddMessage("***************************************")
arcpy.AddMessage("Number of vertices in the layer: {0}".format(count_vertices))
arcpy.AddMessage("***************************************")

পাইথন অ্যাড-ইন কোড (শীর্ষ শীর্ষগুলি গণনা করতে TOC এর একটি স্তর নির্বাচন করুন):

import arcpy
import pythonaddins

arcpy.env.overwriteOutput = True
mxd = arcpy.mapping.MapDocument("current")
in_fc = pythonaddins.GetSelectedTOCLayerOrDataFrame()

features = [feature[0] for feature in arcpy.da.SearchCursor(in_fc,"SHAPE@")]
count_vertices = sum([f.pointCount-f.partCount for f in features])

pythonaddins.MessageBox(count_vertices, 'Number of vertices in {0}'.format(in_fc.name), 0)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.