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 import sys
32
33 from osgeo import gdal
34 from osgeo import ogr
35 from osgeo import osr
36
37
39 print('Usage: gcps2vec.py [-of <ogr_drivername>] [-p] <raster_file> <vector_file>')
40 sys.exit(1)
41
42
44 out_format = 'GML'
45 in_file = None
46 out_file = None
47 pixel_out = 0
48
49 gdal.AllRegister()
50 argv = gdal.GeneralCmdLineProcessor(argv)
51 if argv is None:
52 sys.exit(0)
53
54
55 i = 1
56 while i < len(argv):
57 arg = argv[i]
58
59 if arg == '-of':
60 i = i + 1
61 out_format = argv[i]
62
63 elif arg == '-p':
64 pixel_out = 1
65
66 elif in_file is None:
67 in_file = argv[i]
68
69 elif out_file is None:
70 out_file = argv[i]
71
72 else:
73 Usage()
74
75 i = i + 1
76
77 if out_file is None:
78 Usage()
79
80
81
82
83 ds = gdal.Open(in_file)
84 if ds is None:
85 print('Unable to open %s' % in_file)
86 sys.exit(1)
87
88 gcp_srs = ds.GetGCPProjection()
89 gcps = ds.GetGCPs()
90
91 ds = None
92
93 if gcps is None or not gcps:
94 print('No GCPs on file %s!' % in_file)
95 sys.exit(1)
96
97
98
99
100
101 drv = ogr.GetDriverByName(out_format)
102 if drv is None:
103 print('No driver named %s available.' % out_format)
104 sys.exit(1)
105
106 ds = drv.CreateDataSource(out_file)
107
108 if pixel_out == 0 and gcp_srs != "":
109 srs = osr.SpatialReference()
110 srs.ImportFromWkt(gcp_srs)
111 else:
112 srs = None
113
114 if pixel_out == 0:
115 geom_type = ogr.wkbPoint25D
116 else:
117 geom_type = ogr.wkbPoint
118
119 layer = ds.CreateLayer('gcps', srs, geom_type=geom_type)
120
121 if pixel_out == 0:
122 fd = ogr.FieldDefn('Pixel', ogr.OFTReal)
123 layer.CreateField(fd)
124
125 fd = ogr.FieldDefn('Line', ogr.OFTReal)
126 layer.CreateField(fd)
127 else:
128 fd = ogr.FieldDefn('X', ogr.OFTReal)
129 layer.CreateField(fd)
130
131 fd = ogr.FieldDefn('Y', ogr.OFTReal)
132 layer.CreateField(fd)
133
134 fd = ogr.FieldDefn('Z', ogr.OFTReal)
135 layer.CreateField(fd)
136
137 fd = ogr.FieldDefn('Id', ogr.OFTString)
138 layer.CreateField(fd)
139
140 fd = ogr.FieldDefn('Info', ogr.OFTString)
141 layer.CreateField(fd)
142
143
144
145
146
147 for gcp in gcps:
148
149 feat = ogr.Feature(layer.GetLayerDefn())
150
151 if pixel_out == 0:
152 geom = ogr.Geometry(geom_type)
153 feat.SetField('Pixel', gcp.GCPPixel)
154 feat.SetField('Line', gcp.GCPLine)
155 geom.SetPoint(0, gcp.GCPX, gcp.GCPY, gcp.GCPZ)
156 else:
157 geom = ogr.Geometry(geom_type)
158 feat.SetField('X', gcp.GCPX)
159 feat.SetField('Y', gcp.GCPY)
160 feat.SetField('Z', gcp.GCPZ)
161 geom.SetPoint(0, gcp.GCPPixel, gcp.GCPLine)
162
163 feat.SetField('Id', gcp.Id)
164 feat.SetField('Info', gcp.Info)
165
166 feat.SetGeometryDirectly(geom)
167 layer.CreateFeature(feat)
168
169 feat = None
170 ds.Destroy()
171
172
173 if __name__ == '__main__':
174 sys.exit(main(sys.argv))
175