![]() |
|||||||||
![]() |
![]() |
PostGIS の変更点
#author("2022-01-31T01:19:40+00:00","default:pentacle","pentacle")
* 概要 [#id62ebd3]
PostGIS は postgres のプラグインで、各種地理的な計算をするライブラリ。
たとえば緯度経度ベースの2点間の距離を求めたり、ポリラインで、移動距離を求めるなど。
* INSTALL for linux[#u13ec0d3]
postgres が動いていたら停止
/etc/init.d/postgresql[-9.1] stop
投射等の演算ライブラリ proj
cd /usr/local/src
wget http://download.osgeo.org/proj/proj-4.8.0.tar.gz
tar xzfp proj-4.8.0.tar.gz
cd proj-4.8.0
./configure
make
make install
geocoding 等のライブラリ geos
cd /usr/local/src
wget http://download.osgeo.org/geos/geos-3.4.2.tar.bz2
tar xjfp geos-3.4.2.tar.bz2
cd geos-3.4.2
./configure
make
make install
KML 等のために使用する XML ライブラリ
yum -y install libxml2-devel
GISラスターデータフォーマット用ライブラリ
cd /usr/local/src
wget http://download.osgeo.org/gdal/gdal-1.9.2.tar.gz
tar xzfp gdal-1.9.2.tar.gz
cd gdal-1.9.2
./configure
make
make install
postgis 本体
cd /usr/local/src
wget http://download.osgeo.org/postgis/source/postgis-2.1.0.tar.gz
tar xzpf postgis-2.1.0.tar.gz
cd postgis-2.1.0
#export PATH=/usr/pgsql-9.3/bin/:$PATH
./configure
make
make install
lib の設定~
/etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/local/lib
↑1行追記~
~
システムに反映
ldconfig
/etc/init.d/postgresql[-9.1] start
su - postgres
postgis用のスケルトンDBを生成
createdb template_postgis
createlang plpgsql template_postgis
psql -d template_postgis -f /usr/share/pgsql/contrib/postgis-2.1/postgis.sql
psql -d template_postgis -f /usr/share/pgsql/contrib/postgis-2.1/spatial_ref_sys.sql
psql -d template_postgis -f /usr/share/pgsql/contrib/postgis-2.1/rtpostgis.sql
psql -d template_postgis -f /usr/share/pgsql/contrib/postgis-2.1/topology.sql
for rails
gem install GeoRuby
gem install spacial_adapter
* install for windows [#ob4ca849]
普通に postgresの installer から入れられる~
template の概念はなく、db を作成してから、
\c database
create extension postgis;
を実行する
----
* 動作確認 [#k2080313]
postgis のテンプレートを使った DB (DB名: SampleDB) の作成
createdb -U postgres -E UTF-8 -T template_postgis SampleDB
psql -U postgres -d SampleDB
東京駅から新大阪駅までの2点間距離を求める
SELECT ST_Distance(
ST_GeomFromText('POINT(139.76608399999998 35.681382)',4326)::Geography,
ST_GeomFromText('POINT(135.50010900000007 34.73348 )',4326)::Geography
);
結果
st_distance
------------------
402392.122486525
402.392km
* 使い方 [#d544f662]
postGIS が使えるコンソールを開く(DBを指定して開くのみ)
psql -U postgres -d SampleDB
テーブル(sample)を作成
CREATE TABLE sample (id SERIAL);
postGISコマンドは select文経由で発行(sample テーブルに geometry型のカラムを追加)~
(4326は、世界測地系(WGS84) のID)
SELECT AddGeometryColumn('sample', 'point', 4326, 'POINT', 2);
テーブルの型の確認
\d sample
テーブル "public.sample"
カラム | 型 | 修飾語
--------+----------------------+-----------------------------------------------------
id | integer | not null default nextval('sample_id_seq'::regclass)
point | geometry(Point,4326) |
東京駅と新大阪駅を追加
insert into sample (point) values (ST_GeomFromText('POINT(139.76608399999998 35.681382)',4326));
insert into sample (point) values (ST_GeomFromText('POINT(135.50010900000007 34.73348)',4326));
SQL 文で距離を算出
select ST_Distance( (select point from sample where id=1)::geography , (select point from sample where id=2)::geography );
geometry 型から 緯度経度を表示
select ST_X(point),ST_Y(point) from sample where id=1;
----
* 測地系変換 [#w5e12c91]
postgis の変換パラメータは若干間違っているので下記を実行
create extension postgis;
update spatial_ref_sys set proj4text=replace(proj4text,'-148,507,685,0,0,0,0','-146.414,507.337,680.507,0,0,0,0') where srtext like '%-148,507%';
update spatial_ref_sys set srtext=replace(srtext,'-148,507,685,0,0,0,0','-146.414,507.337,680.507,0,0,0,0') where srtext like '%-148,507%';
SELECT ST_AsText(ST_Transform(ST_GeomFromText('POINT(140 40)', 4301), 4326));
結果
POINT(139.996550822303 40.0027470831033)
----
* 平面直角座標 => 緯度経度変換 [#u5458df8]
|x |double|基準点からの距離(m)|
|y |double|基準点からの距離(m)|
|zone |int| 日本の座標系(1-19)|
|geom |geometry||
x,y,zone を入れたらgeom を補完するfuntion
CREATE FUNCTION latlng_complete() RETURNS TRIGGER AS $$ BEGIN
NEW.geom := ST_Transform(ST_SetSRID( ST_MakePoint(NEW.y, NEW.x),2442+NEW.zone),4326);
RETURN NEW;
END; $$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_latlng_complete BEFORE INSERT OR UPDATE ON point FOR EACH ROW EXECUTE PROCEDURE latlng_complete();
例:東京駅 (9系)
insert into point values (-35365.116 ,-6012.105 ,9);
* 日本の県境を作成 [#s2c6c1d1]
国土数値情報から全国分をDL
http://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N03.html
unzip N03-190101_GML.zip
shp2pgsql -W cp932 -D -I -s 4612 N03-19_190101.shp t1 > N03-19_190101.sql
psql -U postgres prefecture < N03-19_190101.sql
*** postgres 準備 [#r5809c6c]
create database prefecture;
\c prefecture;
create extension postgis;
* sql snipet [#x99e355d]
まず緯度経度のデータを入れる
create table points (lat double precision,lng double precision );
\copy points from 'hoge.csv' with csv
次に geography型のフィールドを追加して計算
alter table points add column geog geography(POINT,4326);
update points set geog=ST_GeographyFromTEXT('SRID=4326;POINT('||lng||' '||lat||')');
必要に応じて index を付けておく
50m 以内抽出
where ST_GeographyFromText( geog, 'SRID=4326;POINT(139.0 35.9)', 50)
|
|||||||