2020/8/1 (土)

コネタ/テキストファイルを適当に間引く

はじめに

大量のテキストデータ(csvとかとか)をランダムに間引きたい時ってありますよね?

答えの例

概ね 1/N にランダムに絞りたいときはこうするのが手っ取り早いです

cat "テキストファイル名"  | perl -ne 'print if !int(rand N)' >"出力ファイル名"

軽く試してみるとこんな感じです

# 1から10,000までの連番を、概ね1/1,000 に間引く
$ seq 10000 | perl -ne 'print if !int(rand 1000)' | nl
     1	535
     2	1211
     3	1320
     4	1806
     5	3102
     6	4458
     7	5034
     8	5256
     9	5959
    10	6208
    11	6575
    12	7511
    13	9169
    14	9940

別解の例

/dev/urandom を使って概ね 1/1000 に間引く例です

tr -dc '0-9' </dev/urandom | fold -w3 | head -n $(wc -l <入力ファイル名) | paste -d, - 入力ファイル名 | sed -n '/^000/{s/^....//;p}'

100,000 までのファイルを作り抽出した例です
Macなので tr の前に LANG=C がついてたり、sed -> gsed とか変ですが気にしないで雰囲気だけ掴んで下さい

$  seq 100000 >/tmp/dummy.txt

$ LANG=C tr -dc '0-9' </dev/urandom | fold -w3 | head -n$(wc -l </tmp/dummy.txt) | paste -d, - /tmp/dummy.txt | gsed -n '/^000/{s/^....//;p}' | nl
     1  928
(略)
    88  98956

2020/7/31 (金)

GISっ子/コンテナでshp2pgsql

はじめに

空間データベース · GIS実習オープン教材
「PostGIS x.x Shapefile and DBF Loader Exporter」を使わずに shp2qgsql で代用する手順です

PosgGIS自体もコンテナで起動してしまいます

PostGIS, pgAdmin, (と Adminer)を立ち上げる

PostGISワークショップをコンテナで試す の手順をそのまま使います

# Pod(コンテナ)起動
wget -qO docker-compose.yml 'https://gist.github.com/kemasoft-gist/4195ef7d8dd2861e9fe8a8d583cfe113/raw'
podman-compose up -d

id / pw はいずれも postgres / example です

ここまで来たら 空間データベース · GIS実習オープン教材 の「空間解析機能の追加」までを手順どおりに進めます

PostGISに接続するコンテナを起動

ホストのファイルを操作できるよう、ここではカレントディレクトリをコンテナ内の /mnt にマウントして起動します

# ホストのカレントディレクトリに shp ファイルがある
$ ls
README.md    station.csv  station.prj  station.shp  tokyo.cpg  tokyo.prj  tokyo.shp
station.cpg  station.dbf  station.qpj  station.shx  tokyo.dbf  tokyo.qpj  tokyo.shx


# コンテナを起動し、/mnt のファイルを確認
$ podman run --rm -it -v .:/mnt postgis:12-3.0 bash
root@c119a1ba1f99:/# ls /mnt
README.md    station.csv  station.prj  station.shp  tokyo.cpg  tokyo.prj  tokyo.shp
station.cpg  station.dbf  station.qpj  station.shx  tokyo.dbf  tokyo.qpj  tokyo.shx

shp2pgsqlコマンドをインストール

shp2pgsql は postgis パッケージにあります

root@c119a1ba1f99:/# apt update
Get:1 http://deb.debian.org/debian buster InRelease [121 kB]
(略)
All packages are up to date.

root@c119a1ba1f99:/# apt -y install postgis
Reading package lists... Done
(略)
Setting up postgis (3.0.1+dfsg-4.pgdg100+1) ...
Setting up postgis-doc (3.0.1+dfsg-4.pgdg100+1) ...

shpファイルを新しいテーブルにインポート

# /mnt に移動
root@c119a1ba1f99:/# cd /mnt

# tokyo.shp をインポート
#   -h 192.168.10.151 : PosgGISのIPアドレス(=母艦のIPアドレス)
#   -d tokyo          : データベース名(GIS実習オープン教材の場合は tokyo)
root@c119a1ba1f99:/mnt# shp2pgsql -s 2451 tokyo.shp   public.tokyo   | psql -h 192.168.10.151 -d tokyo -U postgres
Field area is an FTDouble with width 11 and precision 3
Field density is an FTDouble with width 11 and precision 3
Shapefile type: Polygon
Postgis type: MULTIPOLYGON[2]
SET
SET
BEGIN
CREATE TABLE
ALTER TABLE
                   addgeometrycolumn
-------------------------------------------------------
 public.tokyo.geom SRID:2451 TYPE:MULTIPOLYGON DIMS:2
(1 row)

INSERT 0 1
INSERT 0 1
(略)
INSERT 0 1
COMMIT
ANALYZE

# station.shp をインポート
#   -h 192.168.10.151 : PosgGISのIPアドレス(=母艦のIPアドレス)
#   -d tokyo          : データベース名(GIS実習オープン教材の場合は tokyo)
root@c119a1ba1f99:/mnt# shp2pgsql -s 2451 station.shp public.station | psql -h 192.168.10.151 -d tokyo -U postgres
Shapefile type: Point
Postgis type: POINT[2]
SET
SET
BEGIN
CREATE TABLE
ALTER TABLE
                addgeometrycolumn
--------------------------------------------------
 public.station.geom SRID:2451 TYPE:POINT DIMS:2
(1 row)

INSERT 0 1
INSERT 0 1
(略)
INSERT 0 1
COMMIT
ANALYZE

# コンテナ停止
root@c119a1ba1f99:/mnt# exit
exit

一気に流す方法

podman run でシェルを起動し、ヒアドキュメントでシェルスクリプトを流せばOK

podman run --rm -i -v .:/mnt postgis:12-3.0 bash -x <<'...'
apt update
apt -y install postgis
shp2pgsql -s 2451 /mnt/tokyo.shp   public.tokyo   | psql -h 192.168.10.151 -d tokyo -U postgres
shp2pgsql -s 2451 /mnt/station.shp public.station | psql -h 192.168.10.151 -d tokyo -U postgres
...

おまけ:new_geomカラムの追加

空間データベース · GIS実習オープン教材の「空間結合」の冒頭部分でエラーになると思います

CREATE INDEX new_geom ON station USING GiST(new_geom);を実行し、空間インデックスを作成する。

これを回避するには、予め new_geom カラムを追加すればOKです

ALTER TABLE station ADD new_geom geometry(Point,2451);

その後 CREATE INDEX new_geom ON station USING GiST(new_geom); します

2020/7/30 (木)

オープンデータの鮮度

以前、電子国土基本図(地名情報)「住居表示住所」 | 国土地理院 のデータを使って DPZのあの地図 を作ったところ、埼玉県越谷市付近がとてもヘンテコな地図になってしまい、おかしいなぁと思ってました

で、改めて電子国土基本図(地名情報)「住居表示住所」 | 国土地理院の更新履歴を見たところ、埼玉県越谷市は2012年のデータのままでした

国土交通省の 位置参照情報 ダウンロードサービス のほうが断然鮮度が高くて有用ですね


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS