質問編集履歴

5

2021/12/15 17:12

投稿

xail2222
xail2222

スコア1508

test CHANGED
File without changes
test CHANGED
@@ -2,17 +2,17 @@
2
2
 
3
3
 
4
4
 
5
- .Net FrameworkでShapeファイルの属性の型を変更したい。
5
+ .Net Frameworkでシェープファイルの属性の型を変更したい。
6
6
 
7
7
 
8
8
 
9
9
  以下の質問でpythonで実施していたことを、.Net Frameworkでやるにはどうしたらいいかという質問です。
10
10
 
11
- [Shapeファイルのdbfのみ修正する方法](https://teratail.com/questions/339561)
11
+ [シェープファイルのdbfのみ修正する方法](https://teratail.com/questions/339561)
12
-
13
-
14
-
12
+
13
+
14
+
15
- 元のShapeファイルを変更するか、新たに作成するのでも構いません。
15
+ 元のシェープファイルを変更するか、新たに作成するのでも構いません。
16
16
 
17
17
 
18
18
 

4

2021/12/15 17:12

投稿

xail2222
xail2222

スコア1508

test CHANGED
@@ -1 +1 @@
1
- .NetでShapeファイルの属性の型を変更したい。
1
+ .Netでシェープファイルの属性の型を変更したい。
test CHANGED
File without changes

3

一部要件を満たす方法が判明したため追記

2021/12/15 17:11

投稿

xail2222
xail2222

スコア1508

test CHANGED
File without changes
test CHANGED
@@ -92,6 +92,232 @@
92
92
 
93
93
 
94
94
 
95
+ ### 追記
96
+
97
+ [VB.NETでgdal/ogrを使ってみる。 [Chapter 1]](https://blog.godo-tys.jp/2012/10/28/548/)
98
+
99
+
100
+
101
+ を参考にして
102
+
103
+ ・実数型の小数点以下桁数の変更
104
+
105
+ ・文字列型の桁数の変更
106
+
107
+ ・列名の変更
108
+
109
+ は以下のようにして出来たのではないかと思います。
110
+
111
+
112
+
113
+ ```VBNet
114
+
115
+ Imports System.IO
116
+
117
+ Imports OSGeo.OGR
118
+
119
+
120
+
121
+ Public Class Form1
122
+
123
+ ' この部分はリンク先をほぼコピペです。 START
124
+
125
+ Private Function SetupGDALOGR() As Boolean
126
+
127
+
128
+
129
+ SetupGDALOGR = False
130
+
131
+
132
+
133
+ Dim strNewPath As String = Environment.GetEnvironmentVariable("PATH")
134
+
135
+ Dim gdalPath As String = "C:\Program Files"
136
+
137
+ Dim tmpPath As String = "c:\tmp"
138
+
139
+ Dim GDAL_CACHEMAX As String = "100000"
140
+
141
+
142
+
143
+ Dim info As New FileInfo(gdalPath)
144
+
145
+ If (info.Attributes And FileAttributes.Directory) > 0 Then
146
+
147
+ Dim oldPath As [String] = Environment.GetEnvironmentVariable("PATH")
148
+
149
+ Dim PATH2 As [String] = gdalPath & "\GDAL;" &
150
+
151
+ gdalPath & "\GDAL\gdalplugins;" &
152
+
153
+ gdalPath & "\GDAL\csharp;"
154
+
155
+
156
+
157
+ If Not strNewPath.Contains(PATH2) Then
158
+
159
+ strNewPath = PATH2 & ";" & strNewPath
160
+
161
+ Environment.SetEnvironmentVariable("PATH", strNewPath)
162
+
163
+ End If
164
+
165
+
166
+
167
+ Dim GDAL_DATA As [String] = gdalPath & "\GDAL\gdal-data"
168
+
169
+ Environment.SetEnvironmentVariable("\GDAL_DATA", GDAL_DATA)
170
+
171
+ OSGeo.GDAL.Gdal.SetConfigOption("\GDAL_DATA", GDAL_DATA)
172
+
173
+
174
+
175
+ Dim GDAL_DRIVER_PATH As [String] = gdalPath & "\GDAL\gdalplugins"
176
+
177
+ Environment.SetEnvironmentVariable("GDAL_DRIVER_PATH", GDAL_DRIVER_PATH)
178
+
179
+ OSGeo.GDAL.Gdal.SetConfigOption("GDAL_DRIVER_PATH", GDAL_DRIVER_PATH)
180
+
181
+
182
+
183
+
184
+
185
+ OSGeo.OGR.Ogr.RegisterAll()
186
+
187
+ OSGeo.GDAL.Gdal.AllRegister()
188
+
189
+
190
+
191
+ SetupGDALOGR = True
192
+
193
+
194
+
195
+ End If
196
+
197
+
198
+
199
+ End Function
200
+
201
+ ' この部分はリンク先をほぼコピペです。 END
202
+
203
+
204
+
205
+ Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
206
+
207
+ SetupGDALOGR()
208
+
209
+ End Sub
210
+
211
+
212
+
213
+ Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
214
+
215
+
216
+
217
+ Dim p_Ds_From As DataSource = Ogr.Open("C:\Work\Shape\sample.shp", 0)
218
+
219
+ Dim p_Layer_From As Layer = p_Ds_From.GetLayerByIndex(0)
220
+
221
+
222
+
223
+ Dim p_Drv As Driver = Ogr.GetDriverByName("ESRI Shapefile")
224
+
225
+ Dim p_Ds_To As DataSource = p_Drv.CreateDataSource("C:\Work\Shape\sample2.shp", Nothing)
226
+
227
+
228
+
229
+ Dim p_Layer_To As Layer = p_Ds_To.CreateLayer("layer", p_Layer_From.GetSpatialRef, p_Layer_From.GetGeomType, Nothing)
230
+
231
+
232
+
233
+
234
+
235
+ Dim p_Layer_Defn_From As FeatureDefn = p_Layer_From.GetLayerDefn()
236
+
237
+
238
+
239
+
240
+
241
+ For p_Ind As Long = 0 To p_Layer_Defn_From.GetFieldCount - 1
242
+
243
+ Dim p_Field_Defn As FieldDefn
244
+
245
+ p_Field_Defn = p_Layer_Defn_From.GetFieldDefn(p_Ind)
246
+
95
- ネット検索するとgdal使えば小数点以下桁数とか文字列桁数の設定は
247
+ ' ここ列の定義変更。名前の変更や文字桁数の変更、小数点以下桁数の変更が実現出来ました。
248
+
96
-
249
+ If p_Field_Defn.GetName = "XXXX" Then
250
+
251
+ p_Field_Defn.SetWidth(10)
252
+
253
+ ElseIf p_Field_Defn.GetName = "XXXX2" Then
254
+
255
+ p_Field_Defn.SetName("YYYY2")
256
+
257
+ p_Field_Defn.SetWidth(10)
258
+
259
+ p_Field_Defn.SetPrecision(1)
260
+
261
+
262
+
263
+ End If
264
+
265
+
266
+
267
+ p_Layer_To.CreateField(p_Field_Defn, 1)
268
+
269
+
270
+
271
+
272
+
273
+ Next
274
+
275
+
276
+
277
+ Dim p_Feature_From As Feature
278
+
279
+ p_Feature_From = p_Layer_From.GetNextFeature()
280
+
281
+
282
+
283
+
284
+
285
+ Do While p_Feature_From IsNot Nothing
286
+
287
+ p_Layer_To.CreateFeature(p_Feature_From)
288
+
289
+ p_Feature_From = p_Layer_From.GetNextFeature()
290
+
291
+ Loop
292
+
293
+
294
+
295
+ p_Ds_From.Dispose()
296
+
297
+ p_Ds_To.Dispose()
298
+
299
+
300
+
301
+ End Sub
302
+
303
+ End Class
304
+
305
+
306
+
307
+ ```
308
+
309
+
310
+
311
+ 尚、環境構築としては、上記のリンクに書いてある通り
312
+
313
+ [gisinternals Support Site](https://www.gisinternals.com/)
314
+
315
+ のHPにあるgdal-303-1928-x64-core.msiをインストールして
316
+
317
+ 参照設定にgdal_csharp.dll,ogr_csharp.dll,osr_csharp.dllを設定しました。
318
+
319
+
320
+
97
- 出来そうな感じしたのですが、使い方が今所分りせん
321
+ 列順序変更なのですが、ようにするかだ不明です
322
+
323
+ gdalでやる方法や、他の方法をご存知であれば教えて下さい。

2

gdalについて記載

2021/12/14 12:33

投稿

xail2222
xail2222

スコア1508

test CHANGED
File without changes
test CHANGED
@@ -89,3 +89,9 @@
89
89
  列名の変更くらいなら、出来そうな気もしますが
90
90
 
91
91
  小数点以下桁数の変更や文字列型の桁数の変更は、どうやればいいかわかりません。
92
+
93
+
94
+
95
+ ネットで検索するとgdalを使えば小数点以下桁数とか文字列の桁数の設定は
96
+
97
+ 出来そうな感じはしたのですが、使い方が今の所分りません。

1

出来ないことを追記

2021/12/12 04:45

投稿

xail2222
xail2222

スコア1508

test CHANGED
File without changes
test CHANGED
@@ -81,3 +81,11 @@
81
81
  tolayer.Save();
82
82
 
83
83
  ```
84
+
85
+
86
+
87
+ ただ、型の変更が出来ません。
88
+
89
+ 列名の変更くらいなら、出来そうな気もしますが
90
+
91
+ 小数点以下桁数の変更や文字列型の桁数の変更は、どうやればいいかわかりません。