sprintfで小数をフォーマットする

2011/02/05 | PHPの基本

以前記事にした記憶があったけど、見つからないので再度メモ。小数をフォーマットするときの記述方法。

例えば「3.205」という数があったとする。これを「03.20500」と表示させるときの記述は以下のようになる。

printf(‘%08.5f’,3.205);

最初の0は「足りない部分は0で埋めましょう」の意味。

次の8は「文字は全部で8文字にしましょう」の意味。

次の.5fは「小数点以下は小数点第5位まで文字にしましょう」の意味(小数点を合わせれば6文字なので、必然的に整数部分は2文字)。

PostGISのGISオブジェクトの種類

2011/02/04 | PostgreSQL

これだけある。

POINT(0 0 0)

LINESTRING(0 0,1 1,1 2)

POLYGON((0 0 0,4 0 0,4 4 0,0 4 0,0 0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0))

MULTIPOINT(0 0 0,1 2 1)

MULTILINESTRING((0 0 0,1 1 0,1 2 1),(2 3 1,3 2 1,5 4 1))

MULTIPOLYGON(((0 0 0,4 0 0,4 4 0,0 4 0,0 0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0)),((-1 -1 0,-1 -2 0,-2 -2 0,-2 -1 0,-1 -1 0)))

GEOMETRYCOLLECTION(POINT(2 3 9),LINESTRING((2 3 4,3 4 5)))

PostGISですごい勘違いしていることに気がついた

2011/02/03 | PostgreSQL

PostGISなカラムに位置データを格納するとき、こんな具合のSQLを記述する。

INSERT INTO table (position) VALUES (GeomFromText(‘POINT(135 35)’,4326));

まずいつも間違えてしまうのは、座標を指定する方法。最初に経度で次に緯度。そして次に間違えるのが経度と緯度の区切り文字。これはカンマではなくてスペースなのだ。この2点はいつもよく間違える。

そしてようやく気づいたことがある。「今までこんなことも知らなくて、よくやってこれたね」って感じ。GeomFromTextというのは関数名だ(これはもちろん知っていた)。その引数は最初の引数が位置座標を表すテキストで、二つ目が座標系を表す数字だ(これも知っていた)。知らなかったのはGeomFromText関数の最初の引数についてだ。

この引数(シングルクォーテーションで囲まれたPOINT(135 35)の部分)はそのまま文字列なのだ。カッコでくくられているが紛れもない文字列だ。この場合は13文字の文字列。実は全然分かっていなくてPOINTという関数を使っているものだとばかり思っていた。すごく恥ずかしい。しかし、自分自身で気づけてよかった(でも確証がないのが悲しい)。

ちなみにPOINTという関数は実際に存在する。幾何型変換関数でpoint型の戻り値がある。いろいろ難しいね。

mysqldumpで「when using LOCK TABLES」と怒られる

2011/02/02 | MySQL

MySQLからデータをダンプする便利なコマンドmysqldump。テーブルがMyISAMなら問題ないけれど、innoDBなどトランザクション処理が絡む場合、単にmysqldump処理するとエラーメッセージが表示されてdumpできない。

Got error: 1044: Access denied for user ‘user’@’localhost’ to database ‘mydb’ when using LOCK TABLES

テーブルのロックがどうこうというエラーだ。中途半端にデータがinsert等された状態でdumpされたデータだと、復元した際にデータに矛盾が生じるかもしれないから事前にロックしようとしたけどできなかったよ、ということだろう。ネットを探しているとオプションをつけてしのぐ方法が書かれている。

mysqldump –skip-lock-tables mydb > mydb.sql

上記の「–skip-lock-tables」というオプションを紹介しているブログがやたらと出てきた。しかしこれ、そもそも根本的じゃないでしょうという感じ。ロックしないんだからデータに矛盾が生じそう。つまり使えるかどうかもわからないバックアップをしていることになってしまう(個人ユースならそれでもいいんだろうけど)。

mysqldump –single-transaction mydb > mydb.sql

マニュアルにはこういう記述があった。「–single-transaction」というオプションだ。このオプションだとテーブルをロックせず、トランザクションの範囲でバックアップしてくれるとのことだった。マニュアルにも「–lock-tablesより全然良い」と書いてある。これを使うことにしよう。

久々にPostGIS

2011/02/01 | PostgreSQL

諸般の事情で再びPostGISに触れる機会があった(触れるどころでは済まないのだけれど)。まずはインストールから。しかし以前一度苦労しているので悩まない。今回はCentOSにインストールするのだが、あらかじめRedHat用にコンパイルされたPostGISのrpmを入手してあるのだ。今回使用したパッケージはこちら。

geos-3.0.0-1.x86_64.rpm
postgis-1.3.2-2.x86_64.rpm
proj-4.6.0-1.x86_64.rpm

で、まずはこれらをrpmで普通にインストールする。依存関係があるので3つ同時にインストールするのがよい。

それからPostgreSQLの設定。OSはインストールホヤホヤなので初期化も完了していないので作業としてはデータベースの初期化から始めなくてはいけない。作業したコマンドを全て列挙する。

initdb –no-locale –encoding=UTF8
createdb template_postgis
createlang plpgsql template_postgis
psql -d template_postgis -f lwpostgis.sql
psql -d template_postgis -f lwpostgis_upgrade.sql
psql -d template_postgis -f spatial_ref_sys.sql

データベースを初期化し、PostGIS用のテンプレートを作成、PL/pgSQLを使用できる状態にして、必要なSQL文を流し込む(SQL文はインストールしたパッケージに添付されている)。

この時点で出来上がったデータベース(template_postgis)は、通常のデータベースであってテンプレートではない。このデータベースを元にしてPostGISなデータベースを作るためには、テンプレート化しておかなくてはいけない。そのためにpsqlしてから以下のコマンドを入力した。

update pg_database set datistemplate=true where datname=’template_postgis’

これでPostGISのインストールが完了した。今後はtemplate_postgisをテンプレートとしてデータベースを作成すれば良いことになる。とりあえずここまでトラブルなく進めてよかった。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net