2010년 7월 27일 화요일

KLIS 지적 및 주제도 코드 설명


KLIS(한국토지정보시스템)에서 제공하는 지적도 및 주제도의 Primary Key에 대한 설명입니다.

▣ 토지코드(19자리)
 - 지적도 및 개별공시지가(토지특성) 테이블 등 필지의 Unique ID
 - 지적도(연속/편집)에서는 PNU, 개별공시지가(토지특성)에서는 LAND_CD 등의 필드 이름으로 사용
 - 필드 구성
  : 시도(2)+시군구(3)+읍면동(3)+리(2)+필지구분(1)+본번(4)+부번(4)

- 참고설명 :  필지구분: 1(일반), 2(산)

▣ 용도지역지구관리코드(33자리)
 - 각종 용도지역지구(KLIS에서 LT_*로 시작하는 주제도)주제도의 Unique ID
 - MNUM이라는 33자리의 필드로 사용
 - 필드 구성
  : 지정권자(7) + 시도코드(2) + 시군구코드(3) + 고시년도(4) + 고시번호(4) + 용도지역지구코드(6) + 도면표시번호본번(4) + 도면표시번호부번(3)


▣ 참고: KLIS 레이어의 일반적인 구성
 - KLIS의 GIS 레이어는 크게 지적도(LP*), 주제도(LT*), 지형도(LB*)로 구성
 - LP = LMIS Parcel, LT = LMIS Thematic, LB = LMIS Base Layer를 의미
 - Geometry 유형은 폴리곤(A-Area), 라인(L-Line), 포인트(P-Point), 주기(T-Text)로 구분

 - 지형도 관련 레이어 : LB10_*, LB50_*로 시작하는 레이어
 : LB10_BT_NAME(1:1,000 지형도의 건물레이어 중 주기, BT = Building Text)
 : LB50_RL_ROAD(1:5,000 지형도의 도로레이어 중 도로경계, RL = Road Line)
 : LB50_BA_BLDG(1:5,000 지형도의 건물레이어 중 건물경계, BA = Building Area)

 - 지적도 관련 레이어 : LP_*로 시작하는 레이어
 : LP_AA_SGG(연속지적 행정구역 시군구 폴리곤, AA = Administrative Area)
 : LP_PA_CBND(연속지적 폴리곤, PA = Parcel Area)
 : LP_PA_BBND(편집지적 폴리곤, PA = Parcel Area)

 - 주제도 관련 레이어
 : LT_*로 시작하는 레이어로 모두 폴리곤으로 구성
 : LT_B_UQ111(국토계획/도시지역 편집주제도)
 : LT_C_UQ111(국토계획/도시지역 연속주제도)

==> 어떻습니까? 레이어 이름만 봐도 딱~ 어떤 유형의 어떤 레이어인지 감이 오시지요?

OWS Search Engine

OWS Search Engine is an engine specialised in the search for web services implementing standards published by OGC(Open Geospatial Consortium).


2010년 7월 26일 월요일

List of Public OGC Web Services

전세계의 OGC Web Service(OWS) 현황을 다루고 있는 사이트입니다.


주로 WMS(Web Map Service) 목록만을 대상으로 하지만 아래 서비스 현황을 보면 놀라울 따름입니다. 울 나라는 하나도 없어요...

Total Number of Servers: 994
Total Number of Layers: 339,254

목록을 선택하면 다음과 같이 service capabilities를 확인할 수 있습니다. 연결이 안되는 사이트들도 많네요...
Capabilities: http://wms.telascience.org/cgi-bin/hurricane_ows?Version=1.1.1&Service=WMS&Request=GetCapabilities
Date added: Tue Oct 31 09:11:12 UTC 2006
Number of Layers: 3
Abstract: This OWS has imagery and outlines related to hurricanes

제가 시간이 된다면 GeoNetwork를 활용해서 관리해 보고 싶네요...

[ArcObjects]WMS Layer

ArcObjects에서 OGC WMS(Web Map Service) 레이어를 추가하는 코드입니다.

아래 코드의 ServiceURL에 http://gnis.lbsplus.com/gnis/wms?GDX=tilo.xml&를 입력한 결과는 아래 이미지...


▣ Sample Code
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.GISClient;

public static void AddWMSLayer(IMap targetMap, String serviceURL)
{
    ILayer wmsLayer = OpenWMSLayer(serviceURL, string.Empty);

    if (wmsLayer != null)
    {
        targetMap.AddLayer(wmsLayer);

        IActiveView activeView = (IActiveView)targetMap;
        activeView.Refresh();
    }
}

public static ILayer OpenWMSLayer(string serviceURL, string layerName)
{
    IPropertySet propSet = new PropertySetClass();
    propSet.SetProperty("URL", serviceURL);

    IWMSConnectionName connName = new WMSConnectionNameClass();
    connName.ConnectionProperties = propSet;

    IWMSGroupLayer wmsMapLayer = new WMSMapLayerClass();
   
    IDataLayer dataLayer = (IDataLayer)wmsMapLayer;
    dataLayer.Connect((IName)connName);

    IWMSServiceDescription serviceDesc = wmsMapLayer.WMSServiceDescription;

    for (int k = 0; k < serviceDesc.LayerDescriptionCount; k++)
    {
        IWMSLayerDescription layerDesc = serviceDesc.get_LayerDescription(k);

        ILayer newLayer = null;
        if (layerDesc.LayerDescriptionCount == 0)
        {
            try
            {
                IWMSLayer newWMSLayer = wmsMapLayer.CreateWMSLayer(layerDesc);
                newLayer = (ILayer)newWMSLayer;
            }
            catch (Exception Ex)
            {
                System.Diagnostics.Debug.WriteLine(Ex.Message);
            }

            if (newLayer == null)
            {
                IWMSGroupLayer grpLayer = wmsMapLayer.CreateWMSGroupLayers(layerDesc);
                newLayer = (ILayer)grpLayer;
            }
        }
        else
        {
            IWMSGroupLayer grpLayer = wmsMapLayer.CreateWMSGroupLayers(layerDesc);
            newLayer = (ILayer)grpLayer;
        }

        newLayer.Visible = true;
        wmsMapLayer.InsertLayer(newLayer, 0);
    }

    if (wmsMapLayer == null || wmsMapLayer.Count == 0)
        return null;

    ILayer wmsLayer = (ILayer)wmsMapLayer;
    wmsLayer.Visible = true;

    if (string.IsNullOrEmpty(layerName))
    {
        wmsLayer.Name = serviceDesc.WMSTitle;
    }
    else
    {
        wmsLayer.Name = layerName;
    }

    return wmsLayer;
}


▣ 결과
WMS UI
ArcMap WMS Layer

2010년 7월 18일 일요일

대한민국 공항 및 항구(국가항) 위치

2010년 5월 기준 대한민국의 공항 및 항구(국가항) 현황입니다.

첨부된 파일에 포함된 X, Y좌표는 WGS84 경위도 좌표값입니다.

공항
항구
▣ 위치

대한민국 읍면동 기반 인구밀도

대한민국 읍면동 기반의 인구밀도(단위:명/㎢, 기준 : 2008년)

읍면동별 인구 자료출처: 통계청
국가통계포털


2010년 1월 기준 서울시 표준지공시지가현황

서울시 지가현황(㎡당 지가)입니다. 간단한 제작과정을 살펴보면 다음과 같습니다.

지도제작 과정
 - 국토해양부한국감정평가협회에서 제공하는 부동산공시가격알리미 서비스의  2010/1/1일 기준 표준지공시지가
 - 주소 기반 지오코딩 후 포인트화
 - Interpolation(IDW)
 - Classification(Quantile) 지도화



2010년 7월 15일 목요일

SpatiaLite and Java


오늘은 SQLite 및 SpatiaLite 3번째로 초간단 SpatiaLite 사용법 및 이를 Java 클래스에서 사용하는 방법을 알아보도록 합니다. 우선 아래 두 링크를 확인/설치 후 진행하도록 하세요. 그리고 아래 샘플데이터 받아서 테스트하시면 됩니다.


3. SpatiaLite and Java
3.1 SpatiaLite 사용법

▣ SQLite Command
SpatiaLite Extension을 사용하기 위해서는 다음 command나 query를 이용하면 된다.

만약 라이브러리를 찾을 수 없다고 나오면 해당 파일이 설치되어 있는지 확인 또는 환경변수에 설치된 폴더를 Path에 등록, 이것도 귀찮으면 SQLite 및 SpatiaLite 관련 라이브러리를 윈도우즈 시스템 폴더에 복사하면 된다.

.load 'libspatialite-2.dll'  또는 SELECT load_extension('libspatialite-2.dll')


▣ SpatiaLite Command
SQLite Command와 같은 환경이면서 extension 을 따로 load할 필요 없다. 아래 그림 참조...

SpatiaLite Quick Tutorial은 여기(A quick tutorial to SpatiaLite)서 참고
▣ SpatiaLite GUI 및 GIS
SpatiaLite GUI 에서 Shapefile을 Load하는 방법은 다음과 같다.

[Files] - [Advanced] - [Load Shapefile] 메뉴 실행 후 Shapefile 선택하면 아래 등록 창 표시
SRID(좌표체계, 아래 4326은 WGS84 경위도좌표체계) 및 Charset Encoding(아래처럼 CP949 선택하면 됨) 선택 후 OK 눌러 Load.

※ 샘플 데이터
 - continent polygon 및 earthquake point dataset

▣ Java Class에서 사용하기
SQLite 사용법과 동일하며 다음 Query를 이용하여 Extension을 load한 후 공간관련 함수를 사용할 수 있다.


SELECT load_extension('libspatialite-2.dll')

다음 코드와 결과를 보면서 각 공간함수가 뭘 하는 기능인지 생각해 볼 것!

더 많은 공간관련 함수는 여기(SQL spatial functions)서 참고!

▣ Java Sample Code
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

import org.sqlite.SQLiteConfig;

public class SpatiaLite {

    public static void connect() {

        try {
            String dbPath = "C:/DBMS/SpatiaLite/db/db.sqlite";

            Class.forName("org.sqlite.JDBC");

            SQLiteConfig config = new SQLiteConfig();
            config.enableLoadExtension(true);

            Connection dbCon = DriverManager.getConnection("jdbc:sqlite:" + dbPath, config.toProperties());

            Statement dbStmt = dbCon.createStatement();   

            // load_extension SQLite 3.3.6 or higher
            dbStmt.execute("SELECT load_extension('libspatialite-2.dll')");

            // Polygon
            ResultSet rs2 = dbStmt.executeQuery("SELECT PK_UID, ST_Area(Geometry), ST_AsText(Centroid(Geometry)), " + "ST_Dimension(Geometry), ST_GeometryType(Geometry) FROM continent ORDER BY ST_Area(Geometry) DESC LIMIT 5;");   

            printResultSet(rs2);           
            rs2.close();

            // Point
            ResultSet rsSgg = dbStmt.executeQuery("SELECT LOC, ST_AsText(Geometry) as WKT FROM earthquake DESC LIMIT 5;");
            printResultSet(rsSgg);           
            rsSgg.close();   

            dbStmt.close();
            dbCon.close();

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    private static void printResultSet(ResultSet rs) {
        if (rs == null) {
            System.out.println("Error : ResultSet is null!");
            return;
        }

        try {
            ResultSetMetaData rsMetaData = rs.getMetaData();

            if (rsMetaData == null)
                return;

            int columnCount = rsMetaData.getColumnCount();       

            System.out.println("\r\n=========== " + rsMetaData.getTableName(1) + " ==========");

            StringBuilder sb = new StringBuilder();
            for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
                String colName = rsMetaData.getColumnName(columnIndex);
                String colType = rsMetaData.getColumnTypeName(columnIndex);
                int colLen = rsMetaData.getColumnDisplaySize(columnIndex);

                if (columnIndex == columnCount) {
                    sb.append(String.format("%s(%s, %d)", colName, colType, colLen));
                } else {
                    sb.append(String.format("%s(%s, %d) | ", colName, colType, colLen));                   
                }
            }
            System.out.println(sb.toString());           

            while(rs.next()) {
                sb = new StringBuilder();

                for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
                    String colVal = rs.getObject(columnIndex).toString();
                    if (columnIndex == columnCount) {
                        sb.append(colVal);
                    } else {
                        sb.append(colVal + " | ");                   
                    }
                }

                System.out.println(sb.toString());
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

▣ 결과
펼쳐두기..

2010년 7월 14일 수요일

우리집 가족이 늘었어요

지난 7월 10일 8시 45분 우리집 가족이 늘었습니다.

3.0kg의 딸입니다. 저도 이제 딸바보가 될지도 모르겠군요.

현재 모두 건강합니다.

건강하고 바르게 자라도록 잘 키우겠습니당...

2010년 7월 6일 화요일

[Map]우리나라 교회 분포 지도


우리나라의 교회가 약 5만 ~ 8만개로 추정된다고 하더군요.

아래 지도는 약 3만 8천개의 전국 교회를 주소 기반으로 지오코딩 후 Point로 표시한 지도입니다.

좀 많죠?


[2004년 전화번호 기준으로 등록된 숫자]
 - 5만 3천개, 신설교회 포함할 경우 약 6만개

[2005년 기준 전국 유통업관련 자료와 비교]
 - 전국 교회 수는.
 - 전국 슈퍼마켓 숫자의 9배,
 - 전국 중국집 숫자의 2.5배,
 - 전국 분식점 숫자와 거의 같고,
 - 전국 찻집 숫자의 2.5배,
 - 전국 여관 숫자의 2.5배
자료:한국종교개혁시민연대


출처: http://ask.nate.com/qna/view.html?n=8763121
 
▣ 대한민국 교회분포

[Density Map]서울시 유흥업소 분포

서울시 유흥업소(유흥, 단란주점) 분포도입니다.

 약 3000개 포인트.  [투명센터를 위한 정보공개센터] 자료를 지오코딩해서 Kernel Density Map으로 표현했습니다.

대충 어딘지 아시죠?

2010년 7월 1일 목요일

GeoScript

아주 흥미로운 사이트입니다. GeoToolsJTS를 기본 엔진으로 사용하고 있네요..

▣ GeoScript
- GeoScript adds geo capabilities to dynamic scripting languages such as JavaScript, Python, Scala and Groovy.

▣ GeoScript Main Site

▣ Blog

▣ Geometry plotting 예
<이미지 링크: http://img.skitch.com/20100622-en416rwwegpuutnig1ine2s2ka.jpg>