WFS Transaction Example(wfs-t.html)を参考に WSF レイヤにフィーチャを保存するためのコントロールの使い方を試してみます。
データベース tokyo に描画用テーブル drawingpoint を作成します。
PostGIS では保存できなかったので、Shapefile で編集可能レイヤを作成します。
pf_tokyo テーブルをコピーし空のデータのテーブルを作成します。
(pf_tokyo テーブルにないデータで抽出します。)
tokyo=> create table drawingpoint3 as select * from pf_tokyo where gid = '0';
SELECT
the_geom カラムの座標系を MULTIPOINTM にします。(POINT ではデータが追加できないため。)
tokyo=> ALTER TABLE drawingpoint3 ADD constraint enforce_geotype_the_geom CHECK (geometrytype("the_geom") = 'MULTIPOINTM'::text OR "the_geom" IS NULL);
ALTER TABLE
tokyo=> \d drawingpoint3
Table "public.drawingpoint3"
Column | Type | Modifiers
----------+-----------------------+-----------
gid | integer |
aac | character varying(5) |
ren | character varying(1) |
com | character varying(1) |
cls | character varying(1) |
pca | character varying(2) |
pci | character varying(5) |
na8 | character varying(1) |
na0 | character varying(82) |
ads | character varying(63) |
apf | character varying(1) |
ad6 | character varying(1) |
ys3 | character varying(1) |
oy2 | character varying(1) |
rcn | character varying(12) |
the_geom | geometry |
Check constraints:
"enforce_geotype_the_geom" CHECK (geometrytype(the_geom) = 'MULTIPOINTM'::text OR the_geom IS NULL)
the_geom にデータを入力します。
tokyo=> INSERT INTO drawingpoint3 (the_geom ) values (GeomFromEWKT('MULTIPOINT(139.554 35.682 0)'));
INSERT 0 1
tokyo=> select gid, aac, ren, com, cls, pca, pci, na8, na0, ads, apf, ad6, ys3, oy2, rcn, the_geom from drawingpoint3 ;
gid | aac | ren | com | cls | pca | pci | na8 | na0 | ads | apf | ad6 | ys3 | oy2 | rcn | the_geom
-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+------------------------------------------------------------------------------
| | | | | | | | | | | | | | | 01040000800100000001010000807D3F355EBA7161409EEFA7C64BD741400000000000000000
(1 row)
drawingpoint レイヤを GeoServer に追加します。
「Layer Configration」
1 ログインした GeoServer ページの左側の欄の「Data」の「Layers」をクリックします。
2 「Add a new resource」をクリックします。
3 「New Layer chooser」の「Add a layer from」ドロップダウンから「sde:Tokyo」を選択します。
4 Tokyo store のリソース(レイヤ)のリストが表示されます。
「drawingpoint3」の「Publish」をクリックします。
5 選択したレイヤのリソースと編集した情報の設定をします。
「Basic Resource Info」を入力します。
Name: drawingpoint3 (変更なし)
Title: Drawing Point3 (最初の文字を大文字に変更 任意)
Abstract: Tokyo Drawing Point3(任意)
「Keywords」を入力します。
Current Keywords: (追加したキーワードが表示されます)
New Keyword: drawing, point, tokyo (1つずつ入力して「追加」ボタンをクリック)
「Metadata links」は変更しません。
「Coordinate Reference Systems」を入力します。
Native SRS: 空(変更なし)
Declared SRS: EPSG:4326 (「Find」ボタンをクリックして「4326」を検索して表示された「4326」をクリック)
SRS handling: Force declared (変更しない)
6 「Bounding Boxes」を入力します。
Native Bounding Box: (「Compute from data」をクリック -以下の値が入力されました)
Min X: 139.554
Min Y: 35.682
Max X: 139.554
Max Y: 35.682
Lat/Lon Bounding Box: (「Compute from native bounds」をクリック -以下の値が入力されました)
Min X: 139.554
Min Y: 35.682
Max X: 139.554
Max Y: 35.682
7 ページ上部の「Publishing」タブをクリックします。
8 「Default Title」の「Default Style」を「point」にします。
(他は変更しません。)
9 ページ下部の「Save」ボタンをクリックします。
「Layer」ページの一番最後に「drawingpoint3」が追加されます。
drawing レイヤの Shapefile を作成します。
1 GeoServer ページの左側の欄の「Layer Preview」をクリックします。
2 sde:drawingpoint3 の All Formats のドロップダウンリストで 「Shapefile」を選択します。
3 「drawingpoint3.zip を開く」ダイアログで「ファイルを保存する」を選択し「OK」ボタンをクリックします。
4 「ファイル名を入れてください」ダイアログでデスクトップに保存しました。
この Shapefile を GeoServer に設定します。
1 drawingpoint3.zip を解凍します。
2 geoserver-2.0.1/data_dir/data/drawing を作成します。
3 解凍したファイルを全部 geoserver-2.0.1/data_dir/data/drawing に入れます。
user@debian:~/Desktop$ ls
drawingpoint3.zip featureserver-1.12 sld_data tilecache.csv
eclipse quicktime4linux-2.0.0 streaming tilecache2.csv
user@debian:~/Desktop$ unzip drawingpoint.zip
Archive: drawingpoint.zip
inflating: drawingpoint3MPoint.prj
inflating: drawingpoint3MPoint.dbf
inflating: drawingpoint3MPoint.cst
inflating: drawingpoint3MPoint.shx
inflating: drawingpoint3MPoint.shp
user@debian:~/Desktop$ ls
drawingpoint3.zip drawingpointPoint.shx streaming
drawingpoint3MPoint.cst eclipse tilecache.csv
drawingpoint3MPoint.dbf featureserver-1.12 tilecache2.csv
drawingpoint3MPoint.prj quicktime4linux-2.0.0
drawingpoint3MPoint.shp sld_data
user@debian:~/Desktop$ mkdir ../geoserver-2.0.1/data_dir/data/drawing
user@debian:~/Desktop$ mv drawingpoint3* ../geoserver-2.0.1/data_dir/data/drawing/
4 GeoServer ページの左側の欄の Data -> Stores をクリックします。
5 Layers 画面の「Add new Store」をクリックします。
6 New data source の Vector Data Sources の「Shapefile」をクリックします。
7 New Vector Data Source 画面で次のように設定します。
「Basic Store Info」を入力します。
Workspace: sde
Data Source Name: Tokyo_Shapefile
Description: Tokyo MLIT Shapefile
Enable: チェック(変更なし)
「Connection Parameters」を入力します。
URL: file:data/drawing
create spatial index: チェック(変更なし)
charset: utf-8
memory mapped buffer: チェック(変更なし)
「Save」ボタンをクリックします。
New layer chooser 画面になるので、drawingpoint3MPoint の「Publish」をクリックします。
8 sde:drawingpoint3MPoint 画面で次のように設定します。
Data タブの
「Basic Rsource Info」を入力します。
Name: drawingpoint3MPoint(変更なし)
Title: Drawingpoint3M Point
Abstract: Drawingpoint3M Point
「Keywords」を入力します。
New Keyword: tokyo, public facilities
「Metadata links」は入力しません。
「Coordinate Reference Systems」を入力します。
Native SRS: EPSG;4326(変更なし)
Declared SRS: EPSG;4326(変更なし)
SRS handling: Force declared(変更なし)
「Bounding Boxes」を入力します。
Native Bounding Box: (「Compute from data」をクリック -以下の値が入力されました)
Min X: 139.554
Min Y: 35.682
Max X: 139.554
Max Y: 35.682
Lat/Lon Bounding Box: (「Compute from native bounds」をクリック -以下の値が入力されました)
Min X: 139.554
Min Y: 35.682
Max X: 139.554
Max Y: 35.682
ページ上部の「Publishing」タブをクリックします。
「Default Title」の「Default Style」が「point」になっていることを確認します。
(他は変更しません。)
ページ下部の「Save」ボタンをクリックします。
「Layer」ページの一番下に「drawingpoint3MPoint」が追加されます。
HTML ファイルを新規作成します。
「openlayersTokyoproj」 を右クリックして 新規 -> HTML ファイル をクリック。
「HTML ファイル」ウィンドウの「ファイル名(任意:openlayers_wfs_t.html)」に入力して「完了」ボタンをクリック。
「charset」を「utf-8」にします。
「examples」の「wfs-t.html」の内容をコピーして新規作成したファイルに貼り付けます。
コードの修正とちょっと解説します。
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>OpenLayers52a WFS-T</title>
<!-- OpenLayers ライブラリ -->
<script src="./lib/Firebug/firebug.js"></script>
<script src="./lib/OpenLayers.js"></script>
<!-- Proj4js ライブラリ -->
<script type="text/javascript" src="./lib/proj4js/lib/proj4js-compressed.js"></script>
<script type="text/javascript" src="./lib/proj4js/lib/projCode/tmerc.js"></script>
<script type="text/javascript" src="./lib/proj4js/lib/defs/EPSG2456.js"></script>
<!-- スタイルシート -->
<link rel="stylesheet" href="./theme/default/style.css" type="text/css" />
<link rel="stylesheet" href="./examples/style.css" type="text/css" />
<!-- Editing Tool Bar スタイルシート -->
<style>
/* カスタムツールバーを追加 */
.customEditingToolbar {
float: right;
right: 0px;
height: 30px;
width: 200px;
}
.customEditingToolbar div {
float: right;
margin: 5px;
width: 24px;
height: 24px;
}
.olControlNavigationItemActive {
background-image: url("./theme/default/img/editing_tool_bar.png");
background-repeat: no-repeat;
background-position: -103px -23px; /* editing_tool_bar.png をずらして表示 */
}
.olControlNavigationItemInactive {
background-image: url("./theme/default/img/editing_tool_bar.png");
background-repeat: no-repeat;
background-position: -103px -0px; /* editing_tool_bar.png をずらして表示 */
}
.olControlSaveFeaturesItemActive {
background-image: url("./theme/default/img/save_features_on.png");
background-repeat: no-repeat;
background-position: 0px 1px;
}
.olControlSaveFeaturesItemInactive {
background-image: url("./theme/default/img/save_features_off.png");
background-repeat: no-repeat;
background-position: 0px 1px;
}
.olControlDrawFeaturePointItemActive {
background-image: url("./theme/default/img/editing_tool_bar.png");
background-position: -77px -23px; /* editing_tool_bar.png をずらして表示 */
background-repeat: no-repeat;
}
.olControlDrawFeaturePointItemInactive {
background-image: url("./theme/default/img/editing_tool_bar.png");
background-position: -77px 0px; /* editing_tool_bar.png をずらして表示 */
background-repeat: no-repeat;
}
</style>
<script type="text/javascript">
var map, wfs;
OpenLayers.ProxyHost = "/cgi-bin/proxy.cgi?url="; // 修正
function init() {
// 東京都用 map の設定
map = new OpenLayers.Map('map', {
projection: new OpenLayers.Projection("EPSG:2456"),
displayProjection: new OpenLayers.Projection("EPSG:4326"),
maxResolution: 'auto',
units: 'meters',
maxExtent: new OpenLayers.Bounds(-279000,1054000,-185000,1104000),
});
// ここまで
// WMS レイヤ
var wms = new OpenLayers.Layer.WMS( "Gyoseikukaku",
"http://localhost:8080/geoserver/wms", // 自分の GeoServer
{
layers: 'sde:gyoseikukaku'
});
wfs = new OpenLayers.Layer.WFS( "Drawing Point",
"http://localhost:8080/geoserver/wfs", // 自分の GeoServer
{
typename: 'sde:drawingpoint3MPoint'
},{
typename: "drawingpoint3MPoint",
featureNS: "http://geoserver.sf.net", // drawingpointPoint がある Workspace の名前空間
extractAttributes: false, // レイヤ属性の解析
commitReport: function(str) {OpenLayers.Console.log(str);},
// コミットが成功または失敗したときメッセージを送信。エラーを FireBug のようなコンソールに表示
projection: new OpenLayers.Projection("EPSG:4326")
});
map.addLayers([wms, wfs]);
// customEditingToolbar に変更
var panel = new OpenLayers.Control.Panel(
{'displayClass': 'customEditingToolbar'}
);
// ナビゲーションコントロール(地図表示範囲の移動)追加
var navigate = new OpenLayers.Control.Navigation({
title: "Pan Map",
});
// フィーチャ描画コントロール
var draw = new OpenLayers.Control.DrawFeature(
wfs, OpenLayers.Handler.Point,
{
handlerOptions: {freehand: false, multi: true},
displayClass: "olControlDrawFeaturePoint"
}
);
// フィーチャ保存
var save = new OpenLayers.Control.Button({
trigger: OpenLayers.Function.bind(wfs.commit, wfs), // オブジェクトに関数を結びつける
displayClass: "olControlSaveFeatures"
});
panel.addControls([
new OpenLayers.Control.Navigation(),
save, draw
]);
map.addControl(panel);
map.addControl(new OpenLayers.Control.LayerSwitcher()); // 追加
map.addControl(new OpenLayers.Control.MousePosition()); // 追加
map.addControl(new OpenLayers.Control.ScaleLine()); // 追加
map.zoomToMaxExtent();
// map.zoomToExtent(new OpenLayers.Bounds(-210000,1070000,-200000,1075000));
}
</script>
</head>
<body onload="init()">
<h1 id="title">WFS Transaction Example</h1>
<div id="tags"></div>
<p id="shortdesc">
Shows the use the WFS layer for transactions.
</p>
<div id="map" class="smallmap"></div>
<p id="docs">
This is an example of using a WFS layer type. Note that it requires a
working GeoServer install, which the OpenLayers project does not maintain;
however, if you're interested, you should be able to point this against
a default GeoServer setup without too much trouble.
</p>
</body>
</html>