GDAL: Chuyển đổi tệp tin Microsation về ArcGIS

Hai ngôn ngữ đề xuất là C# và Python, trong đó C# có khả năng nhắc hàm tốt hơn.
Chú ý: Để việc chuyển đổi được chính xác, đối tượng trên trên file dgn phải được nằm trên lớp riêng biệt và cũng 1 kiểu dữ liệu (điểm, đường hoặc vùng).

1. Hệ tọa độ.
Đối với 1 số định dạng tệp tin như *.shp, *.tab, Gdal có thể tự động lấy ra các thông số hệ tọa độ của tệp tin, nhưng với *.dgn thì không. Nên dựa vào việc thiết lập bản vẽ Microstation, ta sẽ tạo ra hệ tọa độ tương ứng:

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
using System;
using OSGeo.OSR;

namespace DG.Appcode.Gdal {
    public class OsrSpatialReference {

        private string[] _tinh;
        private double[] _prjZone;

        public OsrSpatialReference() {
            this._tinh = new [] {
                "LaiChau", "DienBien", "SonLa", "KienGiang", "CaMau", "LaoCai", "YenBai", "NgheAn", "PhuTho", "AnGiang",
                "ThanhHoa", "VinhPhuc", "DongThap", "CanTho", "BacLieu", "HauGiang", "HaNoi", "NinhBinh", "HaNam",
                "HaGiang", "HaiDuong", "HaTinh", "BacNinh", "HungYen", "ThaiBinh", "NamDinh", "TayNinh", "VinhLong",
                "SocTrang", "TraVinh", "CaoBang", "LongAn", "TienGiang", "BenTre", "HaiPhong", "HoChiMinh", "BinhDuong",
                "TuyenQuang", "HoaBinh", "QuangBinh", "QuangTri", "BinhPhuoc", "BacCan", "ThaiNguyen", "BacGiang",
                "ThuaThienHue", "LangSon", "KonTum", "QuangNinh", "DongNai", "BaRiaVungTau", "QuangNam", "LamDong",
                "DaNang", "QuangNgai", "NinhThuan", "KhanhHoa", "BinhDinh", "DakLak", "DacNong", "PhuYen", "GiaLai",
                "BinhThuan"
            };
            this._prjZone = new [] {
                103.0, 103.0, 104.0, 104.5, 104.5, 104.75, 104.75, 104.75, 104.75, 104.75, 105.0, 105.0, 105.0, 105.0,
                105.0, 105.0, 105.0, 105.0, 105.0, 105.5, 105.5, 105.5, 105.5, 105.5, 105.5, 105.5, 105.5, 105.5, 105.5,
                105.5, 105.75, 105.75, 105.75, 105.75, 105.75, 105.75, 105.75, 106.0, 106.0, 106.0, 106.25, 106.25,
                106.5, 106.5, 107.0, 107.0, 107.25, 107.5, 107.75, 107.75, 107.75, 107.75, 107.75, 107.75, 108.0, 108.25,
                108.25, 108.25, 108.5, 108.5, 108.5, 108.5, 108.5
            };
        }

        /// <summary>
        /// Tạo hệ tọa độ theo chuỗi định dạng projection Wkt
        /// </summary>
        /// <param name="prjWkt"></param>
        /// <returns></returns>
        public SpatialReference SpatialReferenceByWkt(string prjWkt) {
            return new SpatialReference(prjWkt);
        }

        /// <summary>
        /// Tạo hệ tọa độ VN200 theo từng tỉnh
        /// </summary>
        /// <param name="centralMeridian">Kinh tuyến trục: 104.75, 103, 105, ...</param>
        /// <param name="prjZone">Múi chiếu: 3 (hoặc 6)</param>
        /// <returns>VN_2000_UTM_Zone_48N múi 3(6) độ, không phân biệt tên tỉnh</returns>
        public SpatialReference SpatialReferenceVn2000(double centralMeridian, int prjZone) {
            if (prjZone != 3 && prjZone != 6) return null;

            string prjWkt = "";
            if (prjZone == 3)
                prjWkt = string.Format(
                    "PROJCS[\"VN_2000_UTM_Zone_48N\",GEOGCS[\"GCS_VN_2000\",DATUM[\"D_Vietnam_2000\",SPHEROID[\"WGS_1984\",6378137.0,298.257223563]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"False_Easting\",500000.0],PARAMETER[\"False_Northing\",0.0],PARAMETER[\"Central_Meridian\",{0}],PARAMETER[\"Scale_Factor\",0.9999],PARAMETER[\"Latitude_Of_Origin\",0.0],UNIT[\"Meter\",1.0]],VERTCS[\"Hon_Dau_1992\",VDATUM[\"Hon_Dau_1992\"],PARAMETER[\"Vertical_Shift\",0.0],PARAMETER[\"Direction\",1.0],UNIT[\"Meter\",1.0],AUTHORITY[\"EPSG\",5727]]",
                    centralMeridian);
            else if (prjZone == 6)
                prjWkt = string.Format(
                    "PROJCS[\"VN_2000_UTM_Zone_48N\",GEOGCS[\"GCS_VN_2000\",DATUM[\"D_Vietnam_2000\",SPHEROID[\"WGS_1984\",6378137.0,298.257223563]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"False_Easting\",500000.0],PARAMETER[\"False_Northing\",0.0],PARAMETER[\"Central_Meridian\",{0}],PARAMETER[\"Scale_Factor\",0.9996],PARAMETER[\"Latitude_Of_Origin\",0.0],UNIT[\"Meter\",1.0]],VERTCS[\"Hon_Dau_1992\",VDATUM[\"Hon_Dau_1992\"],PARAMETER[\"Vertical_Shift\",0.0],PARAMETER[\"Direction\",1.0],UNIT[\"Meter\",1.0],AUTHORITY[\"EPSG\",5727]]",
                    centralMeridian);

            SpatialReference srs = new SpatialReference(null);
            try {
                srs.ImportFromWkt(ref prjWkt);
                return srs;
            } catch (Exception) {
                return null;
            }
        }

        /// <summary>
        /// Tạo hệ tọa độ VN200 theo từng tỉnh
        /// </summary>
        /// <param name="tenTinh">Tên tỉnh: NgheAn, ThuaThienHue, HaNoi ... </param>
        /// <param name="prjZone">Múi chiếu: 3 (hoặc 6)</param>
        /// <returns>VN_2000_UTM_Zone_48N múi 3(6) độ, phân biệt theo tên tỉnh</returns>
        public SpatialReference SpatialReferenceVn2000(string tenTinh, int prjZone) {
            if (prjZone != 3 && prjZone != 6) return null;

            int i = System.Array.FindIndex(_tinh, item => item == tenTinh);
            double centralMeridian = _prjZone[i];
            string nameSpatial = string.Format("VN_2000_{0}_{1}deg", tenTinh, prjZone);

            string prjWkt = "";
            if (prjZone == 3)
                prjWkt = string.Format(
                    "PROJCS[\"{0}\",GEOGCS[\"GCS_VN_2000\",DATUM[\"D_Vietnam_2000\",SPHEROID[\"WGS_1984\",6378137.0,298.257223563]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"False_Easting\",500000.0],PARAMETER[\"False_Northing\",0.0],PARAMETER[\"Central_Meridian\",{1}],PARAMETER[\"Scale_Factor\",0.9999],PARAMETER[\"Latitude_Of_Origin\",0.0],UNIT[\"Meter\",1.0]],VERTCS[\"Hon_Dau_1992\",VDATUM[\"Hon_Dau_1992\"],PARAMETER[\"Vertical_Shift\",0.0],PARAMETER[\"Direction\",1.0],UNIT[\"Meter\",1.0],AUTHORITY[\"EPSG\",5727]]",
                    nameSpatial, centralMeridian);
            else if (prjZone == 6)
                prjWkt = string.Format(
                    "PROJCS[\"{0}\",GEOGCS[\"GCS_VN_2000\",DATUM[\"D_Vietnam_2000\",SPHEROID[\"WGS_1984\",6378137.0,298.257223563]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"False_Easting\",500000.0],PARAMETER[\"False_Northing\",0.0],PARAMETER[\"Central_Meridian\",{1}],PARAMETER[\"Scale_Factor\",0.9996],PARAMETER[\"Latitude_Of_Origin\",0.0],UNIT[\"Meter\",1.0]],VERTCS[\"Hon_Dau_1992\",VDATUM[\"Hon_Dau_1992\"],PARAMETER[\"Vertical_Shift\",0.0],PARAMETER[\"Direction\",1.0],UNIT[\"Meter\",1.0],AUTHORITY[\"EPSG\",5727]]",
                    nameSpatial, centralMeridian);

            SpatialReference srs = new SpatialReference(null);
            try {
                srs.ImportFromWkt(ref prjWkt);
                return srs;
            } catch (Exception) {
                return null;
            }
        }
    }
}


RUBY ROSE - RWBY
2. Đọc tệp tin Dgn.
Chú ý: Text được coi là đối tượng dạng điểm với tọa độ là tọa độ của chân kí tự đầu tiên, một đoạn text dài được trình bày thành nhiều dòng sẽ được coi mỗi dòng là 1 điểm, một khối Block sẽ được đọc riêng thành từng đối tượng nhỏ và gán vào kiểu đối tượng tương ứng.

Đăng nhận xét

1 Nhận xét

  1. bạn gì gì ơi, blog của bạn gì mà chán chết

    Trả lờiXóa