DuraMap-Xr에서 특정 도형 하일라이팅(Highlighting) 시키기

DuraMap-Xr에서 SHP 파일로 구성된 레이어의 특정 번호의 도형을 아래의 화면처럼 하일라이팅(깜빡거림) 시키는 코드에 대한 설명 입니다.

듀라맵에서는 특정 도형을 직접적으로 하일라이팅 시키는 API를 제공하지는 않지만, 기본적으로 제공하는 API와 Event를 이용하면 가능합니다. 이와 같은 기능은 GIS 어플리케이션에서 많이 사용되므로, 이 기능 하나에 대해 쉽게 재사용할 수 있도록 클래스화하여 제공합니다. 클래스의 이름은 DuraMapUtility_HilightingShape인데요. 이 글은 DuraMapUtility_HilightingShape 클래스를 사용하는 내용에 대한 정리입니다.

먼저 DuraMapUtility_HilightingShape 클래스에 대한 객체 변수를 원하는 곳에 선언합니다. 필자의 경우 듀라맵의 지도 컴포넌트가 놓여진 폼(Form)의 private 변수로 선언하였습니다.

private DuraMapUtility_HilightingShape HilightingShape = null;

위의 DuraMapUtility_HilightingShape 클래스에 대한 객체 변수를 폼의 생성자에서 다음처럼 생성 하는데요. 생성자의 인자로 받는 것은 듀라맵의 지도뷰 객체입니다.

public Form1()
{
    ....

    HilightingShape = new DuraMapUtility_HilightingShape(axXr1);
}

그리고 듀라맵의 지도뷰 객체이 제공하는 이벤트 중 OnCustomDraw에 대해 다음처럼 입력합니다.

private void axXr1_OnCustomDraw(object sender, AxXrMapLib._IXrMapControlEvents_OnCustomDrawEvent e)
{
    HilightingShape.OnCustomDrawEvent(e);
}

여기까지가 원하는 도형을 하일라이팅하기 위한 모든 준비 과정입니다.

이제 다음처럼 언제든지 어떤 레이어를 구성하는 도형을 하일라이팅할 수 있는데요. Hilighting 함수의 첫번째 인자는 하일라이팅하고자 하는 레이어이고 877이라는 숫자값은 하일라이팅되는 도형에 대한 FID 값입니다.

HilightingShape.Hilighting("lyr", 877);

참고로 아래의 코드는 사용자가 지도 상에서 마우스를 클릭했을 때 클릭되어진 도형의 FID를 얻는 함수로, DuraMap-Xr의 지도뷰가 제공하는 OnLButtonUp 이벤트에서 실행되는 코드입니다.

private void axXr1_OnLButtonUp(object sender, AxXrMapLib._IXrMapControlEvents_OnLButtonUpEvent e)
{
    XrMapLib.IValueList FIDs = axXr1.GetFIDFromMousePoint("lyr", e.x, e.y, false);
    if (FIDs.Count > 0)
    {
        int FID = FIDs.GetValueAsInteger(0);
        // 위의 FID가 사용자가 클릭한 도형의 고유한 Feature ID 값 입니다.
    }
}

DuraMapUtility_HilightingShape 클래스와 이 클래스를 사용하는 예제 코드는 다음의 URL에서 다운로드할 수 있습니다.



SVG에서 선 끝에 도형 달기(화살표 선 표현 예)

SVG를 이용해 웹에서 원하는 도형을 표현할 수 있는데요. 이 중 어떤 라인의 끝에 도형을 달아 화살표 선을 표현하는 SVG에 대한 코드입니다.

<?xml version="1.0"?>
<svg width="120" height="120" viewBox="0 0 10 10"
    xmlns="http://www.w3.org/2000/svg" version="1.1">

  <defs>
    <marker id="Triangle" viewBox="0 0 10 10" refX="1" refY="5"
        markerWidth="6" markerHeight="6" orient="auto">
      <path d="M 0 0 L 10 5 L 0 10 z" />
    </marker>
  </defs>

  <polyline points="10,10 100,100" fill="none" stroke="black" 
      stroke-width="2" marker-end="url(#Triangle)" />
</svg>

코드를 보면 SVG의 기능 중 marker 정의를 이용하고 있습니다. CAD에서의 Block 개념처럼.. 마치 도형을 미리 정의해 두고 재활용하는 방식입니다. marker의 orient를 auto로 지정해 선의 기울기에 맞춰 자동으로 회전할 수 있고, 회전시 원점을 지정하기 위해 refX와 refY값을 이용합니다.

정의해둔 marker는 polyline 등과 같은 SVG 요소의 marker-end 등과 같은 속성에 마커의 ID 값을 지정하면 됩니다.

결과는 아래와 같습니다.

[xyz-ihs snippet=”SVG-MARKER”]

참고로 위의 결과는 IE보다 Chrome이 더 나은 결과를 제공합니다.

EUC-KR로 인코딩된 속성값이 깨진 SHP, DBF 파일 복구하는 프로그램

국내에서 사용되는 거의 대부분의 SHP 파일의 속성 데이터는 EUC-KR로 인코딩되어 있습니다. 이러한 SHP 파일을 PostgreSQL에 테이블로 Importing 하기 위해 Shapefile Import/Export Manager와 같은 툴을 사용하게 되는데요. 가끔 다음과 같은 에러를 출력하고 Importing이 실패하게 됩니다.

물론 위의 Shape Import/Export Manager 툴에서 SHP 파일을 Importing 할때 문자셋을 EUC-KR로 명확히 지정한 경우입니다. 이 경우 DBF 파일에 저장된 한글 문자열은 분명히 EUC-KR로 인코딩되어 있으나 깨졌거나.. 기타 여러가지 이유가 그 원인이 될 수 있습니다. 대부분의 프로그램에서는 데이터가 조금 깨져 있어도 읽는데 있어 위의 경우처럼 문제를 발생하지 않습니다. 왜냐하면 깨진 문자열이 그다지 중요하지 않은 경우가 많기 때문입니다.

이러한 상황에서 옳바르게 SHP 파일을 Importing 해 줄 수 있는 툴을 소개합니다.

매우 단순한 UI를 갖는 이 툴은 문제가 있는 SHP 파일을 문제가 없도록 만들어 주는 툴입니다. 혹 저와 동일한 문제로 인해 작업 시 어려움을 격는 분이 있다면 이 툴을 사용해 보시기 바랍니다. 아래 실행 파일을 첨부합니다.



이 프로그램은 DuraMap-Xr을 사용합니다. 실행 전에 DuraMap-Xr을 설치하셔야 하는데요. 다음 URL에서 소개하는 설치자를 통해 매우 간단히 설치할 수 있답니다.

DuraMap-Xr 설치자

DB Connection 유지를 위한 방안

Java에서 DB에 대한 연결을 미리 맺어두고 사용하는 Connection Pool을 활용하고 있습니다. 그런데 문제는 Connection이 일정 시간 아무런 사용이 없을 경우 서버 단에서 해당 Connection의 연결을 끊는 경우인데요. 이는 서버 단의 DB 설정값을 변경해서 해결할 수 있지만, 여러가지 정책 상 DB 설정값을 변경할 수 없을 때가 있습니다. 예를 들어, DB 관리자가 전에 사귀다가 이별한 여자친구라던지……..

이러한 경우!! 에 Connection Pool을 운영하는 어플리케이션 단에서 해당 Connection에 대해 일정 시간 간격으로 어떤 연산을 주기적으로 호출함으로써 연결을 계속 유지하도록 할 수 있습니다. 이러한 연결 유지는 스레드를 통해 구동되는 것이 적당한데요. 아래의 코드는 이러한 목적으로 이번에 도입한 스레드 코드입니다.

코드는 매우 단순하지만 향후 급할때 기억을 쉽게 더듬을 수 있도록 저장해 둡니다.

package control;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

import model.DBConnection;

public class DBConnectionMaintainerThread extends Thread {
    private volatile boolean bGoOn = true;
	
    public void run() {
        DBConnection conn = null;
        Connection rConn = null;
        ResultSet RS = null;
        Statement readStmt = null;
		
        while(bGoOn) {
            try {
                Thread.sleep(10000);
	        	          
                conn = MainEntry.dbMan.getResource("cim");           
                rConn = conn.getRawConnection();
                readStmt =  rConn.createStatement();
    	        RS = readStmt.executeQuery("select 1");   
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if(RS != null) {
                    try {
                        RS.close();
                        if(readStmt != null) readStmt.close();
                        if(conn != null) MainEntry.dbMan.putResource("cim", conn);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

위의 코드는 10초 간격으로 Connection Pool에서 Connection을 꺼내와 가장 간단한 쿼리인 SELECT 1;을 주기적으로 호출해 주고 있습니다. 참고로 Connection Pool의 코드와 섞여 있으니 필요한 코드만 쏙쏙 골라 보시기 바랍니다.

CentOS 7에서 Postgresql 9.6.2, Postgis 2.3.2-1 설치(인터넷 환경)

인터넷이 되는 환경에서 PostgreSQL(9.6.2)와 PostGIS(2.3.2)를 설치하는 절차입니다.

PostgreSQL 9.6.2 설치

1. PostgreSQL과 PostGIS 설치를 위한 yum 저장소 업데이트

rpm -Uvh https://yum.postgresql.org/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm

2. PostgreSQL 설치

yum install postgresql96-server postgresql96

3. 데이터베이스 저장소 생성

./postgresql96-setup initdb

4. PostgreSQL 서비스 실행

systemctl enable postgresql-9.6
systemctl enable postgresql-9.6.service
systemctl start postgresql-9.6.service

5. 방화벽에서 port 5432번 개방

firewall-cmd --zone=public --add-port=5432/tcp

6. 외부에서 DBMS 접근 허용 설정

vi postgresql.conf

아래처럼 편집

listen_addresses = "*"

7. postgres 사용자 암호 설정

su - postgres
psql
\password postgres
\q

8. 이전 사용자로 복귀
su - root

9. 외부 접속을 위한 보안설정 변경

vi pg_hba.conf

아래처럼 편집

local all all peer 문자열을 local all all md5 로 변경
host all all 127.0.0.1/32 ident 문자열을 host all all 0.0.0.0/0 md5 로 변경
host all all ::1/128 ident 문자열을 host all all ::1/128 md5 로 변경

10. PostgreSQL 서비스 재기동

systemctl stop postgresql-9.6.service
systemctl start postgresql-9.6.service

11. [2017-07-08 추가] UUID 확장 기능 설치를 위해 다음 명령이 필요함

systemctl stop postgresql-9.6.service
yum install postgresql96-contrib.x86_64
systemctl start postgresql-9.6.service

PostGIS 설치

yum install epel-release
yum install postgis2_96.x86_64
systemctl restart postgresql-9.6.service