NailNumberGraphicRow 사용 API 정리

지도 객체가 map이라고 할때, 먼저 chart라는 이름의 그래픽 요소를 추가함.

map.layers().remove("chart");
let gl = new Xr.layers.GraphicLayer("chart");
map.layers().add(gl);

그래픽 요소가 표시되는 중심 좌표를 잡기 위해 참조되는 ShapeLayer가 ‘shpLyr’이라고 할때, 필요한 변수들을 준비함.

let graphicRows = gl.rowSet();
let lyr = map.layers("shpLyr");
let rows = lyr.shapeRowSet().rows();
let ars = lyr.attributeRowSet();

통계 데이터가 저장된 객체를 준비함. 이 객체는 네트워크를 통해 받은 데이터로 구성되는 것이 일반적임.

let tables = {
    "description": "서울시 구별 코로나확진자 수 2020년 5월 18일 10시 기준",
    "강남구": 71, "강동구": 19, "강북구": 8, "강천구": 31, "관악구": 53,
    "광진구": 12, "구로구": 35, "금천구": 13, "노원구": 27, "도봉구": 14,
    "동대문구": 34, "동작구": 37, "마포구": 24, "서대문구": 22, "서초구": 40,
    "성동구": 22, "성북구": 27, "송파구": 44, "양천구": 23, "영등포구": 27,
    "용산구": 34, "은평구": 30, "종로구": 18, "중구": 8, "중랑구": 17
};

이제 구성할 데이터의 수만큼 NailNumberGraphicRow 그래픽 요소와 1:1로 필요한 NailNumberShapeData를 생서하여 그래픽 레이어에 추가함.

for (var fid in rows) {
    let aRow = ars.row(fid);
    let sRow = rows[fid];
    let pt = sRow.shapeData().representativePoint();
    let title = aRow.valueAsString(0).trim();
    let value = tables[title];
    let nnsd = new Xr.data.NailNumberShapeData({
        pos: [pt.x, pt.y],
        outbox_size: [55, 55],
        inbox_size: [42, 25],
        title: title,
        value: value,
        title_offset_y: 1,
        value_offset_y: 2
    });

    let nngr = new Xr.data.NailNumberGraphicRow(fid, nnsd);
    graphicRows.add(nngr);
}

그래픽 요소들의 구성이 완료되면 실제 화면의 표시되도록 아래의 코드를 호출함.

gl.refresh();

결과는 아래와 같음.

다소 밋밋한 표현인데, 이를 값에 따라 색상을 달리하고 색상을 단순 솔리드가 아닌 그라디언트 계열로 표현하기 위해 17번과 18번 코드 밑에 아래의 코드를 추가함.

nngr.brushSymbolForOutbox(new Xr.symbol.LinearGradientBrushSymbol());

if (value > 50) {
    nngr.brushSymbolForInbox(new Xr.symbol.LinearGradientBrushSymbol({
        stops: [
            { "offset": "0%", "step-color": "#ff0000" },
            { "offset": "100%", "step-color": "#660000" }
        ]
    }));
} else if (value < 20) {
    nngr.brushSymbolForInbox(new Xr.symbol.LinearGradientBrushSymbol({
        stops: [
            { "offset": "0%", "step-color": "#00ff00" },
            { "offset": "100%", "step-color": "#006600" }
        ]
    }));
} else {
    nngr.brushSymbolForInbox(new Xr.symbol.LinearGradientBrushSymbol({
        stops: [
            { "offset": "0%", "step-color": "#7F8C8D" },
            { "offset": "100%", "step-color": "#303030" }
        ]
    }));
}

결과는 다음과 같음.

Python에서 객체에 대한 key, value 조회

key, value 자료 구조는 매우 효율적인으로 데이터를 저장하고 빠르게 검색할 수 있는 구조입니다. Python에서도 제공하는 key, value 자료구조는 Javascript와 매우 유사한데요. 예를들어 다음처럼 key와 value를 자유롭게 구성할 수 있습니다.

book = {
    'Boy': (100, 200),
    'Guy': (200, 400),
    'Girl': (300, 150),
    'Woman': (400, 800)
}

총 4개의 요소로 구성되어 있는데.. 각 요소를 순회하면서 조회하기 위한 코드는 다음과 같습니다.

for word, pages in book.items():
    print(word, pages)

위의 실행 결과는 다음과 같습니다.

Boy (100, 200)
Guy (200, 400)
Girl (300, 150)
Woman (400, 800)

앞서 book 변수에 대한 타입명은 dictionary입니다. 이 타입에서 key 요소는 중복될 수 없습니다.

특정 key 값을 갖는 요소를 제거하기 위해서는, 예를들어 key가 ‘Boy’ 인 요소를 제거하기 위한 코드는 다음과 같습니다.

del book['Boy']

또한 특정 키를 가진 요소가 존재하는지에 대한 검사는 다음과 같습니다.

print('Boy' in book)
print('Girl' in book)

앞서 key가 ‘Boy’인 요소는 제거되었으므로, 위의 코드에 대한 결과는 다음과 같습니다.

False
True