시스템개발툴킷

제품화 분야 > 시스템개발툴킷 > XDL TIP

[NIO] 벡터파일(Shape파일) 로딩, 속성값 읽기, 좌표계 변환, XML파일로 저장하기

작성자
pixoneer
작성일
2016-11-21 09:40
조회
5029
         // 벡터파일(.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);
전체 0