[GIS] Xr로 만든 간단한 지도 이미지..

서울시의 구에 대한 shp 파일 하나만을 가지고 Xr 맵엔진에서 표출해 본 지도 이미지 입니다. 디자이너를 위한 지도 데코레이션 툴을 만들고 있는 중에… 머리도 복잡하여 한번 테스트 겸 간단히 만들어 보았는데.. 아직은 많은 부분에서 밋밋한 분위기입니다만.. 좀더 다양한 레이어와 POI 그리고 아이콘 등으로 장식을 하면 보다 이쁜 지도 이미지가 나오지 않을까 기대를 해봅니다.
사용자 삽입 이미지
지금 개발하고 있는 디자이너를 위한 툴은 Xr 맵엔진을 기반으로 해 만든 툴로써 추후 지도 타일 이미지를 만들기 위한 툴입니다. 추후 개발할 RIA 기술을 적용한 엔진에서 사용할 지도 이미지를 만들기 위한 목적으로 개발되고 있습니다.

참고로 이툴에 사용되는 Xr  클라이언트 맵엔진은 오픈소스를 목적으로 개발하고 있습니다. 추후 어느 정도 안정화되고 가닦이 잡히면 소스를 공개할 예정입니다. 소스를 공개하는 이유는 향후 보다 많은 분들의 의견 수렴을 받기 위함입니다. 기능적인 부분에서 뿐만이라 지도 이미지의 비주얼적인 모습에 대한 조언을 듣고 적당하다면 적극적으로 수렴할 계획입니다.

그리고 아래는 도로 중심선(Polyline) 데이터에 대한 하나의 shp 파일을 이용해 만들어본 지도 이미지입니다.

사용자 삽입 이미지
참고로 아래는 예전에 올렸던, Xr 맵 엔진을 이용해 만든 지도 이미지입니다. 이 글과 연관이 깊어 다시 한번 함께 올려봅니다.
사용자 삽입 이미지

지도 엔진의 라벨 회전 기능

오늘 또 김연아의 무결점 환상 연기.. 단 한차례의 NG도 없는.. 역대 최고의 점수를 획득했습니다. 정말 자랑스럽습니다..!

GIS 데이터를 그래픽 요소와 문자 요소를 기준으로 살펴보면 도형 데이터와 속성 데이터로 구분됩니다. 이때 도형에 대한 속성을 화면상에 표시하는 것을 라벨(Label) 또는 주기(Annotation)이라고 하는데.. 이 라벨을 표현하는 방법 또한 다양합니다. 단순히 속성 값을 표시하는 것에서 부터.. 다수의 속성을 표현식으로 조합하여 표현하는 방식과 멀티 라인 속성 방식.. 그리고 폴리라인을 따라 회전하는 표현 방식이 있습니다.

사용자 삽입 이미지
위의 이미지는 Xr 맵엔진에서 각 도형에 해당되는 속성을 도형에 따라 회전하며 라벨 텍스트를 표현하는 방식입니다. 이런 표현 방식은 위의 이미지처럼 도로명을 표현할때 매우 효과적인 방식입니다. Xr 맵 엔진은 지도 타일 이미지를 전문적으로 렌더링하기 위한 1차 목표를 추구하기 위한 맵 엔진입니다. 최근 RIA를 기반으로 한 지도 엔진 개발을 최종 목표로 하고 있는 프로젝트에서 Xr 맵 엔진은 첫 관문으로써 매우 중요한 의미를 가지고 있습니다.

[GIS] WKB(Well-Known Binary) Format

공간 데이터를 처리하는 DBMS는 포인트, 폴리라인, 폴리곤과 같은 공간 좌표 데이터를 효율적으로 저장하기 위해 BLOB 타입으로써 WKB라는 형태로 저장합니다. 개발하고 있는 지도 렌더러를 위한 맵엔진(코드명: Xr)에서 사용할 수치지도 데이터 포맷에 대해 고민하던 차에… GIS 데이터 표현의 범용 표준 중에 하나인 WKB에 대한 자료를 정리해 보았습니다.

WKB, 즉 Well-known Binary는 OpenGIS 스펙에 의해 정의된 지오메트리 값을 표현하기 위해 사용됩니다. KWB는 지오메트리 WKB 정보를 담고 있는 BLOB 타입의 값으로 표현되는 바이너리 스트림으로써 지오메트리 데이터를 상호간에 교환하기 위해 사용됩니다. WKB는 1바이트의 부호없는 정수와 4바이트의 부호없는 정수 그리고 8바이트의 배정밀 소수(IEEE 754)를 사용합니다. 여기서 1바이트는 8비트입니다.

예를 들면… WKT인 POINT(1 1)을 동일한 WKB로 변환해 본다면… 다음과 같은 총 21개로 구성된 연속된 바이트입니다.

0101000000000000000000F03F000000000000F03F

앞의 연속된 바이트를 해석 해보면… 다음과 같습니다.

사용자 삽입 이미지

즉, 첫번째 1바이트의 값이 1이면 바이트 정렬이 Little-Endian이며 0이면 Big-Endian이라는 의미입니다. 그리고 다음 2바이트는 지오메트리 타입으로써 현재까지 제안된 타입은 총 7개로써 Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon 그리고 GemetryCollection입니다. 끝으로 포인트의 좌표인 X와 Y 값이 각각 8바이트씩 오게됩니다.

앞의 예는 Point 타입에 대한 예이며 다른 지오메트리 타입에 대해서, 보다 직관적이고 효율적으로 파악하기 위해 C언어의 구조체 형식으로 보면 다음과 같습니다.

// Basic Type definitions
// byte : 1 byte
// uint32 : 32 bit unsigned integer  (4 bytes)
// double : double precision number (8 bytes)
// Building Blocks : Point, LinearRing
 
Point {
    double x;
    double y;
};

LinearRing   {
    uint32 numPoints;
    Point points[numPoints];
};

enum wkbGeometryType {
    wkbPoint = 1,
    wkbLineString = 2,
    wkbPolygon = 3,
    wkbMultiPoint = 4,
    wkbMultiLineString = 5,
    wkbMultiPolygon = 6
};

enum wkbByteOrder {
    wkbXDR = 0, // Big Endian
    wkbNDR = 1 // Little Endian
};

WKBPoint {
    byte byteOrder;
    uint32 wkbType; // 1=wkbPoint
    Point point;
};

WKBLineString {
  byte byteOrder;
  uint32 wkbType; // 2=wkbLineString
  uint32 numPoints;
  Point points[numPoints];
};
 
WKBPolygon {
  byte byteOrder;
  uint32 wkbType; // 3=wkbPolygon
  uint32 numRings;
  LinearRing rings[numRings];
};

WKBMultiPoint {
  byte byteOrder;
  uint32 wkbType; // 4=wkbMultipoint
  uint32 num_wkbPoints;
  WKBPoint WKBPoints[num_wkbPoints];
};

WKBMultiLineString {
  byte byteOrder;
  uint32 wkbType; // 5=wkbMultiLineString
  uint32 num_wkbLineStrings;
  WKBLineString WKBLineStrings[num_wkbLineStrings];
};
 
wkbMultiPolygon {
  byte byteOrder;
  uint32 wkbType; // 6=wkbMultiPolygon
  uint32 num_wkbPolygons;
  WKBPolygon wkbPolygons[num_wkbPolygons];
};
 
WKBGeometry  {
  union {
    WKBPoint point;
    WKBLineString linestring;
    WKBPolygon polygon;
    WKBMultiPoint mpoint;
    WKBMultiLineString mlinestring;
    WKBMultiPolygon mpolygon;
  }
};

바이너리는 크기면에서 데이터를 매우 최적화된 형태로 저장할 수 있는 포맷입니다. GIS 엔진을 설계하고 개발할때 자체 엔진에 특화된 데이터 구조를 설계하는 것 대신에 이러한 표준을 수용할 경우 얻을 수 있는 이점은 매우 크다고 할 수 있겠습니다.

이 글의 일부는 다음 URL에서 참고하였습니다.
http://dev.mysql.com/doc/refman/5.0/en/gis-wkb-format.html

[GIS] 표준 GML/KML/WMS/WFS에 대한 요약

자주 솔루션에 대한 요구사항으로 표준을 준수하는가… 라는 대응 항목 중 gml, kml, wms, wfs 이 있습니다. 새로운 gis 데이터 서버 개발에 이러한 표준 항목을 준수하기 위한 준비로 해당 항목에 대해 개략적으로 파악할 목적으로 작성한 내용입니다.

GML (Geography Markup Language)
http://www.opengeospatial.org/standards/gml

GML은 지리적 특성을 표현하기 위한 XML 문법입니다. GML은 인터넷에서 지리 데이터 송수신을 위한 개방된 교환 포맷임과 동시에 지리데이터 시스템을 위한 모델링 언어로써 사용됩니다. 문법에 기반한 대부분의 XML과 같이 두 부분으로 나눠져 있습니다.

  1. 문서의 설명 부분
  2. 실제 데이터 부분

GML 문서는 GML 스키마를 사용하여 기술됩니다. 이는 사용자와 개발자에게 포인트, 라인 그리고 폴리곤을 포함하는 일반적인 지리데이터셋을 설명할 수 있도록 합니다. 그러나 GML의 개발자들은 GML의 확장을 특화시키는 커뮤니티 지향적인 어플리케이션 스키마를 정의하기 위한 커뮤니티 작업을 상상합니다. 어플리케이션 스키마를 사용하여 사용자는 일반적인 포인트, 라인, 폴리곤을 길, 고속도로 그리고 다리로써 참조할 수 있습니다. 만약 커뮤니티의 모든 사람이 동일한 스키마를 사용하는 것에 대해 동의한다면 데이터를 쉽게 교환할 수 있으며 도로에 대한 라인을 표시할때 도로로 표시할 수 있게 됩니다.

KML(Keyhole Markup Language)
http://earth.google.com/intl/ko/userguide/v4/ug_kml.html
http://en.wikipedia.org/wiki/Keyhole_Markup_Language

KML은 현재 또는 미래의 웹 기반의 2차원과 3차원 브라우저에서 지리 데이터의 주기와 가시화를 위한 XML 기반의 스키마입니다. KML은 Google 어스, Google 지도 및 기타 응용 프로그램에 표시하기 위해 점, 선, 이미지, 다각형 및 모델과 같은 지형 기능을 모델링하고 저장하기 위한 XML 문법 및 파일 형식입니다. KML을 사용하여 Google 어스 및 Google 지도의 다른 사용자와 장소 및 정보를 공유할 수 있습니다. KML은 구글어스에서 사용하기 위해 개발되어졌으며 원래 이름은 Keyhole Earth Viewer였습니다. Keyhole 사에서 만들어졌으며 이 회사는 2004년에 구글로 인수되었습니다. 현재 KML은 오픈 GIS 컨소시엄의 국제 표준입니다. KML을 표현하고 편집할 수 있는 첫번째 프로그램은 구글어스이며 KML을 지원하는 툴이 다양하게 제공되고 있습니다.

참고 : KMZ 파일은 KML 파일의 압축된 버전입니다.

WMS(Web Map Service)
http://en.wikipedia.org/wiki/Web_Map_Service

WMS는 GIS 데이터베이스의 데이터를 사용하는 지도 서버로부터 생성되어진 지오레퍼런싱된 지도 이미지를 서비스하기 위한 표준 프로토콜입니다. 스펙은 1999년에 오픈 GIS 컨소시엄에서 처음 개발어 공개되었습니다.

WMS는 다양한 요청 타입을 가지고 있으며 WMS 서버는 다음 2가지 요청 타입을 제공해야 합니다.

  1. GetCapabilities : WMS에 대한 인자값과 이용가능한 지도 레이어 목록 반환
  2. GetMap : 해당 인자에 대한 지도 이미지

다음은 WMS 서버에서 옵션으로 제공하는 요청 타입입니다.

  1. GetFeatureInfo
  2. DescribeLayer
  3. GetLegendGraphic

WMS는 클라이언트가 인터넷으로부터 접근할 수 있는 지도와 GIS 데이터 포맷을 폭넓게 지원합니다. WMS를 지원하는 주요 상업적인 GIS 및 맵핑 소프트웨어는 다음과 같습니다.

  • Bentley Systems’s GIS products
  • ESRI’s ArcGIS products
  • MapInfo Professional
  • GeoMedia
  • Manifold System
  • Google Earth

또한 WMS를 지원하는 오픈소스 제품군은 다음과 같습니다.

  • Quantum GIS
  • uDig
  • OpenJUMP
  • MapGuide Open Source
  • NASA World Wind
  • GRASS GIS
  • gvSIG
  • OpenLayers

WFS(Web Feature Service)
http://en.wikipedia.org/wiki/Web_Feature_Service

WFS는 플랫폼에 독립적인 호출을 이용하여 웹에서 지리데이터에 대한 피쳐(feature)를 요청할 수 있는 인터페이스를 제공합니다. WMS가 단순히 지도 이미지만을 서비스하는데 반해 WFS는 공간 분석 등과 같은 연산을 위해 필요한 데이터를 서비스 합니다.

WFS의 서비스 기능은 다음과 같습니다.

  1. 공간 또는 비공간 조건에 기반한 피쳐(feature)의 쿼리
  2. 새로운 피쳐 생성
  3. 피쳐 삭제
  4. 피쳐 업데이트

가장 기본적인 WFS 서버는 반드시 공간 또는 비공간 조건에 기반한 피쳐의 쿼리 기능을 지원해야 하며, 트랜젝션 WFS(WFS-T)는 피쳐의 생성과 삭제 그리고 업데이트를 제공합니다.

 

[GIS] 분석 결과와 배경 지도

오늘 급작스레 구현해 본 기능인데… 어떤 공간 위에 여러가지 데이터를 가지고 분석한 결과를 표출할때… 배경이 되는 지도와 분석 결과가 뒤섞여… 분석 결과가 한눈에 들어오지 않는 경우가 있는 듯합니다.

사용자 삽입 이미지

그래서 배경이 되는지도의 색상을 빼고, 분석 결과만 색상을 적용하도록 했습니다. 물론.. 사용자가 원하는 시점에서 배경 지도의 색상을 적용하고 뺄 수 있도록 한 것이구요. 매우 단순한 아이디어지만… 사용자에게는 매우 좋은 기능으로 생각됩니다..

위의 이미지는 배경지도위에 어떤 주제를 가지는 밀도 분석 결과를 함께 표현한 것입니다. 지도 엔진은 오픈메이트의 지도 엔진인 XGE를 이용해서 밀도 분석은 XGE에 플러그인할 수 있는 확장 기능으로 수행했습니다.

참고로… 위의 이미지에 해당하는 프로그램인 Clone은 XGE를 이용해 만든 간단한 C/S 프로그램입니다. 여러가지 공간분석기능을 기본도 위에서 수행할 수 있는 GIS 분석용 프로그램입니다. 언제 시간이 되면… XGE를 이용해 만든 여느 프로그램처럼… 소스를 공개할 예정입니다.