[OpenLayers] 클릭된 Feature의 속성 얻기

두가지 방법이 있는데, 첫째는 지도 객체의 forEachFeatureAtPixel을 이용하는 방식이며 아래의 예와 같다.

map.on(
    "click", 
    function(e) {
        map.forEachFeatureAtPixel(
            e.pixel, 
            function (feature, layer) {
                let values = feature.getProperties();
                // values에 속성값이 담겨 있음(예: values["fieldName"])
            }, 
            {
                hitTolerance: 2,
                layerFilter: function(layer) {
                    return layer === buildingLayer;
                }
            }
        );
    }
);

두번째 방법은 Select 클래스를 이용하는 방법이며 아래의 예와 같다.

import Select from 'ol/interaction/Select.js';

var select = new Select({
    layers: [buildingLayer],

    /*
    // 위의 layers 옵션 지정과 동일한 방식인데, 속도면에서는 layers 옵션을 통한 방식이 더 빠를 것으로 예상됨
    filter: function(feature, layer) {
        return buildingLayer === layer;
    }
    */
});

select.getFeatures().on(
    "add", 
    function (e) { 
        var feature = e.element;

        setTimeout(function() {
            select.getFeatures().clear();
        }, 2000); // 2초 뒤에 선택된 상태가 해제됨
    }
);
       
map.addInteraction(select);

참고로 선택 대상이 되는 레이어의 타입은 VectorTileLayer 이다.

[OpenCV] Channel의 분리와 조합

OpenCV에서 이미지에 대한 채널, 즉 일반적으로 Red, Green, Blue로 분리된 데이터 버퍼를 개별 요소로 분리하고, 이렇게 분리된 Channel들을 다시 하나의 이미지로써 묶는 경우 대한 기초적인 API에 대한 정리입니다.

정리를 위한 코드가 매우 짧은데, 아래와 같습니다.

import cv2
import numpy as np

src = cv2.imread('./data/lena.jpg')
cv2.imshow('src', src)

hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)
h, s, v = cv2.split(hsv)

v2 = cv2.equalizeHist(v)
hsv2 = cv2.merge([h, s, v2])
dst = cv2.cvtColor(hsv2, cv2.COLOR_HSV2BGR)
cv2.imshow('dst', dst)

cv2.waitKey()
cv2.destroyAllWindows()

코드 4번에서 이미지 데이터를 읽어와 src에 저장하고, 7번에서 RGB 채널(OpenCV는 BGR 순서임)을 HSV 채널로 변환하여 hsv 버퍼에 저장합니다. 이 hsv 버퍼에 저장된 3개의 채널을 각각 h, s, v 버퍼에 저장 분리하는 코드가 8번인 cv2.split 입니다. 분리된 채널 중 v에 대해 Histogram 균등화를 수행하기 위해 10번이 실행되었고, 균등화된 v는 v2 버퍼에 저장됩니다. 다시 h, s, v2 버퍼에 저장된 3개의 Channel을 조합하기 위해 11번 코드의 cv2.merge API가 사용됩니다.