วิธีการใช้ทฤษฎีบทสี่สีในแผนที่รูปหลายเหลี่ยมใน ArcGIS / ArcToolBox โดยอัตโนมัติ?


19

ฉันต้องใช้ทฤษฎีบทสี่สีในรูปหลายเหลี่ยมในแบบที่ฉันไม่จำเป็นต้องเลือกสีแต่ละสีด้วยตนเองเพื่อใส่ในแต่ละภูมิภาค ฉันต้องการทราบว่ามีส่วนขยาย, ปลั๊กอิน, สคริปต์หรือฐานข้อมูลที่อาจใช้กับ ArcGIS และ ArcToolBox เพื่อทำมันในเชิงคณิตศาสตร์หรือเชิงโปรแกรมหรือไม่ดังนั้นฉันสามารถใช้มันกับแผนที่ทุกครั้งที่ฉันสร้าง

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่


1
ฉันยังต้องการที่จะรู้ว่ามีฟังก์ชั่นนี้ในระบบอื่นที่ไม่ใช่ ArcGIS เช่น QuantumGIS ...
Please_Dont_Bully_Me_SO_Lords

2
ผมโพสต์เป็นทางออกที่ก่อให้เกิดผลลัพธ์ในระบบสารสนเทศภูมิศาสตร์ (กับการทำงานRcode) และทางออกที่ดีที่สุด (ซึ่งจะใช้สามหรือสองสีถ้าพวกเขาสามารถพบได้ในการทำงาน) บนMathematica โซลูชันนั้นวนซ้ำ การตอบกลับโพสต์ของฉันให้โซลูชันการเขียนโปรแกรมเชิงเส้น Manifold GIS มีอัลกอริธึมห้าสีในตัว (สีสี่สีนั้นยากที่จะทำได้ห้าสีนั้นง่ายต่อการบรรลุ)
whuber

หากคุณไม่มีคำแนะนำ "ArcGIS for Desktop ของฉัน" จะเริ่มต้นด้วยเครื่องมือPolygon Neighborเพื่อให้ได้ตารางที่แสดงรายการเพื่อนบ้านทั้งหมดของรูปหลายเหลี่ยมแต่ละอัน
PolyGeo

@PolyGeo: ขอบคุณสำหรับเครื่องมือที่ (ผมไม่ทราบว่ามัน) แต่ฉันไม่สามารถใช้มันในการแก้ปัญหาของฉัน
radouxju

คำตอบ:


12

ก่อนอื่นขอขอบคุณสำหรับคำตอบและความคิดเห็นทั้งหมด น่าเสียดายที่เครื่องมือที่มีอยู่ไม่สามารถใช้งานร่วมกับ QGIS และ ArcGIS เวอร์ชันล่าสุดได้อย่างสมบูรณ์ ดังนั้นฉันจึงสร้างโซลูชันของตัวเองโดยใช้เครื่องมือที่ระบุโดย @polygeo, ปลั๊กอิน QGIS จาก @Alexandre และชื่อของอัลกอริทึม (แผนที่สี่สี) จาก @Jens

นี่คือรหัสของฉันสำหรับผู้ที่สนใจ (สำหรับ ArcGIS แต่ส่วนที่สองสามารถใช้ใน QGIS ได้เช่นกัน)

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
มันยอดเยี่ยมมาก - ขอบคุณมากสำหรับการแบ่งปัน ฉันสังเกตเห็นที่ ArcGIS 10.2 ชื่อเขตข้อมูลในตารางผลลัพธ์ PolygonNe Neighbour มีการเปลี่ยนแปลงเล็กน้อย - ตอนนี้เขตข้อมูลที่เรียกว่าsrc_OBJECTและnbr_OBJECT
Stephen Lead

สคริปต์นี้เหมาะสมหรือไม่ซึ่งจะช่วยให้แน่ใจว่าจะใช้สีขั้นต่ำหรือไม่
ใต้ Radar

1
เท่าที่ฉันเข้าใจต้องใช้กำลังดิบ ดังที่ได้กล่าวไว้ในโพสต์ของฉันคุณต้องวิ่งหลายครั้งเพื่อให้มีโอกาสเข้าถึง 4 สี
radouxju

ยังใช้งานได้ดี! บางทีชื่อฟิลด์ src_ * และ nbr_ * ขึ้นอยู่กับประเภทอินพุต ฉันรันตอนนี้พร้อมอินพุต fc geodatabase และเดสก์ท็อป 10.5 และพวกเขาชื่อ src_OBJECTID และ nbr_OBJECTID สคริปต์สามารถปรับเพื่อแสดงรายการฟิลด์ที่เริ่มต้นด้วย src และ nbr ดังนั้นประเภทอินพุต (หรือเวอร์ชันของ ArcGIS) จึงไม่สำคัญ
BERA

4

มีตัวอย่างนักพัฒนา VB6และเครื่องมือการทำgeoprocessing ArcGIS 9.xแต่จากความคิดเห็นในแนวคิด ArcGISนี้พวกเขาไม่ทำงานที่ 10.0+

บางทีใครบางคนอาจจะสนใจที่จะพอร์ตมัน

วิธีการแก้ปัญหา QGIS ที่เรียกว่าTopoColourมีให้ในความคิดเห็นของคำถามที่เกี่ยวข้องนี้: รูปหลายเหลี่ยมสีดังนั้นแต่ละสีจึงแตกต่างจากเพื่อนบ้าน


3

หากคุณกำลังใช้ QGIS ผมเชื่อว่าสิ่งที่คุณต้องการคือระบายสีปลั๊กอินแผนที่

น่าเสียดายที่ปลั๊กอินนี้มีเฉพาะในรุ่น QGIS 1.8 แต่คุณสามารถดาวน์โหลดและดูว่ารหัสทำงานอย่างไร!


3

นี่คือการปรับคำตอบของ @ radouxju ให้เป็นฟังก์ชัน มันจะเพิ่มฟิลด์สีให้กับเลเยอร์ฟีเจอร์อินพุตและคำนวณ มันควรจะทำงานโดยไม่คำนึงถึงจุดสิ้นสุดของชื่อเขตข้อมูลของ PolygonNe Neighbour (ดูเหมือนจะแตกต่างกันสำหรับผู้ใช้ / รุ่น / arcgis รุ่นต่าง ๆ (?))

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.