実行環境 インポート時にgeomety_columnsspatial_ref_sysテーブルも作られる 空間参照系カタログのspatial_ref_sys1行しかない(一昨日) 空間参照系が異なるシェープファイルをインポート ①(昨日、事前準備まで) 同じ空間参照系のシェープファイルを追加インポート(1012日)
Contents


投入先データベース作成(文字コードUTF-8)

昨日、総務省統計局「地図で見る統計(統計GIS)」からダウンロードした空間参照系が異なる4つのシェープファイルを、ogr2ogrMySQL 5.7.8rcに投入してSRIDがどうなるか確認します。

まず投入先データベースをUTF-8で作成。というか、最初に文字コード無指定で作ったらインポートに失敗しました。自分の環境ではDBのデフォルト文字コードがLATIN
1になり、今回のシェープファイルは日本語を含むためらしく、DBを文字コードUTF-8で再作成したらすんなりインポートできました。
mysql> CREATE DATABASE estat CHARACTER SET utf8;


文字コード確認は ↓ こんな感じ。失敗例のLATIN
1の場合です。二つ目の画像が、今回投入するシェープファイルのデータで日本語がある所の例。DBFファイルをExcel2007で開けば分かります。
mysql> \u estat
Database changed

mysql> SELECT @@character_set_database;
+--------------------------+
| @@character_set_database |
+--------------------------+
| latin1                   |
+--------------------------+
1 row in set (0.00 sec)


↓ 参考まで、失敗した様子。最初はogr2ogrで文字コード関係のオプションなし、次にStack Exchange / Stack Overflowでのやり取りを参考に「--config SHAPE_ENCODING ""」を付けて実行してもやっぱり失敗しました(参考にした記事のリンクは画像の次)。あとコンソールのコードページを変えてみても同じで、最終的にDBの文字コードをUTF-8にして成功。(その様子は次項)


シェープファイルのDBFExcelで文字化けせず開けたので、文字コードは多分Shift JISだと思いますが、特段ogr2ogrコマンドで「Shift JIS → UTF-8」の指定とかは不要でした。ogr2ogrまたはMySQLへの接続ドライバがうまく処理してくれる模様。


インポート実行と結果 : SRIDは単純に1からの連番だった

101と同様、ogr2ogrを含むGDALのプログラムフォルダをカレントにしてogr2ogrを実行。0...10...と進捗のパーセントが出て、最後にdoneと表示されればインポート完了です。
$cd
D:\AppsPortable\GDAL\release-1500-gdal-1-11-1-mapserver-6-4-1\bin

$gdal\apps\ogr2ogr -progress -f "MySQL"
 MySQL:estat,user=root,password=******** R:\estat\XYSJC_h22ka01101.shp
# just one line actually

$gdal\apps\ogr2ogr -progress -f "MySQL"
 MySQL:estat,user=root,password=******** R:\estat\XYSWC_h22ka01101.shp
$gdal\apps\ogr2ogr -progress -f "MySQL"
 MySQL:estat,user=root,password=******** R:\estat\DDSJC_h22ka01101.shp
$gdal\apps\ogr2ogr -progress -f "MySQL"
 MySQL:estat,user=root,password=******** R:\estat\DDSWC_h22ka01101.shp


以下、インポート結果について。まずテーブル一覧を見ると ↓ 確かに4つ、シェープファイルと同名のテーブルができてました。
mysql> \u estat
Database changed

mysql> show tables;
+------------------+
| Tables_in_estat  |
+------------------+
| ddsjc_h22ka01101 |
| ddswc_h22ka01101 |
| geometry_columns |
| spatial_ref_sys  |
| xysjc_h22ka01101 |
| xyswc_h22ka01101 |
+------------------+
6 rows in set (0.00 sec)


各テーブルの行数は ↓ シェープファイルからのテーブルは同じ955行(空間参照系以外は同じデータなので当然)、DB内の空間データの所在などを記録するgeometry_columns4行、そして空間参照系カタログのはずのspatial_ref_sys4行。4つのシェープファイルの空間参照系だけが一行ずつ入っているっぽい。
SELECT table_name, table_rows
FROM information_schema.TABLES
WHERE table_schema = 'estat';

+------------------+------------+
| table_name       | table_rows |
+------------------+------------+
| ddsjc_h22ka01101 |        955 |
| ddswc_h22ka01101 |        955 |
| geometry_columns |          4 |
| spatial_ref_sys  |          4 |
| xysjc_h22ka01101 |        955 |
| xyswc_h22ka01101 |        955 |
+------------------+------------+
6 rows in set (0.00 sec)


geometry_columnsspatial_ref_sysを表示すると、確かにそうでした。SRIDが、一般的なEPSGコードとは無関係に1からの連番。単純にインポートした順に1から始まるので、DBが違えばSRIDの共通性はまずあり得ないということになります。
SELECT F_TABLE_NAME, F_GEOMETRY_COLUMN, SRID, TYPE
FROM geometry_columns;
+------------------+-------------------+------+---------+
| F_TABLE_NAME     | F_GEOMETRY_COLUMN | SRID | TYPE    |
+------------------+-------------------+------+---------+
| xysjc_h22ka01101 | SHAPE             |    1 | POLYGON |
| xyswc_h22ka01101 | SHAPE             |    2 | POLYGON |
| ddsjc_h22ka01101 | SHAPE             |    3 | POLYGON |
| ddswc_h22ka01101 | SHAPE             |    4 | POLYGON |
+------------------+-------------------+------+---------+
4 rows in set (0.00 sec)

SELECT SRID, AUTH_NAME, AUTH_SRID, LEFT(SRTEXT, 35)
FROM spatial_ref_sys;
+------+-----------+-----------+-------------------------------------+
| SRID | AUTH_NAME | AUTH_SRID | LEFT(SRTEXT, 35)                    |
+------+-----------+-----------+-------------------------------------+
|    1 | NULL      |      NULL | PROJCS["Japan_Zone_12",GEOGCS["GCS_ |
|    2 | NULL      |      NULL | PROJCS["JGD_2000_Japan_Zone_12",GEO |
|    3 | NULL      |      NULL | GEOGCS["GCS_Tokyo",DATUM["Tokyo",SP |
|    4 | NULL      |      NULL | GEOGCS["GCS_JGD_2000",DATUM["JGD_20 |
+------+-----------+-----------+-------------------------------------+
4 rows in set (0.00 sec)

さらに別のデータをインポートする時、spatial_ref_sysに空間参照系が既存ならそのSRIDを自動的に割り当ててくれそうですが、実際の様子は明日確認します(予定)。


PostGISと違い、生の空間データを見ても無意味

PostGISでは、単純なSELECT文でジオメトリを表示するとHEXEWKB(Extended Well Known Binary16進数表現、詳細は下記リンク参照)、要するに09、AFだけの並びが出てきます。最初の方にメタデータがあるので、時にはそれを見て何らか判断に使うことも可能。


一方MySQLの空間データは、単純なSELECT文で見ても ↓ 無意味でした。内部表現についてリファレンスマニュアルは「MySQLの内部では、WKT、WKBのどちらの形式とも異なる形式で幾何値が格納されます」
(バージョン5.6、サポートされる空間データ形式)という記述で詳細不明。
mysql> SELECT * FROM ddswc_h22ka01101 LIMIT 1 \G;

*************************** 1. row ***************************
   OGR_FID: 1
     SHAPE: ♦   ☺♥   ☺   ■   瞶鬪ェa@?V↑↕畿@$?♫Μa@7ャ 畿@→6?a
@▲@5!ÿ界@:ヲ^x岡a@ý/ヘ♫E@=ァ蒔a@↔ヒv溽界@)?ヲ蒔a@ZG黔迥E@ニ盞侮ェa@ヌ
ク竓E@ウケ謀蒔a@濺‚&ユ界@?薛穐a@^æ9「メ界@快‹9━a@D?界@エ「エ
€ェa@・<鰭マ界@§?q|ェa@1囲界@ナeg◄xェa@T睇?界@˜¶H、wェa@☻f皙レ界@穀[qw
ェa@z
ォ界@ルZwXェa@空
モ謚E@鍜þェa@Y纏(鼕E@ヤ5&'zェa@ケbユ∟E@♫fヲHzェa@◄ルE@ネ  T厭ェa@¶
§♠畿@þ▲~ェa@♥w 畿@瞶鬪ェa@?V↑↕畿@
      area: 34241.060
 perimeter: 754.716
  h22ka01_: 13586
h22ka01_id: 13585
       ken: 01
      city: 101
  ken_name: 北海道
sityo_name: 石狩振興局
  gst_name: 札幌市
  css_name: 中央区
     hcode: 8101
    kihon1: 7922
    dummy1: -
    kihon2: 15
  keycode1: 101792215
  keycode2: 1017922
area_max_f: M
    kigo_d: NULL
     n_ken: NULL
    n_city: NULL
      n_c1: 0
    kigo_e: NULL
    kigo_i: NULL
      tate: 0
       dir: 0
     hight: 50
    jikaku: 10
     nmoji: 6
      moji: 北二十二条西
   seq_no2: 13585
      ksum: 2
      csum: 2
     jinko: 29
     setai: 1
    x_code: 141.32838
    y_code: 43.08521
    kcode1: 7922-15
  key_code: 011017922
1 row in set (0.00 sec)

ERROR:
No query specified

まだmysql(クライアント)の使い方をよく知らず、クエリ結果を縦に積むのにとりあえず\gを付けて一応できましたが、最後に何かエラーが出ました。

最後に参考まで ↓ シェープファイルからできたテーブルの全列の情報。describeコマンド一つで楽です。よく見るとコードやIDの列が複数あって混沌としており、日本の行政GISデータならではという感じ。
mysql> describe ddsjc_h22ka01101;
+------------+---------------+------+-----+---------+----------------+
| Field      | Type          | Null | Key | Default | Extra          |
+------------+---------------+------+-----+---------+----------------+
| OGR_FID    | int(11)       | NO   | PRI | NULL    | auto_increment |
| SHAPE      | geometry      | NO   | MUL | NULL    |                |
| area       | double(19,3)  | YES  |     | NULL    |                |
| perimeter  | double(19,3)  | YES  |     | NULL    |                |
| h22ka01_   | decimal(6,0)  | YES  |     | NULL    |                |
| h22ka01_id | decimal(6,0)  | YES  |     | NULL    |                |
| ken        | varchar(2)    | YES  |     | NULL    |                |
| city       | varchar(3)    | YES  |     | NULL    |                |
| ken_name   | varchar(12)   | YES  |     | NULL    |                |
| sityo_name | varchar(22)   | YES  |     | NULL    |                |
| gst_name   | varchar(14)   | YES  |     | NULL    |                |
| css_name   | varchar(14)   | YES  |     | NULL    |                |
| hcode      | decimal(4,0)  | YES  |     | NULL    |                |
| kihon1     | varchar(4)    | YES  |     | NULL    |                |
| dummy1     | varchar(1)    | YES  |     | NULL    |                |
| kihon2     | varchar(2)    | YES  |     | NULL    |                |
| keycode1   | varchar(9)    | YES  |     | NULL    |                |
| keycode2   | varchar(9)    | YES  |     | NULL    |                |
| area_max_f | varchar(1)    | YES  |     | NULL    |                |
| kigo_d     | varchar(2)    | YES  |     | NULL    |                |
| n_ken      | varchar(2)    | YES  |     | NULL    |                |
| n_city     | varchar(3)    | YES  |     | NULL    |                |
| n_c1       | decimal(3,0)  | YES  |     | NULL    |                |
| kigo_e     | varchar(3)    | YES  |     | NULL    |                |
| kigo_i     | varchar(1)    | YES  |     | NULL    |                |
| tate       | decimal(1,0)  | YES  |     | NULL    |                |
| dir        | decimal(7,0)  | YES  |     | NULL    |                |
| hight      | decimal(5,0)  | YES  |     | NULL    |                |
| jikaku     | decimal(5,0)  | YES  |     | NULL    |                |
| nmoji      | decimal(2,0)  | YES  |     | NULL    |                |
| moji       | varchar(96)   | YES  |     | NULL    |                |
| seq_no2    | decimal(8,0)  | YES  |     | NULL    |                |
| ksum       | decimal(4,0)  | YES  |     | NULL    |                |
| csum       | decimal(4,0)  | YES  |     | NULL    |                |
| jinko      | decimal(10,0) | YES  |     | NULL    |                |
| setai      | decimal(10,0) | YES  |     | NULL    |                |
| x_code     | double(19,5)  | YES  |     | NULL    |                |
| y_code     | double(19,5)  | YES  |     | NULL    |                |
| kcode1     | varchar(7)    | YES  |     | NULL    |                |
| key_code   | varchar(11)   | YES  |     | NULL    |                |
+------------+---------------+------+-----+---------+----------------+
40 rows in set (0.00 sec)