[GIS] ArcObjects, Shape 파일로부터 레이어 추가하기

ArcObjects는 GIS 어플리케이션 개발에 적용할 수 있는 매우 방대하며 매우 강력한 라이브러리입니다. 기본적으로 ArcGIS를 설치하면 개발자가 쉽게 사용할 수 있도록 되어 있습니다. 필자는 2002년 초에 처음 ArcObjects를 접했는데… 그 방대함과 강력함에 매료되었습니다. 제가 아는 GIS 개발 범위에서 필요한 기능은 모두 ArcObjects에서 구할 수 있었다고 해도 과언이 아닐 정도로 말입니다.

간단한 수치지도 도시, 네트워크 및 위상 분석, 그리드 분석, 3D에 대한 틴, 모델 등의 표현과 관련된 공간 분석 그리고 강력한 편집 기능 등… 이루 다 말할 수 없을 정도로 방대한 GIS 개발 도구를 제공합니다. 처음 ArcObjects를 접하고 수년이 흘렀지만 여전이 ArcObjects는 GIS 어플리케이션 개발에서 매우 큰 영역을 차지하고 있으며 향후에도 개발자와 GIS 개발 회사에 미치는 영향력은 더 커지거나 지금처럼 계속 유지될 것으로 기대됩니다.

ArcObjects를 이용한 GIS 시스템 개발에 대한 일을 맡으면서 ArcObjects를 활용해야할 일이 생겼습니다. 과거 ArcObjects를 사용하여 개발했던 프로젝트의 경험에 대한 기억이 가물가물해져 버렸습니다. 해서… 그때의 실수가 되풀이 되지 않도록 ArcObjects에 대한 경험을 글로 하나 하나 남겨 놔야 겠다는 생각이 들어 ArcObjects 관련 글을 포스팅하기로 하였습니다.

그 첫번째는 GIS에서 수치지도 교환에 거의 표준으로 활용되고 있는 ESRI의 SHP 파일을 추가하는 방법입니다. 개발언어는 C#를 사용할 것이며 Form 기반의 어플리케이션의 폼에 ArcObjects에서 제공하는 MapControl을 올려 놓습니다. MapControl의 정확한 클래스 타입은 AxMapControl입니다. 그리고 버턴을 하나 올려 놓습니다. 이 버턴 안의 코드는 지정된 폴더에 존재하는 SHP 파일을 MapControl에 추가하는 코드입니다.

ESRI.ArcGIS.Geodatabase.IWorkspaceFactory pWF;
ESRI.ArcGIS.Geodatabase.IFeatureWorkspace pFW;
ESRI.ArcGIS.Carto.IFeatureLayer pFL;

pWF = new ESRI.ArcGIS.DataSourcesFile.ShapefileWorkspaceFactory();
pFW = pWF.OpenFromFile("d:/__data__", 0) 
              as ESRI.ArcGIS.Geodatabase.IFeatureWorkspace;
pFL = new ESRI.ArcGIS.Carto.FeatureLayer();
pFL.FeatureClass = pFW.OpenFeatureClass("seoul");
pFL.Name = pFL.FeatureClass.AliasName;

axMapControl1.AddLayer(pFL);

SHP 파일 하나를 추가하 위한 절차가 단순하지 않다는 것을 느낄 수 있습니다. 이는 ArcObjects가 매우 다양한 데이터 포맷을 지원하는 이유이며 로컬 데이터 뿐만 아니라 네트워크로부터 데이터를 받을 수 있도록 하기 위함입니다.

중요한 부분만을 짚어 설명한다면 6번 줄의 코드에서 OpenFromFile 매서드의 첫번째 인자 값인 d:/__data__ 라는 폴더를 작업공간으로 지정하겠다는 의미입니다. 즉, 추가하고자 하는 SHP 파일이 존재하는 경로입니다. 두번째 인자는 부모 윈도우의 핸들로써 NULL(0) 값으로 주어도 관계없습니다. 실제 SHP 파일명은 9번째 줄의 OpenFeatureClass 매서드의 인자로 지정하며 주의할 점은 확장자인 .shp를 생략하고 있다는 점입니다.

이런 절차로 생성한 ILayer 타입인 IFeatureLayer를 MapControl의 AddLayer 매서드의 인자로 주게 되어 추가할 수 있습니다. 결과는 아래와 같습니다.

사용자 삽입 이미지

레이어를 추가하자 마자 MapControl은 추가된 레이어의 전체를 도시하게 됩니다. 이상으로 간단히 SHP 파일을 ArcObjects에서 제공하는 MapControl에 추가하여 도시하는 방법을 살펴보았습니다.

[GIS] TXT 파일을 SHP 파일로 변환하기(Txt2Shp)

가끔 좌표 데이터와 속성 데이터가 텍스트 파일 형태로 되어 있는 경우가 있습니다. 하나의 예로 서울시의 버스 노선에 대한 데이터인데, 서울시에서 버스 노선에 대한 정보을 엑셀로 저장하여 사용자에게 제공하고 있습니다. 이 엑셀 파일을 쉽게 텍스트 파일로 저장할 수 있으며 다시 이 텍스트 파일을 읽어서 SHP 파일로 변환해 주는 툴입니다. 참고로 서울시 버스 노선에 대한 엑셀 파일은 아래 URL을 통해 다운로드 받을 수 있습니다.

위의 엑셀 파일을 엑셀 프로그램에서 읽어 [다른 이름으로 저장하기]에서 “텍스트 (탭으로 분리)” 형식으로 저장한 파일을 살펴보면 다음과 같습니다.

사용자 삽입 이미지

첫번째 줄에 필드 명 들이 텝문자로 구분되어 나타나고.. 이후의 줄은 각 필드에 대한 값이며 역시 텝으로 분리되어 있습니다. 이 텍스트 파일을 SHP 파일로 만드는 툴의 사용은 아래와 같습니다.

사용자 삽입 이미지

살짝 설명을 하면, Fields에 내보내고자 하는 항목을 체크하고 X, Y 좌표로써 사용할 필드를 지정해 줍니다. 위의 서울시 노선 데이터와 툴을 사용해 만든 SHP 파일을 ArcMap에서 열어 보면 아래 화면과 같습니다.

사용자 삽입 이미지
툴에서 지정한 속성과 좌표가 제대로 표시되는 것을 확인할 수 있습니다. 간단히 TXT 파일을 SHP 파일로 변환할 경우가 있을 때 요긴하게 사용하시길 바라면서 만들어 올려 봅니다. 참고로 이 프로그램은 GIS 오픈소스 라이브러리인 shapelib을 사용해 만들어 었습니다. shapelib의 자세한 사용법은 cafe.naver.com에서 오픈소스 라이브러리 카테고리를 참고하시면 도움을 받으실 수 있습니다.

[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] 폴리곤 SHP를 KML로 변환하는 툴

폴리곤 SHP를 KML로 변환하는 툴을 요청하는 분이 계셔서 바로 만들어 올립니다. 원래 오늘 정도 만들어 올리려고 했는데… 먼저 필요한 분이 있어서 기쁜 마음에 올려봅니다.

사용자 삽입 이미지

폴리곤 타입의 SHP를 지정하고… 높이 값에 대한 필드를 지정하여 건물과 같은 Feature를 입체감있게 표현할 수 있도록 하였습니다. 높이 값에 어떤 수를 곱할 수 있도록 값을 지정할 수 있도록 하였으니 참고하시구요. 만약 높이값에 대한 필드가 딱히… 없다면 일정한 높이 값을 지정할 수도 있게 하였습니다. 아래는 건물 SHP을 KML로 내보내어 구글어스에서 본 화면입니다. 참고로 SHP 파일의 좌표계는 WGS84 경위도 좌표계를 가지고 있어야 구글어스에서 옳바른 위치가 적용됩니다.

사용자 삽입 이미지
포인트나 폴리라인을 kml로 변환하는 다른 툴보다 상대적으로 사용법이 다소 복잡한데… 이해가 않되시거나 실행이 않되는 분들은 언제든 댓글을 통해 질문 남겨주시기 바랍니다.