C# 벡터 및 공간 좌표계 인터페이스
기본 아키텍처
벡터 인터페이스는 OSGeo.OGR
이름공간 안에 있으며 공간 좌표계 인터페이스는 OSGeo.OSR
이름공간 안에 있습니다.
주 클래스들은 다음과 같습니다:
OGR
|
|- DataSource
|
|- Layer
|
|- Feature
|
|- Geometry
OSR
|
|- SpatialReference
|
|- CoordinateTransform
피처 도형에 접근하기
기본 과정은 DataSource
=> Layer
=> Feature
=> Geometry
입니다.
데이터소스 열기
DataSource
가 OGR 소스를 (예: 파일명을) 둘러싸는데, 다음과 같이 생성됩니다:
/* -------------------------------------------------------------------- */
/* 포맷(들) 등록 */
/* -------------------------------------------------------------------- */
Ogr.RegisterAll();
/* -------------------------------------------------------------------- */
/* 데이터소스 열기 */
/* -------------------------------------------------------------------- */
using (DataSource ds = Ogr.Open( "... add your own valid OGR source", 0 ))
{
if (ds == null) {
// 오류 생성
}
// 여기에서 처리 수행
}
레이어에 접근
각 DataSource
는 다음과 같이 반복할 수 있는 레이어를 하나 이상 가질 것입니다:
/* -------------------------------------------------------------------- */
/* 레이어 반복하기 */
/* -------------------------------------------------------------------- */
for( int iLayer = 0; iLayer < ds.GetLayerCount(); iLayer++ )
{
Layer layer = ds.GetLayerByIndex(iLayer);
if( layer == null )
{
// 오류 생성
}
// 여기에서 처리 수행
}
레이어의 피처에 접근
각 Layer
는 Feature
를 0개 이상 가질 수 있습니다. 피처에는 다음과 같이 접근해야 합니다:
layer.ResetReading();
Feature f = null;
do {
f = layer.GetNextFeature();
if (f != null)
// 여기에서 처리 수행
} while (f != null);
피처의 도형에 접근
Geometry geom = feature.GetGeometryRef();
wkbGeometryType type = geom.GetGeometryType();
Geometry
객체는 내포되어 있기 때문에, 예를 들어:
wkbGeometryType.wkbTIN
유형의Geometry
은wkbGeometryType.wkbTriangle
유형의 하위Geometry
객체를 여러 개 가집니다.wkbGeometryType.wkbTriangle
유형의 각Geometry
객체는wkbGeometryType.LinearRing
유형의 하위Geometry
객체를 가집니다.wkbGeometryType.LinearRing
유형의 각Geometry
는 포인트를 여러 개 담고 있습니다.
가장 기본적인 유형에 도달했을 때 – 보통 wkbGeometryType.wkbPoint
, wkbGeometryType.wkbLineString
또는 wkbGeometryType.wkbLinearRing
유형, 또는 이 유형들의 다중 버전, 25D 버전 또는 ZM 버전이 나타나는 경우 – 다음과 같이 포인트 좌표에 접근할 수 있습니다:
int count = geom.GetPointCount();
if (count > 0)
for (int i = 0; i < count; i++) {
double[] argout = new double[3];
geom.GetPoint(i, argout);
// 여기에서 처리 수행
}
Note
double[]
의 값은 Geometry
의 차원 개수에 따라 달라집니다.
피처의 데이터 필드에 접근
각 Feature
객체는 관련된 데이터 필드 여러 개를 가질 수 있습니다. 이 데이터 필드에 대한 스키마는 FieldDefn
객체에 정의됩니다. 이런 필드를 다음과 같이 가져올 수 있습니다:
Dictionary<string, object> ret = new Dictionary<string, object>();
if (feature != null) {
int fieldCount = feature.GetFieldCount();
for (int i = 0; i < fieldCount; i++) {
FieldDefn fd = feature.GetFieldDefnRef(i);
string key = fd.GetName();
object value = null;
FieldType ft = fd.GetFieldType();
switch (ft) {
case FieldType.OFTString:
value = feature.GetFieldAsString(i);
break;
case FieldType.OFTReal:
value = feature.GetFieldAsDouble(i);
break;
case FieldType.OFTInteger:
value = feature.GetFieldAsInteger(i);
break;
// 가능한 필드 유형들 가운데 이것이 유일한 하위 집합이라는 사실을 기억하십시오
}
ret.Add(key, value);
}
}
도형 좌표계에 접근
Geometry
에 좌표계(공간 좌표계)가 정의되어 있는 경우 다음과 같이 가져올 수 있습니다:
SpatialReference crs = geom.GetSpatialReference()
SpatialReference
는 좌표계/투영법을 표현하기 위한 주 클래스입니다. 이 좌표계는 예를 들면 터미널에 출력하기 위해 다음과 같이 WKT 문자열로 변환시킬 수 있습니다:
string wkt;
crs.ExportToWkt(out wkt, null);
Note
레이어에 정의된 좌표계가 피처로 전파되지 않는 경우가 있습니다. 이 경우 다시 레이어를 참조해야 합니다.
도형 재투영
Geometry
에 무결한 SpatialReference
가 정의되어 있다면, 다음과 같은 명령어를 사용해서 Geometry
을 새 좌표계로 변환할 수 있습니다:
if (geom.TransformTo(newProjection) != 0)
throw new NotSupportedException("projection failed");
하지만 많은 경우 사용할 CoordinateTransform
을 명확하게 정의하는 편이 낫습니다:
SpatialReference from_crs = new SpatialReference(null)
// 메모: WKT로부터 정의하는 경우 'null'을 'wkt'로 대체하십시오
from_crs.SetWellKnownGeogCS("EPSG:4326");
SpatialReference to_crs = new SpatialReference(null);
to_crs.ImportFromEPSG(27700);
CoordinateTransform ct = new CoordinateTransform(from_crs, to_crs, new CoordinateTransformationOptions())
// CoordinateTransformationOptions를 사용해서 작업 또는 관심 영역 등을 설정할 수 있습니다
if (geom.Transform(ct) != 0)
throw new NotSupportedException("projection failed");
관련 C# 예시
다음 예시들은 앞에서 설명한 GDAL 벡터 작업의 사용례를 보여줍니다: