回答編集履歴

4

バグの発生箇所を追記

2020/07/08 11:01

投稿

yymmt
yymmt

スコア1615

test CHANGED
@@ -36,13 +36,7 @@
36
36
 
37
37
 
38
38
 
39
- また下記のような記事を見つけました。
40
-
41
- - [ESRI不具合 BUG-000110602](https://support.esri.com/ja/bugs/nimbus/QlVHLTAwMDExMDYwMg==)
42
-
43
-
44
-
45
- [参考情報]
39
+ #### 参考情報
46
40
 
47
41
  C++から直接GDALのAPIを呼び出しても同じように`ュ`がデコードされません。下記のソースコードはシェープファイルにフィールド名メッシュをUTF-8指定で作成し、読み出すだけのプログラムです。
48
42
 
@@ -179,3 +173,21 @@
179
173
  メッシ�: 0xe3 0x83 0xa1 0xe3 0x83 0x83 0xe3 0x82 0xb7 0xe3
180
174
 
181
175
  ```
176
+
177
+
178
+
179
+ #### バグの発生箇所
180
+
181
+ UTF-8を指定した際のバグの発生箇所を特定しました。
182
+
183
+ [https://github.com/OSGeo/gdal/blob/master/gdal/ogr/ogrsf_frmts/shape/shapefil.h](https://github.com/OSGeo/gdal/blob/master/gdal/ogr/ogrsf_frmts/shape/shapefil.h)
184
+
185
+ の515行目で下記の定義がされています。
186
+
187
+ ```c
188
+
189
+ #define XBASE_FLDNAME_LEN_WRITE 10
190
+
191
+ ```
192
+
193
+ これはフィールド名に使えるのは10バイトであることを意味しています。「メッシュ」はUTF-8では12バイト(1文字3バイト)、SJISでは8バイト(1文字2バイト)になります。したがってUTF-8を指定した場合、10文字制限で最後の2バイトが切り取られ、文字列として不完全になりエラーとなっていました。

3

Windowsに対する追記

2020/07/08 11:01

投稿

yymmt
yymmt

スコア1615

test CHANGED
@@ -15,6 +15,34 @@
15
15
  ```
16
16
 
17
17
 
18
+
19
+ [追記]
20
+
21
+ Windowsでは上記の対策ではNGでしたので、シェープファイルを作るだけであれば下記の対応で可能です(根本的な解決ではないです)。上記の代わりにフィールド名を全て英語名に変換します。
22
+
23
+ ```python
24
+
25
+ df1.columns = ["mesh", "utilization", "type", "datetime", "geometry"]
26
+
27
+ ```
28
+
29
+ その上で書き出す際に`utf-8`を指定して下さい。
30
+
31
+ ```python
32
+
33
+ df1.to_file("土地利用区分追加.shp", driver="ESRI Shapefile", encoding="utf-8")
34
+
35
+ ```
36
+
37
+
38
+
39
+ また下記のような記事を見つけました。
40
+
41
+ - [ESRI不具合 BUG-000110602](https://support.esri.com/ja/bugs/nimbus/QlVHLTAwMDExMDYwMg==)
42
+
43
+
44
+
45
+ [参考情報]
18
46
 
19
47
  C++から直接GDALのAPIを呼び出しても同じように`ュ`がデコードされません。下記のソースコードはシェープファイルにフィールド名メッシュをUTF-8指定で作成し、読み出すだけのプログラムです。
20
48
 

2

tupleをリストに変更

2020/07/08 09:16

投稿

yymmt
yymmt

スコア1615

test CHANGED
@@ -6,9 +6,9 @@
6
6
 
7
7
  ```python
8
8
 
9
- columns = df1.columns
9
+ columns = df1.columns.tolist()
10
10
 
11
- columns[0] = 'メッシ'
11
+ columns[columns.index('メッシュ')] = 'メッシ'
12
12
 
13
13
  df1.columns = columns
14
14
 

1

typoを修正

2020/07/08 04:00

投稿

yymmt
yymmt

スコア1615

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- 内部で使用しているGDALのAPIに問題があるようです。調べた結果、メッシュの最後の文字`ュ`がNGです。最後の行の`f1.to_file()`の前に以下のコードを入れてメッシュを「メッシ」にすると動くと思います。
5
+ 内部で使用しているGDALのAPIに問題があるようです。調べた結果、メッシュの最後の文字`ュ`がNGです。最後の行の`df1.to_file()`の前に以下のコードを入れてメッシュを「メッシ」にすると動くと思います。
6
6
 
7
7
  ```python
8
8