GeoService-Xr에서 DEM Dataset 올리기

공간 서버인 GeoService-Xr에서 DEM 데이터는 XrE라는 포맷으로 관리됩니다. 흔히 flt나 xyz, dem와 같은 확장자로 규정된 파일을 XrE 포맷으로 먼저 변환할 필요가 있습니다. 이렇게 변환된 XrE 파일을 특정 디렉토리에 저장해 두고 geodata.xml 파일에 다음과 같이 정의해 둡니다.

<?xml version="1.0" encoding="euc-kr"?>
<XrGeoData>
    <Connections>
    </Connections>

    <GeoDataList>
        <GeoData>
            <Name>GDN_DEM</Name>
            <ConnectionString>xre://D:/__Data__/DEM_TEST</ConnectionString>
        </GeoData>
    </GeoDataList>
</XrGeoData>

위의 예는 XrE 파일들이 D:/__Data__/DEM_TEST 디렉토리에 존재하는 것이고, 이 XrE 파일들은 하나의 DEM 데이터셋으로써 GDN_DEM으로 이름을 정하고 있습니다. 이렇게 DEM 데이터를 서비스할 준비가 되면 GeoService-Xr에서 평균경사도나 횡단면도 그리고 특정 지점에 대한 표고값을 사용자에게 서비스할 준비가 완료됩니다. 실제 GeoService-Xr에서 위에서 설정한 내용에 대한 geodata.xml이 성공적으로 적재되면 다음과 같은 내용이 출력되고, 서비스할 준비가 완료됩니다.

geodata building start
    DEM building ...
        D:\__Data__\DEM_TEST/34601.XrE building ... OK
        D:\__Data__\DEM_TEST/34602.XrE building ... OK
        D:\__Data__\DEM_TEST/34603.XrE building ... OK
        D:\__Data__\DEM_TEST/35613.XrE building ... OK
        D:\__Data__\DEM_TEST/35614.XrE building ... OK
        D:\__Data__\DEM_TEST/35615.XrE building ... OK
geodata building end

참고로, XrE 파일은 최대한 사각형 모양으로 클리핑되어 구성 되어야 하며, 영역은 알맞은 정도로 작게 잡아야 합니다. GeoService-Xr로 로딩할 수 있는 XrE에 대한 파일 크기 및 개수에는 제한없이 없지만 속도적인 측면에서 하나의 XrE 파일이 포함하는 지형 영역을 작게 잡아야 한다는 점에 주의해야 합니다.

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의 코드와 섞여 있으니 필요한 코드만 쏙쏙 골라 보시기 바랍니다.

MariaDB의 JDBC 연결

MySQL에서 파생된 MariaDB를 프로젝트에 사용하고 있는데요. 이 MariaDB를 Java에서 연결해 필요한 데이터를 조회하기 위해 JDBC를 사용하는 코드를 정리해 둡니다.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class MainEntry {
    public static void main(String[] args) {
        Connection con = null;
        PreparedStatement pstmt = null;   
        ResultSet rs = null;

        try {
            Class.forName("org.mariadb.jdbc.Driver");
			
            con = DriverManager.getConnection(
                "jdbc:mariadb://100.100.100.7:3306/dbname",
                "userId",
                "password");
						
            pstmt = con.prepareStatement("select * from his_bus_voltage");
			
            rs = pstmt.executeQuery();
			
            while(rs.next()) {
                //.
            }
        } catch(Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if(rs != null) {
                    rs.close(); // 선택 사항
                }
				
                if(pstmt != null) {
                    pstmt.close(); // 선택사항이지만 호출 추천
                }
			
                if(con != null) {
                    con.close(); // 필수 사항
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

MariaDB의 JDBC 라이브러리는 공식 사이트인 https://downloads.mariadb.org/connector-java/에서 다운로드받았으며, 이 글을 작성할 때는 mariadb-java-client-2.0.3.jar를 사용하였습니다.

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