XDL TIP
[NIO] 벡터파일(Shape파일) 로딩, 속성값 읽기, 좌표계 변환, XML파일로 저장하기
작성자
pixoneer
작성일
2016-11-21 09:40
조회
3971
// 벡터파일(.shp)을 로딩해서 Scene객체로 변환하여 사용하기
// 1. 벡터를 로딩하기 위해 XVectorIO객체를 생성
XVectorIO VectorIO = new XVectorIO();
String strError = "";
if (VectorIO.Initialize(out strError) == false)
{
return;
}
// 2. 벡터에 대한 좌표 시스템을 설정하기 위해 XSpatialReference객체를 생성하고 좌표계를 설정.
// dxf등의 벡터파일은 좌표 시스템이 부여 되어 있지 않고, shp의 경우도 없는 경우가 존재하기 때문에 외부에서 생성하여 입력해야됨.
XSpatialReference srIn = new XSpatialReference();
srIn.importFromEPSG(40055); // Korea TM Central belt
// 3. 파일경로를 설정하고 XVectorIO객체를 이용하여 객체를 로딩.
// 로딩된 객체는 XftDataSource객체로 반환됨.
String strFilePathLoad = "D:SampleVector_Samplesample.shp";
XftDataSource vectorDS = VectorIO.LoadFile(strFilePathLoad, out strError, ref srIn);
// 4. XftDataSource로부터 변환하여 담아둘 Scene 컨테이너를 생성.
XScene scene = new XScene();
// 5. XftFeature객체로부터 XscObj객체로 전환 및 활용.
String msg = "";
for (int k = 0; k < vectorDS.NumLayer; k++)
{
// 6. XftDataSource로부터 XftFeatureLayer를 꺼내기.
XftFeatureLayer layer = vectorDS.GetLayerAt(k);
for (int j = 0; j < layer.NumFeature; j++)
{
// 7. XftFeatureLayer로부터 XftFeature를 꺼내기.
XftFeature feature = layer.GetFeatureAt(j);
// 8. XftFeature로부터 Scene Object로 변환하기.
XscObj obj = Xsc.Feature2SceneObj(feature);
scene.AddNode(j, obj);
// 9. Scene의 Type을 구분하고 필요한 객체의 요소만을 처리.
if (obj.GetTypeName() != "XscPolygon") continue;
// 10. 객체를 형변환 수행.
XscPolygon scObj = (XscPolygon)obj;
// Do Something....
// 11. 변환된 Scene객체의 속성에 대한 갯수를 얻는다.
// 데이터베이스의 Field의 개념으로 생각하면 된다. Field의 갯수만큼 돌면서 Field의 각 값을 얻는다.
int fieldcount = feature.NumField;
for (int i = 0; i < fieldcount; i++)
{
string name = feature.GetFieldName(i); // Field의 이름 얻기
// Field의 Type을 string으로 비교하여 Type구분.
eFieldType type = feature.GetFieldType(i);
// 객체를 형변환 수행.
if (type == eFieldType.FieldReal)
{
string temp;
double value = feature.GetFieldAsDouble(i);
temp = name + " : " + value.ToString("f4") + "n";
msg += temp;
}
else if (type == eFieldType.FieldString)
{
string temp;
string value = feature.GetFieldAsString(i);
// Do something....
}
else if (type == eFieldType.FieldInteger)
{
string temp;
int value = feature.GetFieldAsInteger(i);
// Do something....
}
else
{
// Do something....
}
}
}
}
// 12. 객체의 좌표 시스템 변환하기
XSpatialReference srOut = new XSpatialReference();
srOut.SetWellKnownGeogCS("WGS84");
scene.SR = srIn;
XScene sceneConvert = XScene.Convert(scene, srOut);
// 13. Scene객체를 XML 포맷으로 저장하기
string strExt = Path.GetExtension(strFilePathLoad);
string strPath = strFilePathLoad.Substring(0, strFilePathLoad.Length - strExt.Length);
strPath += ".sml";
XScene.SaveScene(sceneConvert, strPath, null);
// 1. 벡터를 로딩하기 위해 XVectorIO객체를 생성
XVectorIO VectorIO = new XVectorIO();
String strError = "";
if (VectorIO.Initialize(out strError) == false)
{
return;
}
// 2. 벡터에 대한 좌표 시스템을 설정하기 위해 XSpatialReference객체를 생성하고 좌표계를 설정.
// dxf등의 벡터파일은 좌표 시스템이 부여 되어 있지 않고, shp의 경우도 없는 경우가 존재하기 때문에 외부에서 생성하여 입력해야됨.
XSpatialReference srIn = new XSpatialReference();
srIn.importFromEPSG(40055); // Korea TM Central belt
// 3. 파일경로를 설정하고 XVectorIO객체를 이용하여 객체를 로딩.
// 로딩된 객체는 XftDataSource객체로 반환됨.
String strFilePathLoad = "D:SampleVector_Samplesample.shp";
XftDataSource vectorDS = VectorIO.LoadFile(strFilePathLoad, out strError, ref srIn);
// 4. XftDataSource로부터 변환하여 담아둘 Scene 컨테이너를 생성.
XScene scene = new XScene();
// 5. XftFeature객체로부터 XscObj객체로 전환 및 활용.
String msg = "";
for (int k = 0; k < vectorDS.NumLayer; k++)
{
// 6. XftDataSource로부터 XftFeatureLayer를 꺼내기.
XftFeatureLayer layer = vectorDS.GetLayerAt(k);
for (int j = 0; j < layer.NumFeature; j++)
{
// 7. XftFeatureLayer로부터 XftFeature를 꺼내기.
XftFeature feature = layer.GetFeatureAt(j);
// 8. XftFeature로부터 Scene Object로 변환하기.
XscObj obj = Xsc.Feature2SceneObj(feature);
scene.AddNode(j, obj);
// 9. Scene의 Type을 구분하고 필요한 객체의 요소만을 처리.
if (obj.GetTypeName() != "XscPolygon") continue;
// 10. 객체를 형변환 수행.
XscPolygon scObj = (XscPolygon)obj;
// Do Something....
// 11. 변환된 Scene객체의 속성에 대한 갯수를 얻는다.
// 데이터베이스의 Field의 개념으로 생각하면 된다. Field의 갯수만큼 돌면서 Field의 각 값을 얻는다.
int fieldcount = feature.NumField;
for (int i = 0; i < fieldcount; i++)
{
string name = feature.GetFieldName(i); // Field의 이름 얻기
// Field의 Type을 string으로 비교하여 Type구분.
eFieldType type = feature.GetFieldType(i);
// 객체를 형변환 수행.
if (type == eFieldType.FieldReal)
{
string temp;
double value = feature.GetFieldAsDouble(i);
temp = name + " : " + value.ToString("f4") + "n";
msg += temp;
}
else if (type == eFieldType.FieldString)
{
string temp;
string value = feature.GetFieldAsString(i);
// Do something....
}
else if (type == eFieldType.FieldInteger)
{
string temp;
int value = feature.GetFieldAsInteger(i);
// Do something....
}
else
{
// Do something....
}
}
}
}
// 12. 객체의 좌표 시스템 변환하기
XSpatialReference srOut = new XSpatialReference();
srOut.SetWellKnownGeogCS("WGS84");
scene.SR = srIn;
XScene sceneConvert = XScene.Convert(scene, srOut);
// 13. Scene객체를 XML 포맷으로 저장하기
string strExt = Path.GetExtension(strFilePathLoad);
string strPath = strFilePathLoad.Substring(0, strFilePathLoad.Length - strExt.Length);
strPath += ".sml";
XScene.SaveScene(sceneConvert, strPath, null);
전체 0개
번호 | 제목 | 작성자 | 작성일 | 조회 |
17 |
[NCC] Static 함수를 이용한 다양한 좌표계 변환
pixoneer
2016.11.19
3067
|
pixoneer | 2016.11.19 | 3067 |
16 |
[NCC] 좌표계 변환 ( Geographic->UTM 변환)
pixoneer
2016.11.19
3504
|
pixoneer | 2016.11.19 | 3504 |
15 |
[NCC] XSpatialReference클래스에 좌표 시스템 설정하기
pixoneer
2016.11.19
2645
|
pixoneer | 2016.11.19 | 2645 |
14 |
[NXDL] 타겟지점, 센서의 고도, 센서자세를 이용하여 센서의 위치 추정
pixoneer
2016.11.19
2946
|
pixoneer | 2016.11.19 | 2946 |
13 |
[NXDL] ECEF좌표계로부터 Lat/Lon(위경도)좌표계로 변환하기
pixoneer
2016.11.19
3404
|
pixoneer | 2016.11.19 | 3404 |
12 |
[NXDL] 위경도 좌표계로부터 ECEF좌표계로 변환하기
pixoneer
2016.11.19
2885
|
pixoneer | 2016.11.19 | 2885 |
11 |
[NXDL] 이미지의 통계값을 이용해 Gaussian 95%에 해당하는 최대/최소값 구하기
pixoneer
2016.11.19
2070
|
pixoneer | 2016.11.19 | 2070 |
10 |
[NXDL] 지구상에 센서 지점로부터 특정거리상에 존재하는 타원체상의 지점 계산
pixoneer
2016.11.19
2399
|
pixoneer | 2016.11.19 | 2399 |
9 |
[NXDL] 지구상의 특정 2개의 지점간 방위각과 거리 구하기(CalArcDistAndAngle함수 사용)
pixoneer
2016.11.19
2362
|
pixoneer | 2016.11.19 | 2362 |
8 |
[NXDL] 지구상의 특정 기준점으로부터 임의의 방위각과 특정 거리에 존재하는 지점 계산(CalcPosByBearingAndDist 사용)
pixoneer
2016.11.19
2082
|
pixoneer | 2016.11.19 | 2082 |