ArcGIS / ArcToolBox içindeki çokgen bir haritada dört renk teoremini otomatik olarak nasıl uygulayabilirim?


19

Ben uygulamak gerekir dört renkler teoremini elle her bölgede koymak için her renk seçmek gerekmez bir şekilde bir çokgen şeklinde. Matematiksel veya programlı olarak yapmak için ArcGIS ve ArcToolBox ile kullanılabilecek herhangi bir uzantı, eklenti, komut dosyası veya veri tabanı olup olmadığını bilmek istiyorum, bu yüzden oluşturmak için geldim her harita ile şimdi kullanabilirsiniz.

resim açıklamasını buraya girin resim açıklamasını buraya girin resim açıklamasını buraya girin


1
Ayrıca, ArcGIS dışındaki diğer sistemlerde QuantumGIS gibi bu işlevsellik olup olmadığını bilmek istiyorum ...
Please_Dont_Bully_Me_SO_Lords

2
Ben bir Suboptimal çözüm yayınlanmıştır GIS (çalışma ile Rkod) ve üzerinde (onlar işe bulunabilir eğer üç hatta iki renk kullanacağız) optimal bir çözüm Mathematica . Bu çözüm özyinelemelidir; görevime geri cevap doğrusal programlama çözümü verir. Manifold GIS uzun zamandır yerleşik beş renk algoritmasına sahiptir. (Dört renklendirme yapmak zordur; beş renklendirme elde etmek nispeten kolaydır.)
whuber

Şimdiye kadar "kodunuz" yoksa, ArcGIS for Desktop tavsiyem , her çokgenin tüm komşularını listeleyen bir tablo almak için Çokgen Komşular aracıyla başlamak olacaktır .
PolyGeo

@PolyGeo: araçlar için teşekkürler (bilmiyordum) ama sorunumu çözmek için kullanamadım
radouxju

Yanıtlar:


12

Her şeyden önce, tüm cevaplar ve yorumlar için teşekkürler. Ne yazık ki, mevcut araçlar QGIS ve ArcGIS'in en son sürümleriyle tam uyumlu değildi. Bu nedenle @polygeo tarafından belirtilen aracı, @Alexandre'den QGIS eklentisini ve @Jens'ten algoritmanın adını (dört renk haritası) kullanarak kendi çözümümü yaptım.

İlgilenenler için kodum (ArcGIS için ama ikinci bölüm QGIS'de de kullanılabilir).

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)

Algoritmanın sadece 4 rengin kullanılmasını garanti etmediğini unutmayın: çözümün var olduğu kanıtlanmış olsa da, bunu elde etmek için "kaba kuvvet" gereklidir. Benim durumumda, yeterince küçük 7 renk var. Komut dosyası çözüm bulunana kadar ek bir döngü olabilir, ancak yüzlerce harita ve 7 renk için bunu yapmam gerekiyor.


2
Bu harika - paylaştığınız için çok teşekkürler. ArcGIS 10.2'de PolygonNeighbors çıktı tablosundaki alan adlarının biraz değiştiğini fark ettim - alanlar şimdi src_OBJECT ve nbr_OBJECT olarak
Stephen Lead

Bu komut dosyası optimal mi yani minimum renk kullanılmasını sağlıyor mu?
Radarın Altında

1
Anladığım kadarıyla, ham güce ihtiyaç var. Yazımda da belirtildiği gibi, 4 renge ulaşma şansı elde etmek için birkaç kez çalıştırmalısınız.
radouxju

Hala harika çalışıyor! Belki src_ * ve nbr_ * alan adları giriş türüne bağlıdır. Şimdi bir geodatabase fc girişi ve Desktop 10.5 ile çalıştırdım ve src_OBJECTID ve nbr_OBJECTID olarak adlandırıldılar. Komut dosyası, giriş türü (veya ArcGIS sürümü) önemli olmadığından src ve nbr ile başlayan alanları listeleyecek şekilde ayarlanabilir.
BERA


3

QGIS kullanıyorsanız, ihtiyacınız olanın bir harita eklentisi renklendirme olduğuna inanıyorum .

Ne yazık ki, eklenti sadece QGIS 1.8 sürümü için kullanılabilir, ancak her zaman kodun nasıl çalıştığını indirebilir ve görebilirsiniz!


3

Bu @ radouxju'nun cevabının bir fonksiyona uyarlanmasıdır. Giriş özelliği katmanına bir renk alanı ekler ve hesaplar. PolygonNeighbours'un alan adı sonlarına bakılmaksızın çalışmalıdır (farklı kullanıcılar / girişler / arcgis sürümleri (?) İçin farklı görünüyorlar)

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

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.