ArcGIS / ArcToolBox में स्वचालित रूप से बहुभुज मानचित्र में चार रंग प्रमेय कैसे लागू करें?


19

मुझे एक पॉलीगॉनल आकार में चार रंगों के प्रमेय को इस तरह से लागू करने की आवश्यकता है कि मुझे प्रत्येक क्षेत्र में डालने के लिए मैन्युअल रूप से प्रत्येक रंग चुनने की आवश्यकता नहीं है। मैं यह जानना चाहता हूं कि क्या कोई विस्तार, प्लग-इन, स्क्रिप्ट या डेटा बेस है जिसे आर्कजीआईएस और आर्कटूलबॉक्स के साथ गणितीय रूप से या प्रोग्रामिक रूप से उपयोग किया जा सकता है, इसलिए मैं इसे अब तक हर नक्शे के साथ उपयोग करने के लिए तैयार कर सकता हूं।

यहाँ छवि विवरण दर्ज करें यहाँ छवि विवरण दर्ज करें यहाँ छवि विवरण दर्ज करें


1
मैं यह भी जानना चाहूंगा कि क्या
आर्कमिस के

2
मैं पर एक से इनकी समाधान तैनात जीआईएस (कार्य के साथ Rकोड) और सर्वोत्कृष्ट समाधान (जो तीन या यहाँ तक कि दो रंगों का प्रयोग करेंगे वे काम करने के लिए पाया जा सकता है, तो) पर मेथेमेटिका । वह समाधान पुनरावर्ती है; मेरी पोस्ट का उत्तर एक रैखिक प्रोग्रामिंग समाधान देता है। ; कई गुना जीआईएस लंबे एक पांच रंग एल्गोरिथ्म में बनाया पड़ा है (पांच रंग प्राप्त करने के लिए अपेक्षाकृत आसान होता है चार रंग करने के लिए कठिन है।)।
whuber

यदि आपके पास डेस्कटॉप अनुशंसा के लिए मेरा "आर्कजीआईएस" अब तक कोई कोड नहीं है, तो बहुभुज पड़ोसियों के उपकरण के साथ शुरू करना होगा ताकि प्रत्येक बहुभुज के सभी पड़ोसियों को एक टेबल सूची मिल सके।
PolyGeo

@PolyGeo: टूल्स के लिए धन्यवाद (मुझे यह नहीं पता था) लेकिन मैं अपनी समस्या को हल करने के लिए इसका इस्तेमाल नहीं कर सका
9

जवाबों:


12

सबसे पहले, सभी उत्तरों और टिप्पणियों के लिए धन्यवाद। Unfortunetaly, मौजूदा उपकरण QGIS और ArcGIS के नवीनतम संस्करणों के साथ पूरी तरह से संगत नहीं थे। इसलिए मैंने @ पोलीगेगो द्वारा इंगित किए गए टूल, @ एलेक्सैंड्रे से क्यूजीआईएस प्लगइन और @जेन्स से एल्गोरिथ्म (चार रंग नक्शा) के नाम का उपयोग करके अपना समाधान बनाया।

यहां मेरी दिलचस्पी उन लोगों के लिए है (आर्कजीआईएस के लिए लेकिन दूसरा भाग क्यूजीआईएस में भी इस्तेमाल किया जा सकता है)।

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
यह शानदार है - इसे साझा करने के लिए बहुत बहुत धन्यवाद। मैंने आर्कजीआईएस 10.2 पर देखा, बहुभुज के उत्पादन की मेज पर फ़ील्ड के नाम थोड़े बदल गए हैं - खेतों को अब src_OBJECT और nbr_OBJECT
स्टीफन लीड

क्या यह स्क्रिप्ट इष्टतम है या क्या यह सुनिश्चित करता है कि न्यूनतम रंगों का उपयोग किया जाएगा?
रडार

1
जहां तक ​​मेरी समझ है, कच्चे बल की जरूरत है। जैसा कि मेरी पोस्ट में बताया गया है, आपको 4 रंगों तक पहुंचने का मौका देने के लिए इसे कई बार चलाना होगा।
राडोक्सु

फिर भी बढ़िया काम करता है! शायद src_ * और nbr_ * फ़ील्ड नाम इनपुट प्रकार पर निर्भर करते हैं। मैंने इसे अब जियोडेटाबेस fc इनपुट और डेस्कटॉप 10.5 के साथ चलाया और इन्हें src_OBJECTID और nbr_OBJECTID नाम दिया गया। स्क्रिप्ट को उन क्षेत्रों को सूचीबद्ध करने के लिए समायोजित किया जा सकता है जो src और nbr से शुरू होते हैं इसलिए इनपुट प्रकार (या आर्कजीआईएस का संस्करण) कोई फर्क नहीं पड़ता।
बेरा

4

एक VB6 डेवलपर नमूना और एक ArcGIS 9.x जियोप्रोसेसिंग टूल है लेकिन इस ArcGIS आइडिया पर टिप्पणियों से वे 10.0+ पर काम नहीं करते हैं।

शायद किसी को इसे पोर्ट करने में दिलचस्पी होगी।

TopoColour नामक QGIS समाधान इस संबंधित प्रश्न की टिप्पणियों में दिया गया है: रंग बहुभुज ताकि प्रत्येक उनके पड़ोसियों से अलग हो


3

यदि आप QGIS का उपयोग कर रहे हैं, तो मुझे विश्वास है कि आपको जो चाहिए वह है कलर मैप मैप

दुर्भाग्य से, प्लगइन केवल QGIS 1.8 संस्करण के लिए उपलब्ध है, लेकिन आप हमेशा यह देख सकते हैं कि कोड कैसे काम करता है!


3

यह एक फ़ंक्शन में @ radouxju के उत्तर का अनुकूलन है। यह इनपुट फ़ीचर परत में एक रंग क्षेत्र जोड़ देगा और गणना करेगा। यह PolygonNeighbors के क्षेत्र के नाम की समाप्ति की परवाह किए बिना काम करना चाहिए (वे विभिन्न उपयोगकर्ताओं / इनपुट / आर्कगिस संस्करणों (?) के लिए अलग-अलग प्रतीत होते हैं)

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')

यहाँ छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.