以下、goc_KAWASAKI (1).csv を tsubame_db に 新規テーブルとして取り込み、X_CODE(経度)・Y_CODE(緯度) から PostGIS の geometry(Point) 列 the_geom を作る手順です。
(このCSVは cp932/Shift-JIS系 の可能性が高いので、その前提で書きます。ヘッダは PREF, CITY, PREF_NAME, CITY_NAME, S_NAME, JINKO, SETAI, X_CODE, Y_CODE, the_geom でした。)
1) 事前確認(PostGISが有効か)
spatial_ref_sys が見えているので通常はPostGIS導入済みですが、念のため。
2) 取り込み先テーブルを作成
テーブル名は例として goc_kawasaki にしています(任意で変更)。
ポイント:
-
CSV側に the_geom 列が存在するが、中身は空の想定
-
COPY時に空文字を NULL 扱いにできれば、最初から geometry 型で受けられる
-
まずは素直に the_geom geometry(Point,4326) を作っておき、空はNULLで入れる運用にする
※ SRID は、経度緯度(WGS84)前提で 4326 にしています。
3) CSVを取り込む(\copy 推奨)
psql で \copy を使うと「psqlを実行しているマシンのローカルファイル」を読めます。
いまのあなたの状況(Ubuntuでpsql実行)なら、そのUbuntu上にCSVを置いてパス指定が簡単です。
3-1) CSVをUbuntu上の分かりやすい場所へ
例:
3-2) 取り込み(Shift-JIS系)
psqlで:
4) the_geom を X_CODE/Y_CODE から生成(空欄を埋める)
CSVの the_geom が空で入っている前提で、経度緯度から Point を作って入れます。
念のため件数確認:
5) 空間インデックス(GiST)を作る(将来のPostGIS利用を見据えて)
6) 動作確認(例:近傍検索ができるか)
例として「宮前区役所あたり」の点を入れて、近い順に出す例:
tsubame_db=# select * from goc_kawasaki ;
tsubame_db=# SELECT s_name, jinko, setai,
tsubame_db-# ST_Distance(the_geom::geography, ST_SetSRID(ST_MakePoint(139.588, 35.585), 4326)::geography) AS dist_m
tsubame_db-# FROM public.goc_kawasaki
tsubame_db-# WHERE the_geom IS NOT NULL
tsubame_db-# ORDER BY dist_m
MIT tsubame_db-# LIMIT 10;
s_name | jinko | setai | dist_m
--------------+-------+-------+--------------
宮前平一丁目 | 3251 | 1782 | 96.2444246
宮前平三丁目 | 5415 | 2224 | 320.07881687
馬絹一丁目 | 4139 | 1978 | 399.75807695
宮崎二丁目 | 4705 | 2500 | 478.52073818
宮崎一丁目 | 3832 | 1867 | 481.01455816
馬絹二丁目 | 1499 | 683 | 575.12586008
小台二丁目 | 4653 | 2200 | 637.42953694
宮前平二丁目 | 4857 | 1838 | 650.81722322
宮崎五丁目 | 2053 | 992 | 707.74457766
宮崎三丁目 | 4114 | 1908 | 757.94757272
(10 rows)
tsubame_db=#
つまずきやすい点(最短で切り分け)
-
\copy のパスは「psqlを動かしている側」のファイルパス。サーバ側 COPY とは違う
-
文字化け・取り込み失敗はエンコーディング起因が多い(SJIS / WIN932 を切替)
-
the_geom をCSVから直接入れる運用にしたい場合は、CSV側をWKT(例 POINT(139.58 35.58))にして取り込む設計に変えるのが確実
必要なら、このCSVの列型(JINKO/SETAI が空文字を含む等)に合わせて、**stagingテーブル(全部textで受ける→型変換して本テーブルへINSERT)**の安全手順も提示できます。