[GIS] 유용한 PostGIS의 SQL 문

geometry 필드를 가진 테이블이 구성하는 Row들이 구성하는 하나의 MBR을 얻는 쿼리문은 아래와 같으며 결과는 BOX(MinX MinY, MaxX MaxY) 형태입니다.

select ST_extent(the_geom) from public."tst_Table";

다음은 지정된 테이블의 스키마를 얻는 쿼리문입니다. attname은 필드명이며 atttypid는 필드타입에 대한 id 코드입니다. 그리고 atttypmod는 타입이 가변 길이 문자열(varchar type)일때 허용 최대 길이이며 실제보다 4만큼 더 크며 타입이 문자열이 아니면 -1입니다.

SELECT
    attname, atttypid, atttypmod
FROM 
    pg_attribute, pg_type
WHERE 
    typname = 'tst_Table' AND 
    attrelid = typrelid AND 
    attname NOT IN ('cmin', 'cmax', 'ctid', 'oid', 'tableoid', 'xmin', 'xmax');

atttypid에 대한 코드값에 해당하는 의미는 다음과 같습니다.

  • atttypid=16 : ‘boolean’
  • atttypid=17 : ‘bytea’
  • atttypid=18 : ‘char’
  • atttypid=19 : ‘name’
  • atttypid=20 : ‘int8’
  • atttypid=21 : ‘int2’
  • atttypid=22 : ‘int2vector’
  • atttypid=23 : ‘int4’
  • atttypid=24 : ‘regproc’
  • atttypid=25 : ‘text’
  • atttypid=26 : ‘oid’
  • atttypid=27 : ‘tid’
  • atttypid=28 : ‘xid’
  • atttypid=29 : ‘cid’
  • atttypid=30 : ‘oidvector’
  • atttypid=210 : ‘smgr’
  • atttypid=700 : ‘float4’
  • atttypid=701 : ‘float8’
  • atttypid=702 : ‘abstime’
  • atttypid=705 : ‘unknown’
  • atttypid=1007 : ‘_int4’
  • atttypid=1033 : ‘aclitem’
  • atttypid=1034 : ‘_aclitem’
  • atttypid=1042 : ‘bpchar’
  • atttypid=1043 : ‘varchar’
  • atttypid=1082 : ‘date’
  • atttypid=1083 : ‘time’
  • atttypid=1184 : ‘timestamp’
  • atttypid=1266 : ‘timetz’
  • atttypid=1700 : ‘numeric’
  • atttypid=2500 : ‘int1’
  • atttypid=2569 : ‘nucl’
  • atttypid=2570 : ‘prot’
  • atttypid=2522 : ‘nchar’
  • atttypid=2530 : ‘nvarchar’
  • atttypid=278 : ‘ntext’

다음은 geometry를 가지는 테이블의 지오메트리 타입을 얻는 쿼리문인데 하나의 테이블에 동일한 지오메트리 타입을 가지는 도형만 저장하고 있다는 가정이 필요합니다.

select GeometryType(the_geom) from public."tst_Table" limit 1;

그리고 어떤 MBR에 걸치는 도형을 공간검색하는 쿼리문은 다음과 같습니다.

SELECT
    the_geom
FROM  
    public."tst_Table"
WHERE 
    ST_Intersects 
    (
        the_geom, 
        ST_MakeEnvelope(456315, 382558, 460432, 386381, -1)
    );

위의 공간검색 쿼리는 PostGIS의 JDBC API를 사용하면 쉽게 지오메트리의 타입과 좌표값 등을 얻을 수 있습니다. 물론 자바 언어뿐 아니라 C언어에 대한 API도 제공합니다.

위의 SQL문은 MBR을 기준으로 MBR과 중첩되는 것을 검색하는 예이며 아래는 기준을 일반적인 지오메트리를 WKT 형식으로 받아 중첩되는 것을 검색하는 예입니다.

SELECT 
    *, ST_BOX2D(the_geom) 
FROM 
    public."tst_Table"
WHERE 
    ST_Intersects
    (
        the_geom, 
        'LINESTRING (244049 543725, 244134 543762)'::geometry
    );

덧붙여 검색 필드로써 ST_BOX2D를 사용해 검색된 항목의 MBR까지 얻어오도록 하였습니다.

[GIS] FingerEyes-Xr, 안드로이드 플래폼 지원

핑거아이즈(소개)는 플래시 기반의 GIS 엔진입니다. 웹에서 데스크탑 못지 않은 GIS의 기능을 지원하기 위해 개발한 제품입니다. 이번에 여러가지 다각적인 검토와 보완을 통해 핑거아이즈의 모든 기능을 안드로이드에서 지원할 수 있게 되었습니다.사용자 삽입 이미지위의 화면은 삼성 갤럭시에서 실제로 핑거아이즈를 구동시켜본 화면입니다. 타일맵을 통한 베이스맵 표현에서 시작해 수치지도의 피쳐를 터치하여 속성을 확인하고 편집하는 등의 핑거아이즈 모든 기능을 안드로이드에서 그대로 실행할 수 있습니다.

이제 핑거아이즈를 통해 하나의 GIS 시스템을 개발하게 되면 데스크탑에서는 물론 안드로이드 기반의 디바이스에서도 동일하게 GIS 시스템을 구동할 수 있습니다.

[GIS] DuraMap, 듀라맵 3.1.0.1 버전업

듀라맵이 3.1.0.1로 버전업 되었습니다. 추가된 기능 2가지와 해결된 오류입니다. 먼저 해결된 오류는 윈도우즈 XP에서 편집시 잦은 다운현상을 해결하였습니다. 이 문제에 대한 이유는 XP와 비스타(Windows 7 포함)에서 동기화 객체인 CriticalSection의 작동에 차이가 발생하는 것에 원인이 있었습니다. 그리고 추가된 기능 2가지는 다음과 같습니다. 첫번째로 사용자가 정의한 도형을 포인트 심벌로 사용할 수 있게 되었습니다. 그리고 두번째는 폴리곤의 라벨 표시에서 항상 폴리곤 위에 표시되도록 개선함으로써 라벨의 가시성을 향상시켰습니다.

먼저 사용자 정의 도형을 포인트 심벌로 지정하는 기능은 추후 CAD 데이터를 완벽하게 지원하기 위한 기능으로 CAD에서는 포인트에 대해 Block Symbol 기능과 유사합니다. 이 기능은 추후 CAD 데이터(DXF 파일)을 지원하는 기능을 추가할때 이 기능이 유용하게 사용될 예정입니다.

사용자 삽입 이미지
그리고 라벨 표시에서 항상 폴리곤 위에 표시되도록 개선한 기능은.. 기존에 폴리곤의 라벨은 항상 도형의 무게중심점(Centroid)를 기준으로 라벨을 표시하도록 하였으나 가끔 폴리곤 밖으로 라벨이 표시되는 현상이 발생하여 항상 도형 안에 라벨이 표시되도록 한 기능입니다. 위의 이미지에서 첫번째는 일반적인 도형의 무게중심점 위치에 라벨을 표시하도록 한 이미지이고 두번째가 이번에 새롭게 개선된 라벨 표시에 대한 이미지입니다.

추가된 새로운 기능에 대한 API 사용방법에 대해서는 추후 별도의 글을 통해 소개드리도록 하겠습니다.

[GIS] SHP와 SHX 파일 해석(파싱)시 주의할 점

SHP의 레코드 헤더와 SHX의 레코드 헤더는 각각 Content Length와 Offset, Content Length라는 Integer 타입의 값이 있습니다. 물론 SHP와 SHX에 대한 Content Length는 동일합니다. 여기서 주의할 점은 이 값이 BYTE 개수가 아닌 WORD 개수라는 점입니다. 예를 들어서 Content Length가 100이라고 할때 레코드 내용의 길이가 100 BYTES가 아닌 2배 길이인 200 BYTES라는 것이지요.

사용자 삽입 이미지
ESRI에서 제공하고 있는 문서에.. 잘(?) 나와 있네요.  길이니 당연히 BYTE 개수겠지 하고 술렁 술렁 넘어갔더랬는데.. 이런 복병이.. 대학원 다닐때 SHP 파일 해석하는 것을 구현했던 적이 있었는데.. 그땐 문제없이 잘했더랬는데.. 초심자의 마음으로 문서를 정밀하게(?) 읽고 구현했던 시절이였으니 지금의 실수가 없었겠지 않나 싶습니다. 여튼.. SHP파일 파싱할때 요점 주의하시기 바랍니다.. 초심의 잃지 말아야한다.. 라는 각오를 새롭게 다져봅니다.