ArcGIS / ArcToolBox의 다각형 맵에 4 가지 색상 정리를 자동으로 적용하는 방법은 무엇입니까?


19

각 지역에 넣을 각 색상을 수동으로 선택할 필요가없는 방식으로 다각형 모양으로 4 가지 색상 정리 를 적용 해야합니다. 수학 또는 프로그래밍 방식으로 ArcGIS 및 ArcToolBox와 함께 사용할 수있는 확장, 플러그인, 스크립트 또는 데이터베이스가 있는지 알고 싶습니다. 그래서 내가 만든 모든 맵에서 지금 사용할 수 있습니다.

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오


1
또한
QuantumGIS

2
MathematicaGIS (작동 R코드가있는)와 최적의 솔루션 (작동하는 경우 3 ~ 2 가지 색상을 사용할 것) 에 차선책을 게시했습니다 . 이 솔루션은 재귀 적입니다. 내 게시물에 대한 답변 은 선형 프로그래밍 솔루션을 제공합니다. 매니 폴드 GIS 긴 내장 5 색 알고리즘을했다 (네 착색이해야 할 어려운, 다섯 색상을 달성하기 위해 상대적으로 간단하다.).
whuber을

"지금까지의 코드"가 없으면 ArcGIS for Desktop 권장 사항은 다각형 이웃 도구로 시작하여 각 다각형의 모든 이웃을 나열하는 테이블을 얻는 것입니다.
PolyGeo

@PolyGeo : 도구에 대해 감사합니다 (모릅니다). 그러나 문제를 해결하는 데 사용할 수 없습니다
radouxju

답변:


12

우선, 모든 답변과 의견에 감사드립니다. 불행히도 기존 도구는 최신 버전의 QGIS 및 ArcGIS와 완전히 호환되지 않았습니다. 따라서 @polygeo, @Alexandre의 QGIS 플러그인 및 @Jens의 알고리즘 이름 (4 색 맵)으로 표시된 도구를 사용하여 자체 솔루션을 만들었습니다.

다음은 관심있는 사람들을위한 코드입니다 (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 PolygonNeighbors 출력 테이블에 필드 이름에서 알 - 필드가 지금이라고 src_OBJECTnbr_OBJECT
스티븐 리드

이 스크립트가 최적입니까? 즉, 최소 색상이 사용되도록 보장합니까?
레이더 아래

1
내가 아는 한, 힘이 필요합니다. 내 게시물에서 언급했듯이 4 가지 색상에 도달하려면 기회를 여러 번 실행해야합니다.
radouxju

여전히 잘 작동합니다! src_ * 및 nbr_ * 필드 이름은 입력 유형에 따라 다릅니다. 지오 데이터베이스 fc 입력과 Desktop 10.5로 지금 실행했으며 이름은 src_OBJECTID와 nbr_OBJECTID입니다. src 및 nbr로 시작하는 필드를 나열하도록 스크립트를 조정할 수 있으므로 입력 유형 (또는 ArcGIS 버전)은 중요하지 않습니다.
BERA


3

QGIS를 사용하고 있다면 Coloring a map plugin 이라고 생각합니다 .

불행히도 플러그인은 QGIS 1.8 버전에서만 사용할 수 있지만 항상 코드가 어떻게 작동하는지 다운로드하여 볼 수 있습니다!


3

이것은 @radouxju의 답변을 함수에 적용한 것입니다. 입력 피처 레이어에 색상 필드를 추가하고 계산합니다. PolygonNeighbors의 필드 이름 끝에 관계없이 작동해야합니다 (사용자 / 입력 / 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.