昨日やってみたmapserverの地図生成負荷テストで、早くても2秒もかかっていることから、もはやDBの数値から画像生成していたのでは全くサービスとしては使いものにならんのではないか、ということで予め画像を生成しておき、必要な範囲だけあとでcropしようと考えました。
画像を大量にバッチ処理し、全部DBに空間情報と共に入れておくという作戦。
CentOS5.4のMysqlは5.0.8とかみたいなので、そもそもcontainが使えないのではないかと。いちいちめんどくさいのもイヤなので確実に空間情報の処理ができることがわかっているpostgisを使うことにした。
なのでまずDB作戦、さすがにここで時間かけるわけにはいかんと思いきや、さっそく空間情報DBの作成でつまづく。多分もう2時間くらいかけたな。全体を4時間で終えたいのに、早速こんなんでは多分これ1週間くらいかかるかもな。。。いつものことだけど。
参考までにPOSTGISでの位置情報用DBの作り方は以下でした。もちろん自分の環境においての話です。ちなみにtemplate_postgisは自分の環境には無かったです。というか、インストールの仕方次第なのだろうか。ともかく、以下の通りでありました。
su - postgres
createdb -U postgres -E utf8 mapimages
createlang -d mapimages -U postgres plpgsql
psql -d mapimages -f /usr/share/pgsql/postgresql/contrib/lwpostgis.sql
psql -d mapimages -f /usr/share/pgsql/postgresql/contrib/spatial_ref_sys.sql
コンソールに入って
psql mapimages
CREATE TABLE images (id serial, file varchar(300));
SELECT AddGeometryColumn('images', 'center', 4326, 'POINT', 2);
SELECT AddGeometryColumn('images', 'crop_center', 4326, 'POLYGON', 2);
ちなみに
select version();
は
PostgreSQL 8.1.18 on i686-redhat-linux-gnu, compiled by GCC gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46)
select postgis_full_version();
は
POSTGIS="1.3.6" GEOS="3.1.0-CAPI-1.5.0" PROJ="Rel. 4.7.1, 23 September 2009" USE_STATS
こちらのサイトの情報にとても助けてもらいました。ありがとうございます。
追記で、insertとselect文のサンプル
INSERT INTO images
(file, center, crop_center)
VALUES
('a.gif',
GeomFromText('POINT(136 36)', 4326),
GeomFromText('Polygon((135 35, 135 37, 137 37, 137 35, 135 35))', 4326)
);
---
select * from images
where
contains(images.crop_center, GeomFromText('POINT(136 36)', 4326));
あとindexを作る方法は多分これだけだ。多分あっていると思う。
CREATE INDEX idx_images ON images USING gist(crop_center);
ちなみにJavaでアクセスするのだけど、
Select center from images; して PGgeometry geom = (PGgeometry)rs.getObject("center"); とかやる方法があるのだがPGgeometryを少なくとも今回は使う理由がないように思い Select X(center) as x from images; して Double x = (PGgeometry)rs.getDouble("x"); という風に取り出すことにした。
コメント