অর্কজিআইএস / আর্কটুলবক্স স্বয়ংক্রিয়ভাবে একটি বহুভুজ মানচিত্রে চার রঙের উপপাদ্য কীভাবে প্রয়োগ করবেন?


19

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

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


1
আমি আরও জানতে চাই যে কোয়ান্টামজিআইএসের মতো আরকিজিআইএস ব্যতীত অন্য সিস্টেমে এই কার্যকারিতা রয়েছে কিনা ...
করে_ডন্ট_বুলি_মে_স_লর্ডস

2
আমি জিআইএসে (ওয়ার্কিং Rকোড সহ) একটি সাবপটিমাল সলিউশন এবং একটি অনুকূল সমাধান (যা তিনটি বা এমনকি দুটি রঙ ব্যবহার করবে যদি তারা কাজ করতে পাওয়া যায় তবে) গাণিতিকের উপর পোস্ট করেছি । এই সমাধান পুনরাবৃত্তিযোগ্য; আমার পোস্টে উত্তর একটি রৈখিক প্রোগ্রামিং সমাধান দেয়। ; নানাবিধ জিআইএস দীর্ঘ পাঁচ রঙ অ্যালগরিদম সালে নির্মিত হয়েছে (পাঁচ রং অর্জন করা অপেক্ষাকৃত সহজ চার রং কি কঠিন।)।
whuber

ডেস্কটপের সুপারিশের জন্য আমার কাছে এখন পর্যন্ত কোনও "কোড" নেই , তবে প্রতিটি বহুভুজের সমস্ত প্রতিবেশীর তালিকাতে একটি টেবিল পাওয়ার জন্য বহুভুজ প্রতিবেশী সরঞ্জাম দিয়ে শুরু করা উচিত ।
পলিজিও

@ পলিজিও: সরঞ্জামগুলির জন্য ধন্যবাদ (আমি এটি জানতাম না) তবে আমি আমার সমস্যা সমাধানের জন্য এটি ব্যবহার করতে পারি না
রেডাক্সজু

উত্তর:


12

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

আগ্রহীদের জন্য আমার কোডটি এখানে রয়েছে (আর্কজিআইএসের জন্য তবে দ্বিতীয় অংশটি কিউজিআইএসেও ব্যবহৃত হতে পারে)।

arcpy.MakeFeatureLayer_management(fc, fc[:-4]+ "_lyr" )
try:
    arcpy.AddField_management(fc[:-4] + "_lyr", "color", "SHORT")
except:
    print "field alread exists"   
arcpy.CalculateField_management(fc[:-4] + "_lyr", "color",  "10" , "PYTHON")

arcpy.PolygonNeighbors_analysis(fc[:-4] + "_lyr", fc[:-4] + "_tb.dbf" )
graph = []
cursor=arcpy.da.SearchCursor( fc[:-4] + "_tb.dbf" , ("src_FID","nbr_FID") )
for row in cursor:
    graph.append(row)


pols = arcpy.da.UpdateCursor(fc[:-4] + "_lyr", ("OID@","color"))
colored = []
for pol in pols:
    nbrs = [ second for first, second in graph if first == pol[0]]
    usedcolors = []
    for nbr in nbrs:
        usedcolors += [second for first, second in colored if first == nbr]
    pol[1]=[color for color in range(10) if color not in usedcolors][0]
    colored.append(pol)
    pols.updateRow(pol)

মনে রাখবেন যে অ্যালগরিদম গ্যারান্টি দেয় না যে কেবল 4 টি রঙ ব্যবহার করা হয়েছে: যদিও এটি প্রমাণিত হয়েছে যে সমাধানটি বিদ্যমান, "ব্রুট ফোর্স" এটি অর্জনের জন্য প্রয়োজনীয়। আমার ক্ষেত্রে, আমি 7 টি রঙ পেয়েছি যা যথেষ্ট ছোট। সমাধানটি না পাওয়া পর্যন্ত স্ক্রিপ্টটিতে অতিরিক্ত লুপ থাকতে পারে তবে কয়েকশ মানচিত্রের জন্য আমার এটি করা দরকার এবং 7 টি রঙ ঠিক আছে।


2
এটি উজ্জ্বল - এটি ভাগ করে নেওয়ার জন্য অনেক অনেক ধন্যবাদ। আমি আর্কজিআইএস ১০.২ তে লক্ষ্য করেছি যে বহুভুজনিবার্স আউটপুট টেবিলের মাঠের নাম কিছুটা বদলেছে - ক্ষেত্রগুলিকে এখন src_OBJECT এবং nbr_OBJECT
স্টিফেন লিড

এই স্ক্রিপ্টটি কি সর্বোত্তম? এটি নিশ্চিত করে যে ন্যূনতম রং ব্যবহার করা হবে?
রাডার নীচে

1
আমি যতদূর বুঝতে পেরেছি, কাঁচা বাহিনী দরকার। আমার পোস্টে উল্লিখিত হিসাবে, 4 টি রঙে পৌঁছানোর সুযোগ পেতে আপনাকে এটি বেশ কয়েকবার চালাতে হবে।
Radouxju

এখনও দুর্দান্ত কাজ! হয়তো src_ * এবং nbr_ * ক্ষেত্রের নামগুলি ইনপুট ধরণের উপর নির্ভর করে। আমি এখন এটি জিওডাটাবেসস এফসি ইনপুট এবং ডেস্কটপ 10.5 দিয়ে চালিয়েছি এবং তাদের নাম দেওয়া হয়েছে src_OBJECTID এবং nbr_OBJECTID। স্ক্রিপ্টটি সেই ক্ষেত্রগুলির তালিকাতে সমন্বয় করা যেতে পারে যা এসআরসি এবং এনবিআর দিয়ে শুরু হয় তাই ইনপুট টাইপ (বা আরকজিআইএসের সংস্করণ) কোনও বিষয় নয়।
বিআরএ

4

এখানে একটি ভিবি 6 বিকাশকারী নমুনা এবং একটি আর্কজিআইএস 9.x জিওপ্রসেসিং সরঞ্জাম রয়েছে তবে এই আর্কজিআইএস আইডিয়াতে দেওয়া মন্তব্যগুলি থেকে তারা 10.0+ এ কাজ করে না।

সম্ভবত কেউ এটি পোর্ট করতে আগ্রহী হবে।

এই সম্পর্কিত প্রশ্নের মন্তব্যে টোপোকলর নামে একটি কিউজিআইএস সমাধান দেওয়া হয়েছে: রঙ বহুভুজ তাই প্রতিটি তার প্রতিবেশীদের থেকে পৃথক


3

আপনি যদি কিউজিআইএস ব্যবহার করেন তবে আমি বিশ্বাস করি যে আপনার যা প্রয়োজন তা হ'ল রঙিন একটি মানচিত্র প্লাগইন

দুর্ভাগ্যক্রমে, প্লাগইনটি কেবল কিউজিআইএস 1.8 সংস্করণের জন্য উপলব্ধ, তবে আপনি সর্বদা ডাউনলোড করে দেখতে পারেন যে কোডটি কীভাবে কাজ করে!


3

এটি একটি ফাংশনে @ রডউক্সজুর উত্তরের একটি রূপান্তর। এটি ইনপুট বৈশিষ্ট্য স্তরে একটি রঙের ক্ষেত্র যুক্ত করবে এবং গণনা করবে। পলিগননিবার্সের ফিল্ড নেম শেষ না হওয়াতে এটি কাজ করা উচিত (তারা বিভিন্ন ব্যবহারকারীর / ইনপুট / আর্কগিস সংস্করণগুলিতে আলাদা? ())

def color_me(feature_layer):
    import arcpy
    try:
        arcpy.AddField_management(feature_layer, 'color', 'SHORT')
    except:
        print 'field alread exists'   

    arcpy.CalculateField_management(feature_layer, 'color',  '10' , 'PYTHON')

    arcpy.PolygonNeighbors_analysis(feature_layer, r'in_memory\neighbor_table' )
    graph = []
    neighbor_fields = [f.name for f in arcpy.ListFields(r'in_memory\neighbor_table') if f.name.startswith(('src', 'nbr'))]
    cursor=arcpy.da.SearchCursor(r'in_memory\neighbor_table' , neighbor_fields)
    for row in cursor:
        graph.append(row)

    pols = arcpy.da.UpdateCursor(feature_layer, ('OID@','color'))
    colored = []

    for pol in pols:
        nbrs = [ second for first, second in graph if first == pol[0]]
        usedcolors = []
        for nbr in nbrs:
            usedcolors += [second for first, second in colored if first == nbr]
        pol[1]=[color for color in range(10) if color not in usedcolors][0]
        colored.append(pol)
        pols.updateRow(pol)
    arcpy.Delete_management(r'in_memory\neighbor_table')

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

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