ホーム » PostGIS

PostGIS」カテゴリーアーカイブ

PostGIS 空間インデックス

空間インデックスの作成
create index インデックス名 on テーブル名 using GIST(ジオメトリ項目名);
※テーブル名に大文字があるとテーブル名の前後にダブルコーテーションが付く。
そのような時はcreate index文でもテーブル名の前後にインデックスを付与する。
例)create index インデックス名 on “テーブル名” using GIST(ジオメトリ項目名);

空間インデックスの一覧
空間インデックスの一覧機能はないので、テーブル「pg_indexes」を参照してインデックスの女王を求める。
※psqlのコマンド\diでは表示されない

PostGISをWindowsにインストールのおさらい

psql.exeにパスを通す

p30

管理者権限でDBに接続後、下記を実行

接続ユーザー(ロール)作成

スキーマを作成して、スキーマのオーナーを設定

データベースを作成

ユーザーに権限を付与

p31

PostgresqlのデータベースをPostGISデータベースに拡張

p32

PostGISに空間データを持ったテーブルを作成

「CREATE TABLE」にgeometryを入れて作ってしまうことが多いので念の為に記述!
geopacificさんのサイトを参考にしました

空間データを含まないテーブルを作成
[code]
create table traffic_counter_point
(
id serial,
name varchar(128),
cmt varchar(256)
)
[/code]

次にAddGeometryColumnを使って空間データの項目を追加。
これによってメタデータも更新される。
これらのメタデータは必須ではないが、GeoServerやQGISでは照会される。

AddGeometryColumnの構文

AddGeometryColumn(スキーマ名,テーブル名,項目名,SRID,geometry_type,dimension)

※スキーマは省略可能

traffic_counter_pointテーブルにPOINTを持たせる
[code]
select AddGeometryColumn(‘traffic_counter_point’,’geometry’,4326,’POINT’,2)
[/code]

pgadminで指導メッセージ

pgadminIIIを使用してリモートDBに接続すると以下の画面「サーバ構成はインストールされていません」が表示された

スクリーンショット 2014-02-04 10.04.06

画面上の修正ボタンを押すと今後は以下の画面が表示された

ERROR:permission denied to create extension “adminpack”
HINT: Must be superuser ocreate this extention

スクリーンショット 2014-02-04 10.03.33

adminpackの詳細

adminpackは、pgAdminやその他の管理・運用ツールがサーバログファイルの遠隔管理を行うなどの、
追加的な機能を提供できるようにするための数多くのサポート機能を提供します。

adminpackにより実装された機能はスーパーユーザのみが実行可能です。
以下がそれらの機能一覧です。

int8 pg_catalog.pg_file_write(fname text, data text, append bool)
bool pg_catalog.pg_file_rename(oldname text, newname text, archivename text)
bool pg_catalog.pg_file_rename(oldname text, newname text)
bool pg_catalog.pg_file_unlink(fname text)
setof record pg_catalog.pg_logdir_ls()

int8 pg_catalog.pg_file_read(fname text, data text, append bool)
bigint pg_catalog.pg_file_length(text)
int4 pg_catalog.pg_logfile_rotate()

対応方法

対象のDBに管理者で接続して以下のコマンドを実行

create extension adminpack;

スクリーンショット 2014-02-04 10.16.18

以上で対応完了。
pgadminでも指導のメッセージが表示されなくなり、pgadminで確認するとadminpackの関数が実装されている

スクリーンショット 2014-02-04 10.19.18

PostgreSQL(9.3 Windows)に他ホストから接続

PostgreSQLはデフォルトではローカルホストからのみ接続が可能
他ホストからの接続を許可するには以下の設定を行う

postgresql.confの編集
C:\Program Files\PostgreSQL\9.3\data\postgresql.confを編集して他のホストからの接続を許可

listen_addresses = '*'

listen_addressesがコメントにされていたり、listen_addressesにlocalhostが設定されていると他ホストからの接続ができない
実際にはpostgresql.confを直接編集せずにpgadminを使用して編集
「ツールメニュー」-「サーバ構成」-「postgresql.conf」を選択してpostgresql.confの編集画面を表示
スクリーンショット 2014-02-03 04.43.29

pg_hba.confの編集
C:\Program Files\PostgreSQL\9.3\data\pg_hba.confを編集して他のホストからの接続を許可
以下の1行を追加

# TYPE DATABASE USER ADDRESS METHOD
host all all 0.0.0.0/0 md5

METHODの設定値について





trustパスワード認証を行わない
md5パスワードをmd5で簡易暗号化して転送して認証
passwordパスワードをテキストで転送して認証

pg_hba.confも通常は直接編集せずにpgadminを使用して編集
「ツールメニュー」-「サーバ構成」-「pg_hba.conf」を選択してバックエンド アクセス認証エディタを表示

スクリーンショット 2014-02-03 05.05.01

GeoServer上のラインをOpenLayersに色分け表示

GeoServer上に鉄道のデータをインポート

これを鉄道会社の種別(1~5)ごとに色分けしてOpenLayers上に表示

当初はOpenLayersのスタイルで対応を行おうとしたが、どうもこれはOpenLayers.Layer.WMSには使えないみたい

結局、GeoServerの機能でスタイルを作成してレイヤにスタイルを設定して解決

以下のスタイルを作成
[code]
<?xml version="1.0" encoding="ISO-8859-1"?>
<StyledLayerDescriptor version="1.0.0"
xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd"
xmlns="http://www.opengis.net/sld"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<NamedLayer>
<Name>railroad ex</Name>
<UserStyle>
<Title>SLD Cook Book: railroad ex</Title>
<FeatureTypeStyle>
<Rule>
<Name>rail-1</Name>
<ogc:Filter>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>n02_002</ogc:PropertyName>
<ogc:Literal>1</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<LineSymbolizer>
<Stroke>
<CssParameter name="stroke">#009933</CssParameter>
<CssParameter name="stroke-width">2</CssParameter>
</Stroke>
</LineSymbolizer>
</Rule>
</FeatureTypeStyle>
<FeatureTypeStyle>
<Rule>
<Name>rail-2</Name>
<ogc:Filter>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>n02_002</ogc:PropertyName>
<ogc:Literal>2</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<LineSymbolizer>
<Stroke>
<CssParameter name="stroke">#0055CC</CssParameter>
<CssParameter name="stroke-width">3</CssParameter>
</Stroke>
</LineSymbolizer>
</Rule>
</FeatureTypeStyle>
<FeatureTypeStyle>
<Rule>
<Name>rail-3</Name>
<ogc:Filter>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>n02_002</ogc:PropertyName>
<ogc:Literal>3</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<LineSymbolizer>
<Stroke>
<CssParameter name="stroke">#FF0000</CssParameter>
<CssParameter name="stroke-width">6</CssParameter>
</Stroke>
</LineSymbolizer>
</Rule>
</FeatureTypeStyle>
<FeatureTypeStyle>
<Rule>
<Name>rail-4</Name>
<ogc:Filter>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>n02_002</ogc:PropertyName>
<ogc:Literal>4</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<LineSymbolizer>
<Stroke>
<CssParameter name="stroke">#FF0000</CssParameter>
<CssParameter name="stroke-width">6</CssParameter>
</Stroke>
</LineSymbolizer>
</Rule>
</FeatureTypeStyle>
<FeatureTypeStyle>
<Rule>
<Name>rail-5</Name>
<ogc:Filter>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>n02_002</ogc:PropertyName>
<ogc:Literal>5</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<LineSymbolizer>
<Stroke>
<CssParameter name="stroke">#FF0000</CssParameter>
<CssParameter name="stroke-width">6</CssParameter>
</Stroke>
</LineSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
[/code]
上記のスタイルをレイヤに関連付けて対応
スクリーンショット 2014-01-15 18.07.18

念の為、OpenLayersのスタイルについて

参考サイト

[code]
new OpenLayers.StyleMap({
"default": new OpenLayers.Style({
strokeColor: "white",
strokeWidth: 1
}, {
rules: [
new OpenLayers.Rule({
filter: new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.LESS_THAN,
property: "shape_area",
value: 3000
}),
symbolizer: {
fillColor: "olive"
}
}),
new OpenLayers.Rule({
elseFilter: true,
symbolizer: {
fillColor: "navy"
}
})
]
})
})
[/code]

スタイルの変更
スタイルはGeoServer上で予めレイヤに設定する。
以下の書式でJavaScript側からも変更が可能
※GeoServer上でrailroad2というスタイルを作成済み
[code]
railroad = new OpenLayers.Layer.WMS(
"Tokyo:railroad", "../geoserver/Tokyo/wms",
{
STYLES: ‘railroad2’,
LAYERS: ‘Tokyo:VIEW_RAILROAD’,
format: ‘image/png’,
transparent: true,
viewparams: ‘road_type:2’
},
{
singleTile: true,
ratio: 1,
isBaseLayer: false,
yx : {‘EPSG:4326’ : true}
}
);
[/code]

PostGISにShapefileをインポート

PostGISに付属するPostGIS 2.0 Shapefile and DBF Loader Exporterを使用する
※インストールしたPostGISは2.1だがなぜかこちらのツールには2.0と表示される。

postgis1

インポート対象は東京の行政ポリゴン「N03-13_13_130401.shp」

PostGIS Shapefile Import/Export Managerを起動

postgis2

View Connection detailes を選択してデータベースに接続

postgis3

Add Fileボタンを押してインポート対象のShapeファイルを選択し、SRIDを指定
※インポート対象の測地系世界測地系の緯度、経度なのでSRIDは4326を指定

postgis4

Import Optionを以下に従って設定

DBFの文字コードはShiftJISなのでcp932を設定

postgis5

Importボタンを押して終了

インポート結果

postgis6

SRIDの一覧

PostgreSQLの文字コードについて

PostGISデータのインポート・エクスポート

PostGISデータベースの作成

PostGIS2.0まではPostGISデータベースのテンプレートを元に新規にPostGISデータベースを作成していたが、
PostGIS2.1からはEXTENSIONでPostgresqlのデータベースをPostGISデータベースに拡張が可能になった。

※以下はpsql上で管理者権限で実行

最初にPostgresqlのデータベースを作成
createdatabase testdb encoding ‘utf8’

postgres=# \c testdb
データベース “testdb” にユーザ”postgres”として接続しました。
testdb=# create extension postgis;
CREATE EXTENSION
testdb=# create extension pgrouting;
CREATE EXTENSION
testdb=# create extension postgis_topology;
CREATE EXTENSION
testdb=# b

以上でPostGISデータベースの作成終了

pgadmin上でPostGISを確認

postgresql26

PostgreSQLのコマンド

データベース接続 psql -h ホスト名 -U ユーザー名 -d データベース
データベース一覧 \l
データベース指定 \c データベース名
テーブル一覧 \d
テーブル定義 \d テーブル名
スキーマ一覧 \dn
ユーザー一覧 \du
psql終了 \q
ユーザー作成 create role ユーザー名 with login password ‘パスワード’
with loginを省略した時はログイン不可なユーザー
※create role testuser with login password ‘testpwd’
データベース作成 create database データベース名 encoding ‘UTF8’
※create database testdb encoding ‘UTF8’
ユーザー権限 grant 権限 on database データベース名 to ユーザー名
※全ての権限を与えるときはallを設定
スキーマ作成 CREATE SCHEMA スキーマ名

CREATE SCHEMA スキーマ名 AUTHORIZATION ロール名

※AUTHORIZATIONを指定するとスキーマのオーナー名を指定
カレントユーザーのスキーマ照会 SELECT CURRENT_SCHEMA();
スキーマのオーナー設定 ALTER SCHEMA スキーマ名 OWNERT TO ロール名
バックアップ pg_dump -U ユーザー名 -t テーブル名 データベース名 > ダンプファイル名
※–format=customを指定すると、圧縮される。リストア時にはpg_restoreを指定
pg_dump -U ユーザー名 -t テーブル名 –format=custom データベース名 > ダンプファイル名
リカバリ未圧縮 psql -U ユーザー名 データベース名 < ダンプファイル名
リカバリ圧縮 pg_restore -U ユーザー名 -d データベース名 ダンプファイル名

PostGISをWindowsにインストール

対象
PostGIS version 9.3.2(64bit版)
Windows 2008
PostgreSQL9.3.2のインストーラー(postgresql-9.3.2-1-windows-x64)を以下よりダウンロード
http://www.enterprisedb.com/products-services-training/pgdownload#windows

PostGISのサイト

全てのインストールが終了したらpsql.exeにパスを通す。
postgresql25

WindowsでPostgreSQLを使ってみよう

PostGISの詳細についてはこちら

PostGISのインストールについて

PostGIS日本語マニュアル