[OpenLayers] WKT 문자열로 Feature 추가하기

WKT는 Well Known Text의 약자로, 쉽게 이해할 수 있는 문자열로 데이터를 표현하는 방식으로 GIS의 공간 데이터의 Row 단위를 나타낼 수 있습니다. 예를 들어, 아래의 WKT는 4개의 좌표로 구성된 폴리곤입니다.

POLYGON((10.689 -25.092, 34.595 -20.170, 38.814 -35.639, 13.502 -39.155, 10.689 -25.092))

이러한 WKT 문자열을 통해 VectorLayer에 Feature를 추가할 수 있는데요. 먼저 코드의 예는 아래와 같습니다.

import WKT from 'ol/format/WKT.js';

var wkt = 'POLYGON((10.689 -25.092, 34.595 ' +
    '-20.170, 38.814 -35.639, 13.502 ' +
    '-39.155, 10.689 -25.092))';

var format = new WKT();

var feature = format.readFeature(wkt, {
  dataProjection: 'EPSG:4326',
  featureProjection: 'EPSG:3857'
});

이렇게 생성된 feature 객체는 아래처럼 벡터 레이어를 생성하면서 곧바로 데이터 소스를 통해 추가될 수 있습니다.

import {Vector as VectorSource} from 'ol/source.js';
import {Vector as VectorLayer} from 'ol/layer.js';

var vector = new VectorLayer({
  source: new VectorSource({
    features: [feature]
  })
});

데이터 소스를 통해 feature를 추가하는 방식은 데이터 소스의 addFeature 함수를 통해서도 가능합니다. 참고로 필자는 OpenLayers v5.3을 사용하여 위의 코드를 테스트 하였습니다.

VWorld의 3D 모델 파일을 웹에서 가시화

VWorld에서 제공하는 3차원 지도 서비스가 있습니다. 3차원 지형 위에 3차원 건물을 사실감 있게 표현하고 있는 서비스입니다. 이 VWorld는 지형의 높이 데이터인 DEM과 모델 데이터를 공개하고 있습니다. 둘 중에 모델 데이터는 xdo라는 확장자를 갖는 VWorld만의 데이터 포맷으로 제공되고 있습니다.

이 xdo 파일을 웹에서 WebGL을 이용하여, 보다 정확히는 WebGL을 좀더 편리하게 사용할 수 있는 three.js를 이용하여 xdo 데이터를 해석하고 가시화 하는 기능을 구현해 보았습니다. 아래는 관련 동영상입니다.

3차원 빌딩 모델에 대한 단면 추출

VWorld에서 제공하는 xdo 파일을 통해 3차원 건물 모델에 대한 단면을 추출하는 기능에 대한 구현에 대한 실행 동영상입니다.

Web에서 3차원 가시화를 위해 three.js 라이브러리를, gui는 dat.gui 라이브러리를 사용했습니다.

EPSG.io를 통한 proj4 문자열 얻기

EPSG는 European Petroleum Survey Group의 약자로 전세계의 다양한 좌표계를 표준 코드화하여 최대한 많은 정보를 압축하여 제공하는 방식입니다. EPSG의 약자에 Survey, 즉 측량이 있다는 것은 GIS의 근본이 되는 좌표와 그 좌표가 측량으로 측정되고 존재한다는 의미로 측량의 중요성을 나타낸다고 할 수 있습니다.

이러한 EPSG에 대한 정보는 epsg.io라는 사이트를 통해 코드값으로 질의(Query) 함으로써 얻을 수 있습니다 예를 들어, 우리나라의 GRS80 타원체의 UTM-K 좌표계인 EPSG:5179에 대한 정보를 얻기 위해 아래와 같은 url을 호출함으로써, 그 결과를 JSON으로 얻을 수 있습니다.

https://epsg.io/?format=json&q=5179

결과는 아래와 같습니다.

{  
    "status":"ok",
    "number_result":1,
    "results":[  
       {  
          "code":"5179",
          "kind":"CRS-PROJCRS",
          "bbox":[  
             40.27,
             122.71,
             28.6,
             134.28
          ],
          "wkt":"PROJCS[\"Korea 2000 / Unified CS\",GEOGCS[\"Korea 2000\",DATUM[\"Geocentric_datum_of_Korea\",SPHEROID[\"GRS 1980\",6378137,298.257222101,AUTHORITY[\"EPSG\",\"7019\"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY[\"EPSG\",\"6737\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4737\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",38],PARAMETER[\"central_meridian\",127.5],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",1000000],PARAMETER[\"false_northing\",2000000],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AUTHORITY[\"EPSG\",\"5179\"]]",
          "unit":"metre",
          "proj4":"+proj=tmerc +lat_0=38 +lon_0=127.5 +k=0.9996 +x_0=1000000 +y_0=2000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs",
          "name":"Korea 2000 / Unified CS",
          "area":"Republic of Korea (South Korea) - onshore and offshore.",
          "default_trans":15831,
          "trans":[  
             15831
          ],
          "accuracy":1.0
       }
    ]
 }

위의 내용중 상대적으로 의미가 있는 부분은 좌표계의 단위를 나타내는 unit과 해당 좌표계의 국제 명칭인 name과 좌표계가 허용하는 지역의 범위인 bbox와 좌표계 변환을 위한 proj4 문자열인 proj4입니다. 누락된 부분은 타원체간의 변환계수인데요. 위의 경우 proj4의 문자열 값 중 towgs84에 해당되는 부분입니다. 최근 타원체가 GRS80이나 이와 거의 동일한 WGS84가 주로 사용되고, Bessel1841과 같은 타원체는 거의 사용되지 않음으로써 타원체간 변환계수의 중요성은 시간이 갈수록 점점 사라질 것입니다. 그럼에도 아직 우리나라의 GIS 데이터는 Bessel1841 타원체를 근간으로 하는 좌표계가 적용되어 있는 경우가 많습니다. 대표적으로 지적도가 그렇습니다.

여튼, EPSG.io라는 사이트의 서비스를 이용하여 쉽게 좌표계의 제원 정보를 조회할 수 있음으로, 이를 활용하여 좌표계간의 다양성을 해결할 수 있습니다. 예를들어 OpenLayers에는 원하는 좌표계를 등록하여 서로 다른 좌표계간의 좌표 변환이 가능한데, 그 예가 아래와 같습니다.

import proj4 from 'proj4';
import {register} from 'ol/proj/proj4.js';
import {get as getProjection, getTransform} from 'ol/proj.js';

var newProjCode = 'EPSG:5179';

proj4.defs(newProjCode, proj4def);
register(proj4);

var newProj = getProjection(newProjCode);
var fromLonLat = getTransform('EPSG:4326', newProj);

위의 proj4def는 5179 코드로 하여 epsg.io의 서비스를 통해 얻은 proj4의 문자열 값입니다. 최종적으로 formLonLat라는 함수를 얻을 수 있는데, 이함수는 EPSG:4326 좌표계를 EPSG:5179 좌표계로 변환할 수 있는 함수입니다. 참고로 EPSG:4326은 WGS84 타원체의 경위도 좌표계입니다.