공간 데이터를 변환하고 분석하기 위해 ArcToolbox 또는 QGIS Processing Toolbox를 이용하는 방법이 먼저 떠오릅니다. 가장 많이 사용했던 경험 때문에 그렇겠죠. Paul Ramsey는 원시적인 관점에서 생각하여 PostGIS에서도 다양한 방법으로 지오메트리를 다룰 수 있다는 것을 소개하고 있습니다. 그도 그 방법이 가장 익숙하니까 그렇겠죠?! 그의 블로그에 작성된 게시글을 바탕으로 아래 내용이 작성되었음을 밝히고, 사고의 다양성을 기반으로 생각하는 습관을 기르도록 해야겠네요.

 

아래의 예시는 Polygon을 동일한 면적의 다각형으로 분할할 수 있는 방법에 대한 소개로 사용자 정의 함수를 만들지 않고 PostGIS 함수만으로 폴리곤을 분할하는 방법에 대한 설명입니다.

 

 

1. 서울시 경계 Polygon을 이용하여 최대한 비슷한 크기의 20개의 조각으로 피처를 분할하고자 합니다.

SELECT geom FROM seoul_sig

 

2. 먼저 서울시 경계 영역 내 무작위로 배치된 Point를 생성합니다. Point 개수가 많을수록 동일한 조각으로 분할될 수 있습니다. 여기서는 10,000개의 포인트를 생성하겠습니다.

CREATE TABLE seoul_points AS
    SELECT (
        ST_Dump(
            ST_GeneratePoints(geom, 10000)
        )
    ).geom AS geom
    FROM seoul_sig;

 

3. Point가 만들어졌으면 그 다음으로 20개의 조각 영역을 만들기 위한 Point Clustering 작업을 합니다. 그룹화 개수는 20으로 설정하였습니다. cluster 번호는 0부터 시작합니다.

CREATE TABLE seoul_points_clustered AS
    SELECT
        geom, ST_ClusterKMeans(geom, 20) over () AS cluster
    FROM seoul_points;

 

 

4. 클러스터 그룹의 중심점을 생성합니다. voronoi diagram을 만들기 위해 필요한 Point 입니다. ST_Collect() 함수는 단일 Geometry를 모아 Geometry Collection으로 만들어줍니다. 

CREATE TABLE seoul_centers AS
    SELECT
        cluster, ST_Centroid(ST_Collect(geom)) AS geom
    FROM seoul_points_clustered
    GROUP BY cluster;

 

 

5. 중심점이 만들어졌으면 Voronoi Polygon을 생성합니다.

CREATE TABLE seoul_voronoi AS
    SELECT (
        ST_Dump(
            ST_VoronoiPolygons(ST_Collect(geom))
        )
    ).geom AS geom
    FROM seoul_centers;

 

6. Volonoi Polygon과 서울시 경계 Polygon을 교차시켜 경계 영역에 포함하고 있는 볼로노이 분할 영역의 폴리곤을 생성할 수 있습니다.

CREATE TABLE seoul_divided AS
    SELECT
        ST_Intersection(T1.geom, T2.geom) AS geom
    FROM seoul_sig T1 CROSS JOIN seoul_voronoi T2;

최종 결과물입니다. PostGIS 공간 함수만으로 범위가 넓은 폴리곤을 유사한 크기의 조각 폴리곤으로 분할하는 결과물을 얻을 수 있었습니다.

 

위에서 사용한 PostGIS의 공간 함수는 아래와 같습니다.


Reference



AND

[QGIS] QGIS for Peace

Dev Story 2022. 3. 2. 12:22



 

A message of peace from the QGIS Community: We, the developers, contributors and community members of the QGIS Project view the ongoing world events in Ukraine and other conflict areas around the world with great sadness.
(QGIS 커뮤니티에서 보내는 평화의 메시지: QGIS 프로젝트의 개발자, 컨트리뷰터 그리고 커뮤니티 구성원은 우크라이나와 전 세계의 분쟁 지역에서 진행중인 일을 매우 안타까운 마음으로 바라보고 있습니다.)

Our aim in developing QGIS has always been to provide a powerful tool to support the creation of a just and humane society. 

(우리는 공정하고 인도적인 사회를 만들기 위해 도움이 되는 강력한 도구를 제공하는 것을 목표로 QGIS를 개발해 왔습니다.)

We want to enable a world where every person has a voice, the ability to express, and be secure in, their tenure in their homes, villages, towns, cities and countries.

(모든 사람들이 자신의 집, 마을, 도시, 국가에 대해 자신의 목소리를 내고 안전을 지킬 수 있는 세상을 만들고 싶습니다.)

We hope tools like QGIS are used to the benefit of all citizens on earth, to support a sustainable environment, an orderly society and, in particular, to establish and preserve sovereign dignity, security and freedom from oppression.

(QGIS와 같은 도구가 지구상의 모든 사람의 이익을 위해, 지속 가능한 환경과 질서 있는 사회를 지원하고, 특히 주권적 존엄성, 보안 및 억압으로부터의 자유를 확립하고 보존하는데 사용되기를 바랍니다.)

We ask the leaders of the world to resolve their disputes peacefully, through negotiation and compromise, humility and deference to the citizens who are placed in your care.
(세계 각국의 지도자들이 협상과 타협, 겸손과 존중을 통해 분쟁을 평화적으로 해결하기를 요청합니다.)

To the members of the QGIS Community that are caught up in this conflict, our thoughts and support are with you, and we hope that you and your families are safe and that this conflict comes to a speedy end.
(이 분쟁에 처한 QGIS 커뮤니티의 구성원들에게 우리의 생각과 지지를 보내며, 여러분과 여러분의 가족이 안전하고 이 분쟁이 빨리 종식 되기를 바랍니다.)

'Dev Story' 카테고리의 다른 글

[Linux] Linux 및 Open Source 자격증  (0) 2022.01.04


AND




도커는 클라이언트-서버 아키텍처를 사용합니다. 도커 클라이언트는 컨테이너를 빌드, 실행, 배포하는 작업을 수행하는 도커 데몬과 통신을 합니다. 도커 클라이언트와 데몬은 동일한 시스템에서 실행되거나 도커 클라이언트를 원격 도커 데몬에 연결할 수 있습니다. 도커 클라이언트와 데몬은 UNIX Socker 또는 REST API를 사용하여 통신합니다. 또 다른 도커 클라이언트는 다중 컨테이너 애플리케이션을 정의하고 작업할 수 있는 도커 컴포즈(Docker Compose) 입니다.

 

Docker Architecture Diagram 1

 

도커 이미지 (Docker Image)

도커 이미지는 컨테이너를 생성할 때 필요하며, 가상 머신을 생성할 때 사용하는 ISO 파일과 비슷한 개념입니다. 이미지는 여러개의 레이어로 된 바이너리 파일이 존재하고, 컨테이너를 생성하고 실행할 때 읽기 전용으로 사용됩니다. 이미지는 도커 명령어로 내려받을 수 있고 별도로 설치할 필요는 없습니다.

 

자신만의 이미지를 만들거나 다른 사람이 만들고 레지스트리에 게시한 이미지를 사용할 수 있습니다. 고유한 이미지를 빌드하려면 이미지를 만들고 실행하기 위한 구문으로 구성된 도커파일(Dockerfile)을 만듭니다. 도커파일의 각 명령은 이미지에 레이어를 생성합니다. 도커파일을 변경하고 이미지를 다시 빌드하면 변경된 레이어만 다시 빌드됩니다. 이것은 다른 가상화 기술과 비교할 때 이미지를 매우 작고 가볍고 빠르게 만드는 부분입니다.

 

도커에서 사용하는 이미지의 이름은 [저장소명]/[이미지명]:[태그] 형식으로 구성됩니다.

  • 저장소명 : 이미지가 저장된 장소를 의미하며 도커 허브(Docker Hub)에서 저장소명이 없는 이미지는 공식 이미지(Official Image)를 뜻합니다.
  • 이미지명 : 이미지 이름으로 생략될 수 없으며 반드시 설정해야 합니다.
  • 태그 : 이미지의 버전입니다. 버전을 명시할 수 있지만 생략할 경우 기본적으로 latest로 인식합니다.

 

도커 컨테이너 (Docker Container)

컨테이너는 이미지를 실행하기 위한 인스턴스입니다. 도커 API, CLI를 사용하여 컨테이너를 생성, 시작, 중지, 이동, 삭제할 수 있습니다. 컨테이너는 이미지를 읽기 전용으로 사용하며 이미지에서 변경된 내용만 컨테이너 레이어에 저장되기 때문에 원래 이미지는 영향을 받지 않습니다. 또한 생성된 각 컨테이너는 각기 독립된 파일시스템을 제공받으며 호스트와 분리되어 특정 컨테이너에서 어떤 애플리케이션을 설치하거나 삭제해도 다른 컨테이너와 호스트에는 변화가 없습니다.

 

도커 파일 (Dockerfile)

도커 이미지를 빌드하기 위한 지침을 포함하는 텍스트 파일입니다. 배치 스크립트처럼 첫 번째 줄에 지정된 기본 이미지에서 시작한 다음, 필요한 작업 환경이 완성될 때까지 지침에 따라 필요한 프로그램을 설치하고 파일을 복사하는 등의 작업을 수행합니다.

 

도커 레지스트리 (Docker registries)

도커 레지스트리는 도커 이미지를 저장합니다. 도커 허브(Docker Hub)는 누구나 사용할 수 있는 공용 레지스트리이며 도커는 기본적으로 도커 허브에서 이미지를 찾도록 구성되어 있습니다. 물론 자신의 개인 레지스트리를 구성하는 것도 가능합니다.

 


1 이미지출처 : https://docs.docker.com/get-started/overview/

'Dev Story > cloud' 카테고리의 다른 글

[Docker] 가상화 머신과 도커 컨테이너  (0) 2022.02.13


AND




"Docker"는 Linux® 컨테이너를 만들고 사용할 수 있도록 하는 가상화 기술 오픈소스 프로젝트입니다. Docker를 사용하면 물리적인 서버 인프라 환경에서 완벽하게 분리된 애플리케이션 환경을 구축할 수 있어 코드 실행과 환경설정 시간이 줄어 소프트웨어를 빠르게 제공할 수 있습니다. Docker는 오픈소스로 커뮤니티 사용자에게 무료로 제공되며 Docker Inc.는 Docker 커뮤니티의 활동에 기반을 두고 엔터프라이즈 고객을 위한 향상되고 강화된 기술을 지원합니다.

 

가상화 머신과 도커 컨테이너 비교

가상화 머신은 하이퍼바이저를 이용하여 단일 호스트 컴퓨터의 리소스를 가상으로 공유하여 호스트 컴퓨터가 여러 게스트 가상 머신을 지원할 수 있도록 합니다. 각 가상머신에 Ubuntu, CentOS와 같은 운영체제가 설치되고 각 게스트 운영체제는 다른 게스트 운영체제와는 완전히 독립된 공간과 시스템 리소스를 할당받아 사용합니다. 대표적인 가상화 툴로 VirtualBox, VMware 등이 있습니다.

 

가상머신은 하이퍼바이저를 반드시 거쳐야 하기 때문에 일반 호스트에 비해 성능 손실이 발생될 수 밖에 없습니다. 그리고 게스트 운영체제를 사용하기 위한 커널, 라이브러리를 포함하기 때문에 가상 머신을 배포하기 위한 이미지로 만들었을 때 크기 또한 커진다는 단점이 있습니다. 즉, 가상 머신은 완전히 새로운 운영체제를 생성할 수 있다는 장점이 있지만 일반 호스트에 비해 성능 손실이 있고 대용량의 이미지 파일이 만들어지기 때문에 배포하기에 부담스럽습니다.

 

Comparing Containers and Virtual Machines
https://www.docker.com/resources/what-container
Comparing Containers and Virtual Machines 1

 

도커 컨테이너는 가상화된 공간을 생성하기 위해 운영체제를 따로 설치하여 분리하는 방식이 아니라 chroot(Change  Root Directory), Linux namespace, cgroup(control group)과 같은 리눅스 커널 기능을 사용하여 프로세스 단위의 격리 환경을 만들기 때문에 성능 손실이 거의 없습니다.

 

컨테이너에 필요한 운영체제는 호스트에서 공유해 사용하고 컨테이너 안에는 컨테이너 구동에 필요한 라이브러리와 실행 파일만 존재하기 때문에 컨테이너를 이미지로 만들었을 때 이미지의 용량 또한 가상 머신에 비해 줄어들게 됩니다.


1 출처 : https://www.docker.com/resources/what-container

'Dev Story > cloud' 카테고리의 다른 글

[Docker] 도커 아키텍처  (0) 2022.02.13


AND




pg_terminate_backend(pid) 명령은 현재 열려있는 세션을 종료할 때 사용합니다. 이 기능은 슈퍼유저(Superuser)가 사용할 수 있는 명령어로 모든 세션을 종료할 수 있습니다. pgAdmin을 사용하다 보면 Dashboard의 session 목록에서 열려있는 세션을 종료할 수 있지만 '백그라운드 작업자 세션을 종료할수 없다' 라는 메시지를 뿌리며 종료되지 않는 경우가 있을 때 사용하면 되지만 진행중이 작업이 강제로 종료되기 때문에 사용에 유의해야 한다.

 

SELECT 
    pg_terminate_backend(pid) 
FROM 
    pg_stat_activity 
WHERE 
    -- don't kill my own connection!
    pid <> pg_backend_pid()
    -- don't kill the connections to other databases
    AND datname = '{database_name}';

 


Reference

 



AND




객체 지향 설계(OOD : Object Oriented Design)의 5개 원칙 SOLID는 아래 5가지 원칙의 앞 머리 알파벳을 따서 부르는 이름입니다.

  • SRP(Single Responsibility Principle) : 단일 책임 원칙
  • OCP(Open Closed Principle) : 개방 폐쇄 원칙
  • LSP(Liskov Substitution Principle) : 리스코프 치환 원칙
  • ISP (Interface Segregation Principle) : 인터페이스 분리 원칙
  • DIP (Dependency Inversion Principle) : 의존 역전 원칙

 

SRP(Single Responsibility Principle) : 단일 책임 원칙

어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다.
- 로버트 C. 마틴 -

 

남자 클래스와 의존 관계에 있는 다른 클래스들

 

남자 클래스에 단일 책임 원칙을 적용해 여러 개의 클래스로 분리

 

 

OCP(Open Closed Principle) : 개방 폐쇄 원칙

소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하지만
변경에 대해서는 닫혀 있어야 한다.
- 로버트 C. 마틴-

 

개방 폐쇄 원칙에 위배되는 경우

 

개방 폐쇄 원칙을 적용한 경우

 

개방 폐쇄 원칙을 적용한 예시 : JDBC

 

 

LSP(Liskov Substitution Principle) : 리스코프 치환 원칙

서브 타입은 언제나 자신의 기반 타입(base type)으로 교체할 수 있어야 한다. 하위 클래스의 인스턴스는 상위형 개체 참조 변수에 대입해 상위 클래스의 인스턴스 역할을 하는 데 문제가 없어야 한다.
- 로버트 C. 마틴 -

 

리스코프 치환 위반 원칙 사례 : 계층도/조직도

 

리스코프 치환 원칙 적용 사례 : 분류도

 

 

ISP (Interface Segregation Principle) : 인터페이스 분리 원칙

클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안 된다.
- 로버트 C. 마틴 -

 

다양한 책임을 가진 남자 클래스

 

단일 책임 원칙을 적용해 남자 클래스를 단일 책임을 가진 여러 클래스로 분리

 

인터페이스 분할 원칙을 적용한 남자 클래스

 

 

DIP (Dependency Inversion Principle) : 의존 역전 원칙

"고차원 모듈은 저차원 모듈에 의존하면 안 된다. 이 두 모듈 모두 다른 추상화된 것에 의존해야 한다."
"추상화된 것은 구체적인 것에 의존하면 안 된다. 구체적인 것이 추상화된 것에 의존해야 한다."
"자주 변경되는 구체(Concrete) 클래스에 의존하지 마라"
- 로버트 C. 마틴 -

 

 

의존 역전 원칙 적용 전 (자주 사용되는 구체 클래스에 의존)

 

의존 역전 원칙 적용 후

 



AND