2022년 6월 11일 토요일

파이썬 GDAL 설치 시 에러 수정 방법

GDAL은 래스터와 벡터 지리공간 자료 형식을 변환하는 라이브러리이다. 오픈소스이며, OSG재단에서 관리된다. 설치 방법은 다음과 같다. 

GDAL 개념

단, 설치 시 다음과 같이 파이썬 GDAL 라이브러리 단계에서 에러 발생 경우가 있다. 이 글은 GDAL PIP 설치 시 다음과 같이 발생하는 수정 방법을 간략히 정리한 것이다.

pip install GDAL

GDAL 설치 에러 발생 화면

에러가 발생하는 이유에 대한 관련 정보도 많이 나와 있지 않은 데, 마지막 줄 로그가 힌트가 된다. 

error in GDAL setup command: use_2to3 is invalid.

use_2to3 명령은 pip 에서 사용하는 setuptools의명령으로 버전 58에서는 더이상 지원하지 않는다. 그러므로, 최신 pip setuptools에서는 에러가 발생하는 것이다. 

다음과 같이 버전을 약간 낮추어 setuptools를 설치하고 재시도해본다. 

pip install setuptools==57.4.0

그리고, 현재 GDAL 설치 버전을 확인하고, 해당 버전의 PYTHON GDAL 패키지를 설치하면 된다.

ogrinfo --version

pip install GDAL==3.0.4

GDAL 파이썬 버전 설치 성공

이제, 파이썬에서 다음과 같이 gdal을 사용할 수 있다. 

def convert_tiff_jpg():        
    options_list = [
        '-ot Byte',
        '-of JPEG',
        '-b 1',
        '-scale'
    ]           

    options_string = " ".join(options_list)
        
    gdal.Translate(
        'save_image_path.jpg',
        'image_path.tif',
        options=options_string
    )

2022년 5월 3일 화요일

플러그인 개발을 위한 자바 스크립트와 C++ 연동 방법

이 글은 자바스크립트(Javascript)와 C++ 연동 방법에 대한 내용을 간략히 공유한다. 가끔, 플러그인 등을 개발할 때, 외부 스크립트 코드와 연동해야할 경우가 있다. 이와 관련해, 필요한 내용이 무엇인지 알아본다.

자바스크립트 동작 방식은 다음과 같다.
자바스크립트 내부 구조
자바스크립트 실행 상태 예시

C++에서 자바스크립트 호출 구조는 다음과 같다.
#include "quickjspp.hpp"
#include <iostream>

class MyClass
{
public:
    MyClass() {}
    MyClass(std::vector<int>) {}

    double member_variable = 5.5;
    std::string member_function(const std::string& s) { return "Hello, " + s; }
};

void println(qjs::rest<std::string> args) {
    for (auto const & arg : args) std::cout << arg << " ";
    std::cout << "\n";
}

int main()
{
    qjs::Runtime runtime;
    qjs::Context context(runtime);
    try
    {
        // export classes as a module
        auto& module = context.addModule("MyModule");
        module.function<&println>("println");
        module.class_<MyClass>("MyClass")
                .constructor<>()
                .constructor<std::vector<int>>("MyClassA")
                .fun<&MyClass::member_variable>("member_variable")
                .fun<&MyClass::member_function>("member_function");
        // import module
        context.eval(R"xxx(
            import * as my from 'MyModule';
            globalThis.my = my;
        )xxx", "<import>", JS_EVAL_TYPE_MODULE);
        // evaluate js code
        context.eval(R"xxx(
            let v1 = new my.MyClass();
            v1.member_variable = 1;
            let v2 = new my.MyClassA([1,2,3]);
            function my_callback(str) {
              my.println("at callback:", v2.member_function(str));
            }
        )xxx");

        // callback
        auto cb = (std::function<void(const std::string&)>) context.eval("my_callback");
        cb("world");
    }
    catch(qjs::exception)
    {
        auto exc = context.getException();
        std::cerr << (std::string) exc << std::endl;
        if((bool) exc["stack"])
            std::cerr << (std::string) exc["stack"] << std::endl;
        return 1;
    }
}

레퍼런스

라이다와 카메라 데이터 퓨전 기술을 이용한 이미지 중첩 방법 소개

이 글은 라이다와 카메라 데이터 퓨전 기술을 이용한 이미지 중첩 방법에 대한 소개이다. 이제 각자 발전된 라이다와 카메라 데이터 처리 기술은 각각의 장단점을 혼합해 사용되기 시작했다. 이 글은 특성이 서로 다른 각 데이터의 혼합(fusion) 및 중첩(superposition) 기술을 간략히 정리한다.
Fusion using camera and LiDAR

Calibration for superposition

레퍼런스

2022년 3월 10일 목요일

Ubuntu 리눅스 포트 죽이기

이 글은 Ubuntu 리눅스 포트 죽이는 방법을 간단히 정리한 것이다. 가끔 포트가 다른 프로그램에 의해 열려져 있어, 해당 포트를 사용하지  못할 때 사용하면 된다.

netstat -nap | grep :8080

sudo kill $(sudo lsof -t -i:8080)



2022년 3월 2일 수요일

3차원 데이터 처리를 위한 오픈소스 Open3D 라이브러리 소개

Open3D는 3차원 데이터를 다루는 소프트웨어 개발을 지원하는 오픈소스 라이브러리이다. C++, Python을 지원하며, 데이터 구조 및 알고리즘을 제공한다. 빠른 성능을 위해 최적화, 병렬화되었다.

핵심 기능은 다음과 같다.
  • conda, pip를 통한 간단한 설치
  • 3차원 자료 구조 및 알고리즘 제공
  • 장면 렌더링 및 3차원 시각화
  • 표면 정렬
설치는 다음과 같다.
virtualenv venv
pip install open3d

제대로 설치되었으면, Getting started 문서를 참고해 다음 코드를 실행한다.
# Verify installation
python -c "import open3d as o3d; print(o3d.__version__)"

# Python API
python -c "import open3d as o3d; \
           mesh = o3d.geometry.TriangleMesh.create_sphere(); \
           mesh.compute_vertex_normals(); \
           o3d.visualization.draw(mesh, raw_mode=True)"

# Open3D CLI
open3d example visualization/draw



 

2022년 2월 25일 금요일

리눅스 우분투 인터넷 서비스 포트 종료시키기

이 글은 리눅스 우분투 인터넷 서비스 포트 종료시키는 방법을 간략히 보여준다.

예를 들어, 3000번으로 열린 포트를 닫을려면, 터미널에서 다음 명령을 입력한다.

sudo kill -9 $(sudo lsof -t -i:3000)