2010年11月30日火曜日

GeoExt14 WMS Capabilities Tree - WMS Capabilities のツリー表示

WMS Capabilities Loader Example

Example サイト
http://www.geoext.org/examples.html

「WMS Capabilities Tree」リンクをクリックすると WMS Capabilities Loader Example が表示されます。
wms-tree.js. を参考にします。

説明を意訳すると、WMS の getCapabilities レスポンスの階層構造を持つツリーを設定するために GeoExt.tree.WMSCapabilitiesLoader を使用する方法を示します。

var tree, mapPanel;

Ext.onReady(function() {

var root = new Ext.tree.AsyncTreeNode({
text: 'GeoServer Demo WMS',
loader: new GeoExt.tree.WMSCapabilitiesLoader({ // WMS のすべてのレイヤーのツリーを作成するローダ。
// url: 'data/wmscap.xml',
url: './geoserver_wms_gc.xml',
layerOptions: {buffer: 0, singleTile: true, ratio: 1}, // オブジェクトオプションオプション
layerParams: {'TRANSPARENT': 'TRUE'}, // オブジェクトオプションパラメータ
// customize the createNode method to add a checkbox to nodes
createNode: function(attr) {
attr.checked = attr.leaf ? false : undefined;
return GeoExt.tree.WMSCapabilitiesLoader.prototype.createNode.apply(this, [attr]);
}
})
});


tree = new Ext.tree.TreePanel({
root: root,
region: 'west',
width: 250,
listeners: {
// Add layers to the map when ckecked, remove when unchecked.
// Note that this does not take care of maintaining the layer
// order on the map.
'checkchange': function(node, checked) {
if (checked === true) {
mapPanel.map.addLayer(node.attributes.layer);
} else {
mapPanel.map.removeLayer(node.attributes.layer);
}
}
}
});


mapPanel = new GeoExt.MapPanel({
//zoom: 2,
zoom: 9,
center: [139.4, 35.7],
layers: [
/* new OpenLayers.Layer.WMS("Global Imagery",
"http://maps.opengeo.org/geowebcache/service/wms",
{layers: "bluemarble"},
{buffer: 0}
)
*/
new OpenLayers.Layer.WMS("Tokyo Gyoseikai mlit WMS",
"http://192.168.1.6:8080/geoserver/wms?",
{layers: "sde:gyoseikai"},
{buffer: 0}
)

],
region: 'center'
});


new Ext.Viewport({
layout: "fit",
hideBorders: true,
items: {
layout: "border",
deferredRender: false,
items: [mapPanel, tree, {
contentEl: "desc",
region: "east",
bodyStyle: {"padding": "5px"},
collapsible: true,
collapseMode: "mini",
split: true,
width: 200,
title: "Description"
}]
}
});

});

HTML ファイルを新規作成します。
「openlayersTokyoproj」 を右クリックして 新規 -> HTML ファイル をクリック。
「HTML ファイル」ウィンドウの「ファイル名(任意:geoext14_wms-tree.html)」に入力して「完了」ボタンをクリック。
「charset」を「utf-8」にします。
以下のように HTML を作成します。
geoext13_wms-capabilities.html をコピーし、外部 JavaScript 読み込みファイルを修正し body タグ内に <div id="desc"></div> を設定します。

---
<title>GeoExt14 WMS Capabilities Tree</title>
---
<!-- wms-tree.js 追加 -->
<script type="text/javascript" src="./wms-tree.js"></script>

</head>
<body>
<div id="desc">
<h1 id="title">GeoExt 14 - WMS Capabilities Tree</h1>
<p id="shortdesc">
WMS Capabilities Loader Example
</p>
<p>This example shows how to use GeoExt.tree.WMSCapabilitiesLoader to populate
a tree with the hierarchical structure of a WMS GetCapabilities response.
The example also shows how to customize the loader's createNode method to add
a checkbox with a checkchange listener that adds and removes layers to and
from the map.</p>

<p>この例では、WMS の getCapabilities レスポンスの階層構造を持つツリーを設定するために
GeoExt.tree.WMSCapabilitiesLoader を使用する方法を示します。また、この例では、
マップからレイヤーを追加と削除する checkchange リスナーでチェックボックスを追加する
ローダーの createNode メソッドをカスタマイズする方法を示しています。</p>

</div>
</body>
</html>

2010年11月29日月曜日

GeoExt13 WMS Capabilities Store - WMS capabilities ドキュメントのデータの読み込み

WMS Capabilities Example

Example サイト
http://www.geoext.org/examples.html

「WMS Capabilities Store」リンクをクリックすると WMS Capabilities Example が表示されます。
wms-capabilities.js. を参考にします。

説明を意訳すると、WMS capabilities ドキュメントからデータでグリッドを読み込む方法を示します。

GeoServer の Stores 設定で東京に関するレイヤだけ有効にして WMS Capabilities のデータを次のコマンドで取得します。

$ wget -O geoserver_wms_gc.xml "http://localhost:8080/geoserver/wms?&request=GetCapabilities&version=1.1.1&service=WMS"

geoserver_wms_gc.xml を Eclipse にインポートします。

var store;
Ext.onReady(function() {

// create a new WMS capabilities store
// リモートの WMS レイヤデータストアを簡単に作成
store = new GeoExt.data.WMSCapabilitiesStore({
// url: "data/wmscap.xml"
url: "./geoserver_wms_gc.xml"
});
// load the store with records derived from the doc at the above url
store.load();

// create a grid to display records from the store
var grid = new Ext.grid.GridPanel({
title: "WMS Capabilities",
store: store,
columns: [
{header: "Title", dataIndex: "title", sortable: true},
{header: "Name", dataIndex: "name", sortable: true},
{header: "Queryable", dataIndex: "queryable", sortable: true, width: 70},
{id: "description", header: "Description", dataIndex: "abstract"}
],
autoExpandColumn: "description",
renderTo: "capgrid",
height: 300,
width: 650,
listeners: {
rowdblclick: mapPreview
}
});


function mapPreview(grid, index) { // レイヤ表示
var record = grid.getStore().getAt(index);
var layer = record.getLayer().clone();

var win = new Ext.Window({
title: "Preview: " + record.get("title"),
width: 512,
height: 256,
layout: "fit",
items: [{
xtype: "gx_mappanel",
layers: [layer],
extent: record.get("llbbox")
}]
});
win.show();
}

});

HTML ファイルを新規作成します。
「openlayersTokyoproj」 を右クリックして 新規 -> HTML ファイル をクリック。
「HTML ファイル」ウィンドウの「ファイル名(任意:geoext13_wms-capabilities.html)」に入力して「完了」ボタンをクリック。
「charset」を「utf-8」にします。
以下のように HTML を作成します。
geoext12_attributes.html をコピーし、外部 JavaScript 読み込みファイルを修正し body タグ内に <div id="capgrid"></div> を設定します。

---
<title>GeoExt13 WMS Capabilities Store</title>
---
<!-- wms-capabilities.js 追加 -->
<script type="text/javascript" src="./wms-capabilities.js"></script>

</head>
<body>

<h1 id="title">GeoExt 13 - WMS Capabilities Store</h1>
<p id="shortdesc">
WMS Capabilities Example
</p>
<p>This example shows how to load a grid with data from a WMS capabilities document.
You can double-click on a row to see a map preview of the layer.</p>

<p>この例では、WMS capabilities ドキュメントからのデータのグリッドを読み込む方法を示しています。
レイヤのマップのプレビューを表示するには、行をダブルクリックします。</p>

<div id="capgrid"></div>
</body>
</html>



MapServer の tokyo_pf_pgis.map の WMS Capabilities のデータを次のコマンドで取得します。

$ wget -O mapserver_gyoseikai_wmsgc100.xml "http://localhost/cgi-bin/mapserv?map=/home/nob61/mapfile/tokyo_pf_pgis.map&request=GetCapabilities&version=1.0.0&service=WMS"

WMS のバージョンが 1.0.0 ではパネルに何も表示されません。
次にバージョン 1.1.1 の WMS Capabilities を取得します。

$ wget -O mapserver_gyoseikai_wmsgc111.xml "http://localhost/cgi-bin/mapserv?map=/home/nob61/mapfile/tokyo_pf_pgis.map&request=GetCapabilities&version=1.1.1&service=WMS"

マップパネルは表示されますが、マップが表示されないレイヤがありました。

2010年11月28日日曜日

GeoExt12 Attribute Store and Reader - DescribeFeatureType の表示

AttributeReader and AttributeStore

Example サイト
http://www.geoext.org/examples.html

「Attribute Store & Reader」リンクをクリックすると AttributeReader and AttributeStore が表示されます。
attributes.js. を参考にします。

説明を意訳すると、WFS DescribeFeatureType レスポンスから読み取られたレコードで AttributeStore を作成する方法を示します。


var store;
Ext.onReady(function() {

// create a new attributes store
store = new GeoExt.data.AttributeStore({
// url: "data/describe_feature_type.xml"
url: "./mapserver_gyoseikai_DFT.xml" // gyoseikai の DescribeFeatureType データ
});
store.load();


// create a grid to display records from the store
var grid = new Ext.grid.GridPanel({
title: "Feature Attributes",
store: store,
cm: new Ext.grid.ColumnModel([
{id: "name", header: "Name", dataIndex: "name", sortable: true},
{id: "type", header: "Type", dataIndex: "type", sortable: true}
]),
sm: new Ext.grid.RowSelectionModel({singleSelect:true}),
autoExpandColumn: "name",
renderTo: document.body,
height: 300,
width: 350
});

});

HTML ファイルを新規作成します。
「openlayersTokyoproj」 を右クリックして 新規 -> HTML ファイル をクリック。
「HTML ファイル」ウィンドウの「ファイル名(任意:geoext12_attributes.html)」に入力して「完了」ボタンをクリック。
「charset」を「utf-8」にします。
以下のように HTML を作成します。
geoext11_attr-form.html をコピーし、外部 JavaScript 読み込みファイルを修正し body タグ内には何も設定しません。

---
<title>GeoExt12 Attribute Store & Reader</title>
---
<!-- attributes.js 追加 -->
<script type="text/javascript" src="./attributes.js"></script>

</head>
<body>
<h1 id="title">GeoExt 12 - Attribute Store & Reader</h1>
<p id="shortdesc">
AttributeReader and AttributeStore
</p>
<p>This is example that shows how create an AttributeStore with records
read from a WFS DescribeFeatureType response.</p>

<p>これは、WFS DescribeFeatureType レスポンスから読み取られたレコードで
AttributeStore を作成する方法を示す例です。</p>
</body>
</html>

2010年11月25日木曜日

GeoExt11 Attribute Form - レイヤ属性の表示フォーム

Example サイト
http://www.geoext.org/examples.html

「Attribute Form」リンクをクリックすると Attribute Form が表示されます。
tattribute-form.js. を参考にします。

説明を意訳すると、WFS DescribeFeatureType から読み取った属性から作成したフィールドでフォームを作成する方法を示します。

WFS の DescribeFeatureType は FeatureType の XSD スキーマ情報(プロパティの名前と FeatureType に関連付けられている型)を返します。

次のコマンドでデータを取得します。

$ wget -O mapserver_shinkansen_DFT.xml "http://localhost/cgi-bin/mapserver?map=/home/user/mapfile/tokyo_pf_pgis.map/request=DescribeFeatureType&VERSION=1.0.0&SERVICE=WFS&TYPENAME=shinkansen"

$ wget -O mapserver_gyoseikai_DFT.xml "http://localhost/cgi-bin/mapserv?map=/home/nuser/mapfile/tokyo_pf_pgis.map&request=DescribeFeatureType&VERSION=1.0.0&SERVICE=WFS&TYPENAME=gyoseikai"

<?xml version='1.0' encoding="ISO-8859-1" ?>
<schema
targetNamespace="http://mapserver.gis.umn.edu/mapserver"
xmlns:ms="http://mapserver.gis.umn.edu/mapserver"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:gml="http://www.opengis.net/gml"
elementFormDefault="qualified" version="0.1" >

<import namespace="http://www.opengis.net/gml"
schemaLocation="http://schemas.opengis.net/gml/2.1.2/feature.xsd" />

<element name="gyoseikai"
type="ms:gyoseikaiType"
substitutionGroup="gml:_Feature" />

<complexType name="gyoseikaiType">
<complexContent>
<extension base="gml:AbstractFeatureType">
<sequence>
<element name="msGeometry" type="gml:GeometryPropertyType" minOccurs="0" maxOccurs="1"/>
<element name="gid" type="string"/>
<element name="con" type="string"/>
<element name="cn2" type="string"/>
<element name="aac" type="string"/>
<element name="total" type="string"/>
<element name="male" type="string"/>
<element name="female" type="string"/>
<element name="foreigner" type="string"/>
</sequence>
</extension>
</complexContent>
</complexType>

</schema>


WFS のバージョンの VERSION=1.0.0 では、GML のバージョン 2.1.2 を出力し、VERSION=1.1.0 では、GML のバージョン 3.1.1 を出力します。
しかし、両方とも制限(restriction)部分は出力されませんでした。
GML のバージョン 2.1.2.1
ファイルを Exlipse にインポートします。


JS ファイルを新規作成します。
「openlayersTokyoproj」 を右クリックして 新規 -> JavaScript ファイル をクリック。
「JavaScript ファイル」ウィンドウの「ファイル名(任意:attribute-form.js)」に入力して「完了」ボタンをクリック。
以下のように JavaScript を作成します。


var form;

Ext.onReady(function() {
Ext.QuickTips.init(); // エラー表示用

// create attributes store
var attributeStore = new GeoExt.data.AttributeStore({ // 属性データのストアを作成
// url: "data/describe_feature_type.xml"
url: "./mapserver_shinkansen_DFT.xml" // MapServer の DescribeFeatureType データ
});

form = new Ext.form.FormPanel({ // 基本的なフォームコンテナ
renderTo: document.body,
autoScroll: true,
height: 300,
width: 350,
defaults: { // 初期設定
width: 120,
maxLengthText: "too long",
minLengthText: "too short"
},
plugins: [ // 機能の追加
new GeoExt.plugins.AttributeForm({
attributeStore: attributeStore
})
]
});

attributeStore.load();
});


HTML ファイルを新規作成します。
「openlayersTokyoproj」 を右クリックして 新規 -> HTML ファイル をクリック。
「HTML ファイル」ウィンドウの「ファイル名(任意:geoext11_attr-form.html)」に入力して「完了」ボタンをクリック。
「charset」を「utf-8」にします。
以下のように HTML を作成します。
geoext10_feature-grid.html をコピーし、 外部 JavaScript 読み込みファイルを修正し body タグ内には何も設定しません。

---
<title>GeoExt11 Attribute Form</title>
---
<!-- attributes.js 追加 -->
<script type="text/javascript" src="./attributes.js"></script>

</head>
<body>
<h1 id="title">GeoExt 11 - Attribute Form</h1>
<p id="shortdesc">
GeoExt Attribute Form
</p>
<p>This example shows how to create a form with fields creates from
attributes read from a WFS DescribeFeatureType response. This can be
useful when doing feature editing with WFS-T.</p>

<p>Note that validation is activated based on the restriction
information read from the DescribeFeatureType document. For example the
"STATE_NAME", "STATE_FIPS", "SUB_REGION", and "STATE_ABBR" text fields
indicate errors if more than 5 characters are entered.</p>

<p>この例では、WFS DescribeFeatureType 応答から読み取った属性から作成したフィールドを
持つフォームを作成する方法を示しています。 WFS-T でフィーチャの編集を行うときにこれが
役立つことがあります。</p>

<p>検証は DescribeFeatureType ドキュメントから読み込んだ制限情報に基づいてアクティブに
なっていることに注意してください。 たとえば、5つ以上の文字が入力されている場合、
"STATE_NAME"、 "STATE_FIPS" 、 "SUB_REGION"、 および "STATE_ABBR"
テキストフィールドは、エラーを示しています。</p>
</body>
</html>

2010年11月24日水曜日

GeoExt10 Grid with Feature - フィーチャデータのグリッド表示

Grid Panel configured with a GeoExt.data.FeatureStore

GeoJSONドキュメント(mapserver_tokyo.json)から読み込んだフィーチャを読み込んだ Ext グリッドを表示します。

tokyo_pf_pgis.map の gyoseikai レイヤに東京都の人口を追加して GeoJSON データを作成します。
tokyo_pf_pgis.map をつぎのように修正します。

---
DATA "the_geom from (
SELECT gyoseikai.gid AS gid,
gyoseikai.con AS con,
gyoseikai.cn2 AS cn2,
gyoseikai.aac AS aac,
gyoseikai.the_geom AS the_geom,
population.total AS total,
population.male AS male,
population.female AS female,
population.foreigner AS foreigner
FROM gyoseikai LEFT OUTER JOIN population ON gyoseikai.aac = population.aac
)
AS gyosei_pop USING UNIQUE gid USING SRID=-1"
---

次に gyoseikai レイヤの WFS データを出力します。
(データ量が多いので23区だけ出力します。)

///// 参考 /////
MapServer の WFS Filter Encoding サイト
http://mapserver.org/ogc/filter_encoding.html

の検索文字列のフィルタの例より次のコマンドを実行しました。

$ wget -O mapserver_gyoseikai.xml "http://localhost/cgi-bin/mapserv?map=/home/nob61/mapfile/tokyo_pf_pgis.map&request=GetFeature&VERSION=1.0.0&SERVICE=WFS&TYPENAME=gyoseikai&Filter=<Filter><PropertyIsLessThan><PropertyName>aac</PropertyName><Literal>13124</Literal></PropertyIsLessThan></Filter>"

prepare_database(): Query error. Error declaring cursor: ERROR: operator does not exist: character varying < integer
LINE 13: AS gyosei_pop WHERE ( (aac< 13124) ) and (the_geom && setS...
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.

aac の型が文字列になっているのでエラーになったと思われます。

$ wget -O mapserver_gyoseikai.xml "http://localhost/cgi-bin/mapserv?map=/home/nob61/mapfile/tokyo_pf_pgis.map&request=GetFeature&VERSION=1.0.0&SERVICE=WFS&TYPENAME=gyoseikai&Filter=<Filter><PropertyIsLike wildcard='*' singleChar='.' escape='!'><PropertyName>con</PropertyName><Literal>*区</Literal></PropertyIsLike></Filter>"
bash: !: event not found

と表示されます。

How does one escape special characters when writing SQL queries? サイトに
http://www.orafaq.com/faq/how_does_one_escape_special_characters_when_writing_sql_queries

SQL クエリのエスケープキャラクタが "_" であるとあります。
これで23区のデータが出力されました。
///// ここまで /////

今回は範囲を限定して出力しました。

$ wget -O mapserver_gyoseikai.xml "http://localhost/cgi-bin/mapserv?map=/home/nob61/mapfile/tokyo_pf_pgis.map&request=GetFeature&VERSION=1.0.0&SERVICE=WFS&TYPENAME=gyoseikai&bbox=139.62,35.53,139.90,35.80"

出力したデータを GeoJSON データに変換します。

$ ogr2ogr -f "GeoJSON" mapserver_gyoseikai.json mapserver_gyoseikai.xml

mapserver_gyoseikai.json を Eclipse にインポートします。


Example サイト
http://www.geoext.org/examples.html

「Grid with Feature」リンクをクリックすると Grid Panel configured with a GeoExt.data.FeatureStore が表示されます。
feature-grid.js を参考にします。

説明を意訳すると、GeoJSONドキュメントから読み込んだフィーチャを読み込んだ Ext グリッドを示しています。

JS ファイルを新規作成します。
「openlayersTokyoproj」 を右クリックして 新規 -> JavaScript ファイル をクリック。
「JavaScript ファイル」ウィンドウの「ファイル名(任意:feature-grid.js)」に入力して「完了」ボタンをクリック。

var mapPanel, store, gridPanel, mainPanel;

Ext.onReady(function() {
// create map instance
// var map = new OpenLayers.Map();
// 東京都マップ表示
var map = new OpenLayers.Map('map', {
controls: [
new OpenLayers.Control.PanZoom(),
new OpenLayers.Control.LayerSwitcher(),
new OpenLayers.Control.MousePosition(),
new OpenLayers.Control.ScaleLine()
],
projection: new OpenLayers.Projection("EPSG:2456"),
maxResolution: 'auto',
maxExtent: new OpenLayers.Bounds(-279000,1054000,-185000,1104000),
units: 'meters',
displayProjection: new OpenLayers.Projection("EPSG:4326")
});


/*
var wmsLayer = new OpenLayers.Layer.WMS(
"vmap0",
"http://vmap0.tiles.osgeo.org/wms/vmap0",
{layers: 'basic'}
);
*/
var layer1 = new OpenLayers.Layer.WMS( "Tokyo Height WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_bmi_pgis_img2.map',
layers: 'height',
format: 'image/png'
});
var layer2 = new OpenLayers.Layer.WMS( "Tokyo Kukaku Sen WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_bmi_pgis_img2.map',
layers: 'kukaku',
transparent: true,
format: 'image/png'
});


// create vector layer
var vecLayer = new OpenLayers.Layer.Vector("vector");
map.addLayers([layer1, layer2, vecLayer]);


// create map panel
mapPanel = new GeoExt.MapPanel({
title: "Map",
region: "center",
height: 400,
width: 600,
map: map,
// center: new OpenLayers.LonLat(5, 45),
// zoom: 6
});


// create feature store, binding it to the vector layer
store = new GeoExt.data.FeatureStore({
layer: vecLayer,
fields: [
// {name: 'name', type: 'string'},
// {name: 'elevation', type: 'float'}
{name: 'con', type: 'string'}, // 郡、区名
{name: 'cn2', type: 'string'}, // 市町村名
{name: 'total', type: 'float'} // 人口
],
proxy: new GeoExt.data.ProtocolProxy({
protocol: new OpenLayers.Protocol.HTTP({
// url: "data/summits.json",
url: "./mapserver_gyoseikai.json", // gyoseikai JSON ファイル
format: new OpenLayers.Format.GeoJSON(
{
'internalProjection': new OpenLayers.Projection("EPSG:2456"),
'externalProjection': new OpenLayers.Projection("EPSG:4326")
}
)
}),
}),
autoLoad: true
});


// create grid panel configured with feature store
gridPanel = new Ext.grid.GridPanel({
title: "Feature Grid",
region: "east",
store: store,
width: 320,
columns: [{
// header: "Name",
header: "区、郡",
// width: 200,
width: 100,
// dataIndex: "name"
dataIndex: "con",
sortable: true
},{
// header: "Elevation",
header: "市町村",
width: 100,
// dataIndex: "elevation"
dataIndex: "cn2"
},{ // ここから「人口」を追加
header: "人口",
width: 100,
dataIndex: "total"
}],
sm: new GeoExt.grid.FeatureSelectionModel()
});


// create a panel and add the map panel and grid panel
// inside it
mainPanel = new Ext.Panel({
renderTo: "mainpanel",
layout: "border",
height: 400,
width: 920,
items: [mapPanel, gridPanel]
});
});

HTML ファイルを新規作成します。
「openlayersTokyoproj」 を右クリックして 新規 -> HTML ファイル をクリック。
「HTML ファイル」ウィンドウの「ファイル名(任意:geoext10_feature-grid.html)」に入力して「完了」ボタンをクリック。
「charset」を「utf-8」にします。
以前使用した OpenLayers.Layer.WMS レイヤの例を参考に以下のように HTML を作成します。
(geoext08_map-tool.html をコピーし feature-grid.js を追加し body タグ内を修正します。)

---
<title>GeoExt10 Grid with Feature</title>
---
<!-- feature-grid.js 追加 -->
<script type="text/javascript" src="./feature-grid.js"></script>
</head>
<body>
<h1 id="title">GeoExt 10 - Grid with Feature</h1>
<p id="shortdesc">
Grid Panel configured with a GeoExt.data.FeatureStore
</p>
<p>This example shows an Ext grid loaded with features read from
a GeoJSON document (data/summits.json).Because the layer and
the store are bound to each other, the features loaded into the store
are automatically added to the layer. A GeoExt feature selection model
is also used so that selecting rows in the grid selects features in the
layer, and vice-versa.<p>
<p>この例では、GeoJSONドキュメント(data/summits.json)から読み込んだ
フィーチャを読み込んだ Ext グリッドを示しています。レイヤとストアは、お互いに
バインドされているので、フィーチャはレイヤを自動的に追加されたストアにロードします。
GeoExt フィーチャ選択モデルは、レイヤ中のフィーチャを選択するグリッド内の行を
選択するために、もしくはその逆に使用されます。</p>

<div id="mainpanel"></div>

</body>
</html>

2010年11月23日火曜日

GeoExt09 Vector Data Tutorial

Vector Data Tutorial サイト
http://www.geoext.org/tutorials/remote-features-tutorial.html

のチュートリアルに従って、マップの背後にあるデータを取得するために、マップ上の各フィーチャについての情報を提供するKMLファイル形式を介して提供されるベクトルデータを使用します。

Map Tool tutorial の HTML コードを使います。
HTML ファイルを新規作成します。
「openlayersTokyoproj」 を右クリックして 新規 -> HTML ファイル をクリック。
「HTML ファイル」ウィンドウの「ファイル名(任意:geoext09_vector-data.html)」に入力して「完了」ボタンをクリック。
geoext07_map-tool.html をすべてコピーし、貼り付けます。
以下のように修正します。


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>GeoExt09 Vector Data</title>
<link rel="stylesheet" href="./theme/default/style.css" type="text/css" />
<link rel="stylesheet" href="./examples/style.css" type="text/css" />

<script src="./lib/Firebug/firebug.js"></script>
<script src="./OpenLayers-2.10/lib/OpenLayers.js"></script>

<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>
<!-- 追加 -->
<script src="./ext-3.2.1/adapter/ext/ext-base.js" type="text/javascript"></script>
<script src="./ext-3.2.1/ext-all.js" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="./ext-3.2.1/resources/css/ext-all.css"></link> <!-- 修正 -->
<!-- <script src="OpenLayers/OpenLayers.js" type="text/javascript"></script> -->
<script src="./GeoExt/lib/GeoExt.js" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="./GeoExt/resources/css/geoext-all-debug.css"></link> <!-- 修正 -->


<script type="text/javascript">
var map, layer1, layer2;
/* var lon = 139.4;
var lat = 35.7;
var zoom = 10;
*/
Ext.onReady(function () {
map = new OpenLayers.Map('map', {
projection: new OpenLayers.Projection("EPSG:2456"),
maxResolution: 'auto',
maxExtent: new OpenLayers.Bounds(-279000,1054000,-185000,1104000),
units: 'meters',
displayProjection: new OpenLayers.Projection("EPSG:4326")
});


layer1 = new OpenLayers.Layer.WMS( "Tokyo Height WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_bmi_pgis_img2.map',
layers: 'height',
isBaselayer: true,
format: 'image/png'
});

layer2 = new OpenLayers.Layer.WMS( "Tokyo Kukaku Sen WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_bmi_pgis_img2.map',
layers: 'kukaku',
transparent: true,
format: 'image/png'
});


var sundials = new OpenLayers.Layer.Vector("西立川駅"); // 追加 sundials

map.addLayers([layer1, layer2]);
map.addLayer(sundials); // 追加
map.addControl(new OpenLayers.Control.LayerSwitcher());
map.addControl(new OpenLayers.Control.MousePosition());
map.addControl(new OpenLayers.Control.ScaleLine());
map.zoomToMaxExtent();


var store = new GeoExt.data.FeatureStore({
layer: sundials,
proxy: new GeoExt.data.ProtocolProxy({
protocol: new OpenLayers.Protocol.HTTP({ //ベクトルレイヤのための基本的な HTTP プロトコル
// url: "sundials.kml",
url: "西立川駅.kml",
format: new OpenLayers.Format.KML(
{ // ここからプロジェクション変更のため追加
'internalProjection': new OpenLayers.Projection("EPSG:2456"),
'externalProjection': new OpenLayers.Projection("EPSG:4326")
}
)
})
}),
fields: [
// {name: 'title', type: 'string'},
// {name: 'description', type: 'string'}
{name: 'name', type: 'string'}, // '西立川駅.kml' に合わせて修正
{name: 'description', type: 'object'} // '西立川駅.kml' に合わせて修正
],
autoLoad: true
});


// new GeoExt.MapPanel({
var mapPanel = new GeoExt.MapPanel({
renderTo: 'gxmap',
height: 400,
width: 600,
map: map,
// title: 'Sundials'
title: '西立川駅'
});

var layerList = new GeoExt.tree.LayerContainer({
text: 'All Layers',
layerStore: mapPanel.layers,
leaf: false,
expanded: true //,
});

var layerTree = new Ext.tree.TreePanel({
title: 'Map Layers',
renderTo: 'layerTree',
enableDD: true, // 追加
root: layerList //,
});


new Ext.grid.GridPanel({
title: '西立川駅',
store: store,
// columns: [{heading: 'Title', dataIndex: 'title'},
// {heading: 'Description', dataIndex: 'description'}],
columns: [ // '西立川駅.kml' に合わせて修正
{header: 'Name', dataIndex: 'name'},
{header: 'Description', dataIndex: 'description', width: 600}
],
renderTo: "grid",
width: 600,
height: 600
});

});

</script>
</head>


<body>

<h1 id="title">GeoExt09 Vector Data Tutorial</h1>
<div id="tags"></div>
<p id="shortdesc">
GeoExt JS Vector Data Tutorial.
</p>
<!-- <div id="map" class="smallmap"></div> -->
<div id="gxmap"></div>
<div id="layerTree"></div>
<div id="grid"></div>
<div id="docs">
<p>GeoExt JS の Vector Data Tutorial を参考に地図を表示します。</p>
</div>

</body>
</html>

'西立川駅.kml' の内容

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.2">
<Folder creator="iPhotoToGoogleEarth http://craig.stanton.net.nz">
<name>西立川駅</name>
<open>1</open>
<description>JR青梅線</description>
<Placemark>
<name>NEC_0036.JPG</name>
<snippet></snippet>
<Snippet maxLines="0"></Snippet>
<description><![CDATA[<center><img src="NEC_0036.JPG"><br></center>]]></description>
<Point>
<coordinates>139.393723,35.703873,0</coordinates>
</Point>
</Placemark>
</Folder>
</kml>

2010年11月22日月曜日

GeoExt 08 Toolbar with Actions - OpenLayers コントロールを追加

Example サイト
http://www.geoext.org/examples.html

「Toolbar with Actions」リンクをクリックすると OpenLayers controls in an Ext toolbar が表示されます。
toolbar.js を参考にします。

説明を意訳すると、GeoExt.Action クラスを使って OpenLayers コントロールを追加する方法を示します。

JS ファイルを新規作成します。
「openlayersTokyoproj」 を右クリックして 新規 -> JavaScript ファイル をクリック。
「JavaScript ファイル」ウィンドウの「ファイル名(任意:toolbar.js)」に入力して「完了」ボタンをクリック。
GeoExt 06 で使用したレイヤの例を参考に以下のように JavaScript を作成します。


Ext.onReady(function() {
Ext.QuickTips.init();

// var map = new OpenLayers.Map();
var map = new OpenLayers.Map('map', {
controls: [
new OpenLayers.Control.PanZoom(),
new OpenLayers.Control.LayerSwitcher(),
new OpenLayers.Control.MousePosition(),
new OpenLayers.Control.ScaleLine()
],
allOverlays: false,
projection: new OpenLayers.Projection("EPSG:2456"),
maxResolution: 'auto', // '183.594', '367.1875',
maxExtent: new OpenLayers.Bounds(-279000,1054000,-185000,1104000),
units: 'meters',
displayProjection: new OpenLayers.Projection("EPSG:4326")
});


/*
var wms = new OpenLayers.Layer.WMS(
"Global Imagery",
"http://maps.opengeo.org/geowebcache/service/wms",
{layers: "bluemarble"}
);
*/
var layer1 = new OpenLayers.Layer.WMS( "Tokyo Height WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_bmi_pgis_img2.map',
layers: 'height',
// isBaselayer: true,
format: 'image/png'
});
var layer2 = new OpenLayers.Layer.WMS( "Tokyo Kukaku Sen WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_bmi_pgis_img2.map',
layers: 'kukaku',
transparent: true,
format: 'image/png'
});
var vector = new OpenLayers.Layer.Vector("vector");
// map.addLayers([wms, vector]);
map.addLayers([layer1, layer2, vector]);


var ctrl, toolbarItems = [], action, actions = {};
// コントロールボタンを追加するツールバー

// ZoomToMaxExtent control, a "button" control
action = new GeoExt.Action({ // OpenLayers コントロールを追加
control: new OpenLayers.Control.ZoomToMaxExtent(),
map: map,
text: "max extent",
tooltip: "zoom to max extent"
});
actions["max_extent"] = action;
toolbarItems.push(action);
toolbarItems.push("-");


// Navigation control and DrawFeature controls
// in the same toggle group
action = new GeoExt.Action({
text: "nav",
control: new OpenLayers.Control.Navigation(), // パン・ズーム
map: map,
// button options
toggleGroup: "draw", // 同一グループは同時に動作しない
allowDepress: false,
pressed: true,
tooltip: "navigate",
// check item options
group: "draw",
checked: true
});
actions["nav"] = action;
toolbarItems.push(action);


action = new GeoExt.Action({
text: "draw poly",
control: new OpenLayers.Control.DrawFeature( // ポリゴン(面)描画
vector, OpenLayers.Handler.Polygon
),
map: map,
// button options
toggleGroup: "draw",
allowDepress: false,
tooltip: "draw polygon",
// check item options
group: "draw"
});
actions["draw_poly"] = action;
toolbarItems.push(action);


action = new GeoExt.Action({
text: "draw line",
control: new OpenLayers.Control.DrawFeature( // パス(線)描画
vector, OpenLayers.Handler.Path
),
map: map,
// button options
toggleGroup: "draw",
allowDepress: false,
tooltip: "draw line",
// check item options
group: "draw"
});
actions["draw_line"] = action;
toolbarItems.push(action);
toolbarItems.push("-");


// SelectFeature control, a "toggle" control
action = new GeoExt.Action({
text: "select",
control: new OpenLayers.Control.SelectFeature(vector, { // 選択
type: OpenLayers.Control.TYPE_TOGGLE,
hover: true
}),
map: map,
// button options
enableToggle: true,
tooltip: "select feature"
});
actions["select"] = action;
toolbarItems.push(action);
toolbarItems.push("-");


// Navigation history - two "button" controls
ctrl = new OpenLayers.Control.NavigationHistory(); // 前(次)画面
map.addControl(ctrl);

action = new GeoExt.Action({
text: "previous",
control: ctrl.previous,
disabled: true,
tooltip: "previous in history"
});
actions["previous"] = action;
toolbarItems.push(action);

action = new GeoExt.Action({
text: "next",
control: ctrl.next,
disabled: true,
tooltip: "next in history"
});
actions["next"] = action;
toolbarItems.push(action);
toolbarItems.push("->");


// Reuse the GeoExt.Action objects created above
// as menu items
toolbarItems.push({
text: "menu",
menu: new Ext.menu.Menu({
items: [
// ZoomToMaxExtent
actions["max_extent"],
// Nav
new Ext.menu.CheckItem(actions["nav"]),
// Draw poly
new Ext.menu.CheckItem(actions["draw_poly"]),
// Draw line
new Ext.menu.CheckItem(actions["draw_line"]),
// Select control
new Ext.menu.CheckItem(actions["select"]),
// Navigation history control
actions["previous"],
actions["next"]
]
})
});


var mapPanel = new GeoExt.MapPanel({
renderTo: "mappanel",
height: 400,
width: 600,
map: map,
// center: new OpenLayers.LonLat(5, 45),
// zoom: 4,
tbar: toolbarItems
});
});


HTML ファイルを新規作成します。
「openlayersTokyoproj」 を右クリックして 新規 -> HTML ファイル をクリック。
「HTML ファイル」ウィンドウの「ファイル名(任意:geoext08_map-tool.html)」に入力して「完了」ボタンをクリック。
「charset」を「utf-8」にします。
以前使用した OpenLayers.Layer.WMS レイヤの例を参考に以下のように HTML を作成します。
(geoext05_layer-tree.html をコピーし tree.js を追加し body タグ内を修正します。)

---
<title>GeoExt08 Toolbar with Actions</title>
---
<!-- tool.js 追加 -->
<script type="text/javascript" src="./tool.js"></script>

<!-- スタイルシート 追加 -->
<style type="text/css">
/* work around an Ext bug that makes the rendering of
menu items not as one would expect */
.ext-ie .x-menu-item-icon {
left: -24px;
}
.ext-strict .x-menu-item-icon {
left: 3px;
}
.ext-ie6 .x-menu-item-icon {
left: -24px;
}
.ext-ie7 .x-menu-item-icon {
left: -24px;
}
</style>

</head>


<body>
<h1 id="title">GeoExt 08 Toolbar with Actions - OpenLayers コントロールを追加</h1>
<p id="shortdesc">
OpenLayers controls in an Ext toolbar
</p>
<p>This example shows how to add OpenLayers controls in an
Ext toolbar.
GeoExt provides the GeoExt.Action class for adapting a control
to an object that can be inserted in a toolbar or in a menu.<p>
<p>この例では、外部のツールバーにある OpenLayers コントロールを追加する
方法を示します。
GeoExtは、ツールバーまたはメニューに挿入することができるオブジェクトへ
コントロールを適応するための GeoExt.Action クラスを提供します。</p>

<div id="mappanel"></div>

</body>
</html>

2010年11月20日土曜日

GeoExt 07 - Map Tool Tutorial

ここでは、OpenLayers のコントロールパネルを設定します。
チュートリアルに従って測定コントロール(OpenLayers.Control.Measure)を追加します。
ツール(コントロール)のオンオフはボタン(ExtJS Button)を使います。

Layer Tree tutorial の最初の HTML コードを使います。
HTML ファイルを新規作成します。
「openlayersTokyoproj」 を右クリックして 新規 -> HTML ファイル をクリック。
「HTML ファイル」ウィンドウの「ファイル名(任意:geoext07_map-tool.html)」に入力して「完了」ボタンをクリック。
geoext02_layer-tree.html をすべてコピーし、貼り付けます。
以下のように修正します。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>GeoExt07 Map Tool Tutorial</title>
<link rel="stylesheet" href="./theme/default/style.css" type="text/css" />
<link rel="stylesheet" href="./examples/style.css" type="text/css" />

<script src="./lib/Firebug/firebug.js"></script>
<script src="./OpenLayers-2.10/lib/OpenLayers.js"></script>

<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>

<script src="./ext-3.2.1/adapter/ext/ext-base.js" type="text/javascript"></script>
<script src="./ext-3.2.1/ext-all.js" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="./ext-3.2.1/resources/css/ext-all.css"></link>

<script src="./GeoExt/lib/GeoExt.js" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="./GeoExt/resources/css/geoext-all-debug.css"></link>


<script type="text/javascript">
var map, layer1, layer2;

Ext.onReady(function () {
map = new OpenLayers.Map('map', {
projection: new OpenLayers.Projection("EPSG:2456"),
maxResolution: 'auto',
maxExtent: new OpenLayers.Bounds(-279000,1054000,-185000,1104000),
units: 'meters',
displayProjection: new OpenLayers.Projection("EPSG:4326")
});


layer1 = new OpenLayers.Layer.WMS( "Tokyo Height WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_bmi_pgis_img2.map',
layers: 'height',
isBaselayer: true,
format: 'image/png'
});
layer2 = new OpenLayers.Layer.WMS( "Tokyo Kukaku Sen WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_bmi_pgis_img2.map',
layers: 'kukaku',
transparent: true,
format: 'image/png'
});


map.addLayers([layer1, layer2]);
map.addControl(new OpenLayers.Control.LayerSwitcher());
map.addControl(new OpenLayers.Control.MousePosition());
map.addControl(new OpenLayers.Control.ScaleLine());
map.zoomToMaxExtent();


var mapPanel = new GeoExt.MapPanel({
renderTo: 'gxmap',
height: 400,
width: 600,
map: map,
title: 'A GeoExt Tree'
});

var layerList = new GeoExt.tree.LayerContainer({
text: 'All Layers',
layerStore: mapPanel.layers,
leaf: false,
expanded: true
});

var layerTree = new Ext.tree.TreePanel({
title: 'Map Layers',
renderTo: 'layerTree',
root: layerList
});

--- ここまで geoext02_map-tool.html と同じ ---

var control = new OpenLayers.Control.Measure(OpenLayers.Handler.Path, {
eventListeners: {
measure: function(evt) {
alert("The measurement was " + evt.measure + evt.units);
}
}
});


mapPanel.map.addControl(control);

var button = new Ext.Button({
text: 'Measure Things',
renderTo: measure,
enableToggle: true,
handler: function(toggled){
if (toggled) {
control.activate();
} else {
control.deactivate();
}
}
});

});

</script>
</head>


<body>
<h1 id="title">GeoExt 07 Map Tool</h1>
<p id="shortdesc">
GeoExt JS Map Tool Tutorial.
</p>
<div id="gxmap"></div>
<div id="layerTree"></div>
<div id="measure"></div><!-- 追加 -->
<div id="docs">
<!-- 修正 -->
<p>GeoExt JS の Map Tool Tutorial を参考に地図を表示します。</p>
</div>
</body>
</html>

mapPanel.getTopToolbar().addButton(button);
は後で。

複数のツールがマップに関連付けられているときは、複数のツールが同時にアクティブになることを避けます。
「There Can Be Only One」を参考にコードを修正します。

---
var length = new OpenLayers.Control.Measure(OpenLayers.Handler.Path, {
eventListeners: {
measure: function(evt) {
alert("The length was " + evt.measure + evt.units);
}
}
});


// 追加
var area = new OpenLayers.Control.Measure(OpenLayers.Handler.Polygon, {
eventListeners: {
measure: function(evt) {
alert("The area was " + evt.measure + evt.units);
}
}
});
mapPanel.map.addControl(length);
mapPanel.map.addControl(area); // 追加

var measureCtrl = "measure controls"; // 追加


var lengthbutton = new Ext.Button({
text: 'Measure length',
renderTo: measureLength,
enableToggle: true,
toggleGroup: measureCtrl,
handler: function(toggled){
if (toggled) {
length.activate();
} else {
length.deactivate();
}
}
});


var areabutton = new Ext.Button({
text: 'Measure Area',
renderTo: measureArea,
enableToggle: true,
toggleGroup: measureCtrl,
handler: function(toggled){
if (toggled) {
area.activate();
} else {
area.deactivate();
}
}
});
</script>
</head>


<body>
<h1 id="title">GeoExt03 Map Tool Tutorial</h1>
<div id="tags"></div>
<p id="shortdesc">
GeoExt JS Map Tool Tutorial.
</p>
<div id="gxmap"></div>
<div id="layerTree"></div>
<div id="measureLength"></div>
<div id="measureArea"></div>
<div id="docs">
<p>GeoExt JS の Map Tool Tutorial を参考に地図を表示します。</p>
</div>
</body>
</html>

2010年11月18日木曜日

GeoExt 06 Tree Node Example

Example サイト
http://www.geoext.org/examples.html

「Layer Node」リンクをクリックすると GeoExt.tree Components が表示されます。
tree.js を参考にします。

説明を意訳すると、GeoExt はLayerContainer や LayerNodes と ExtJS の TreePanel でツリーを作成します。

JS ファイルを新規作成します。
「openlayersTokyoproj」 を右クリックして 新規 -> JavaScript ファイル をクリック。
「JavaScript ファイル」ウィンドウの「ファイル名(任意:tree.js)」に入力して「完了」ボタンをクリック。
GeoExt 05 で使用したレイヤの例を参考に以下のように JavaScript を作成します。


var mapPanel, tree;
Ext.onReady(function() {
// create a map panel with some layers that we will show in our layer tree
// below.
mapPanel = new GeoExt.MapPanel({
border: true,
region: "center",
// we do not want all overlays, to try the OverlayLayerContainer
// map: new OpenLayers.Map({allOverlays: false}),
map: new OpenLayers.Map('map', { // 東京都地図用設定
controls: [
new OpenLayers.Control.PanZoom(),
// new OpenLayers.Control.LayerSwitcher(),
new OpenLayers.Control.MousePosition(),
new OpenLayers.Control.ScaleLine()
],
allOverlays: false,
projection: new OpenLayers.Projection("EPSG:2456"),
maxResolution: 'auto', // '183.594', '367.1875',
maxExtent: new OpenLayers.Bounds(-279000,1054000,-185000,1104000),
units: 'meters',
displayProjection: new OpenLayers.Projection("EPSG:4326")
}),
// center: [146.1569825, -41.6109735],
// zoom: 6,


layers: [
new OpenLayers.Layer.WMS( "Tokyo Height WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_bmi_pgis_img2.map',
layers: 'height',
// isBaselayer: true,
format: 'image/png'
}
),


new OpenLayers.Layer.WMS( "Tokyo Kukaku Sen WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_bmi_pgis_img2.map',
layers: 'kukaku',
transparent: true,
format: 'image/png'
}
),


new OpenLayers.Layer.WMS( "Railroad Shinkansen WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_pf_pgis.map',
layers: 'shinkansen',
transparent: true,
format: 'image/png'
},{
projection: new OpenLayers.Projection("EPSG:4326")
}
),


new OpenLayers.Layer.WMS( "Railroad JR Line WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_pf_pgis.map',
layers: 'jrline',
transparent: true,
format: 'image/png'
},{
projection: new OpenLayers.Projection("EPSG:4326")
}
),


new OpenLayers.Layer.WMS( "Railroad Public Line WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_pf_pgis.map',
layers: 'publicline',
transparent: true,
format: 'image/png'
},{
projection: new OpenLayers.Projection("EPSG:4326")
}
),


new OpenLayers.Layer.WMS( "Railroad Private Line WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_pf_pgis.map',
layers: 'privateline',
transparent: true,
format: 'image/png'
},{
projection: new OpenLayers.Projection("EPSG:4326")
}
),


new OpenLayers.Layer.WMS( "Railroad Third Sector Line WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_pf_pgis.map',
layers: 'thirdsec',
transparent: true,
format: 'image/png'
},{
projection: new OpenLayers.Projection("EPSG:4326")
}
),


// create a group layer (with several layers in the "layers" param)
// to show how the LayerParamLoader works
new OpenLayers.Layer.WMS("Railroad (Group Layer)",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_pf_pgis.map',
layers: [
"shinkansen",
"jrline",
"publicline",
"privateline",
"thirdsec"
],
transparent: true,
format: "image/png"
}, {
isBaseLayer: false,
buffer: 0,
// exclude this layer from layer container nodes
displayInLayerSwitcher: false,
visibility: false
}
)
]
});

// create our own layer node UI class, using the TreeNodeUIEventMixin
// TreeNodeUIEventMixin を使用して、独自のレイヤノードのUIクラスを作成
// GeoExt.tree.LayerNodeUI, ... という使い方をする

var LayerNodeUI = Ext.extend(GeoExt.tree.LayerNodeUI, new GeoExt.tree.TreeNodeUIEventMixin());

// using OpenLayers.Format.JSON to create a nice formatted string of the
// configuration for editing it in the UI
// OpenLayers.Format.JSON を使用して、UI で編集するための良くできた書式設定された
// 文字列の設定を作成する

var treeConfig = new OpenLayers.Format.JSON().write([{
nodeType: "gx_baselayercontainer" // ベースレイヤツリーノード(固有値)
}, {
nodeType: "gx_overlaylayercontainer", // オーバーレイヤツリーノード(固有値)
expanded: true,

// render the nodes inside this container with a radio button,
// and assign them the group "foo".
// ラジオボタンを使用して、このコンテナ内のノードをレンダリングし、
// それらをグループ "foo" に割り当てることができる。

loader: {
baseAttrs: {
radioGroup: "foo",
uiProvider: "layernodeui"
}
}
}, {
nodeType: "gx_layer", // グループレイヤツリーノード(固有値)
layer: "Railroad (Group Layer)",
isLeaf: false,
// create subnodes for the layers in the LAYERS param. If we assign
// a loader to a LayerNode and do not provide a loader class, a
// LayerParamLoader will be assumed.
// レイヤパラメータのレイヤーのサブノードを作成します。
// LayerNode にローダーを割り当て、ローダークラスを提供しない場合は、
// LayerParamLoader が仮定されます。
loader: {
param: "LAYERS"
}
}], true);


// create the tree with the configuration from above
// 上記の構成ツリーを作成する
tree = new Ext.tree.TreePanel({
border: true,
region: "west",
title: "Layers",
width: 200,
split: true,
collapsible: true, // 折りたたみ可
collapseMode: "mini", // 折りたたみモード
autoScroll: true,
plugins: [
new GeoExt.plugins.TreeNodeRadioButton({
listeners: {
"radiochange": function(node) {
alert(node.text + " is now the active layer.");
}
}
})
],


loader: new Ext.tree.TreeLoader({
// applyLoader has to be set to false to not interfer with loaders
// of nodes further down the tree hierarchy
// applyLoader は、ツリーレイヤのさらに下位ノードのローダーと干渉しないように
// falseに設定する必要があります
applyLoader: false,
uiProviders: {
// カスタム Ext.tree.TreeNodeUI 実装を指定するプロパティを含むオブジェクト。
// 返される子ノードのオプション uiProvider 属性が、TreeNodeUI の実装の参照以上の
// 文字列の場合、その文字列値は uiProviders オブジェクトのプロパティ名として使用される。
"layernodeui": LayerNodeUI
}
}),
root: {
nodeType: "async",
// the children property of an Ext.tree.AsyncTreeNode is used to
// provide an initial set of layer nodes. We use the treeConfig
// from above, that we created with OpenLayers.Format.JSON.write.
// Ext.tree.AsyncTreeNode の子プロパティは、レイヤノードの初期セットを
// 提供するために使用されています。OpenLayers.Format.JSON.write で作成された
// 上記から treeConfig を使用します。
children: Ext.decode(treeConfig)
},


listeners: {
"radiochange": function(node){
alert(node.layer.name + " is now the the active layer.");
}
},
rootVisible: false,
lines: false,
bbar: [{
text: "Show/Edit Tree Config",
handler: function() {
treeConfigWin.show();
Ext.getCmp("treeconfig").setValue(treeConfig);
}
}]
});


// dialog for editing the tree configuration
// ツリー設定を編集するダイアログ
var treeConfigWin = new Ext.Window({
layout: "fit",
hideBorders: true, // 領域間の枠を消す
closeAction: "hide",
width: 300,
height: 400,
title: "Tree Configuration",
items: [{
xtype: "form",
layout: "fit",
items: [{
id: "treeconfig",
xtype: "textarea"
}],
buttons: [{
text: "Save",
handler: function() {
var value = Ext.getCmp("treeconfig").getValue()
try {
var root = tree.getRootNode();
root.attributes.children = Ext.decode(value);
tree.getLoader().load(root);
} catch(e) {
alert("Invalid JSON");
return;
}
treeConfig = value;
treeConfigWin.hide();
}
}, {
text: "Cancel",
handler: function() {
treeConfigWin.hide();
}
}]
}]
});


new Ext.Viewport({ // ブラウザ画面全体をパネルで操作
layout: "fit",
hideBorders: true,
items: {
layout: "border",
deferredRender: false,
items: [mapPanel, tree, { // mapPanel と tree ともう一つのウィンドウ
contentEl: "desc", // div タグの id
region: "east",
bodyStyle: {"padding": "5px"},
collapsible: true,
collapseMode: "mini",
split: true,
width: 200,
title: "Description"
}]
}
});

});

HTML ファイルを新規作成します。
「openlayersTokyoproj」 を右クリックして 新規 -> HTML ファイル をクリック。
「HTML ファイル」ウィンドウの「ファイル名(任意:geoext06_tree-node.html)」に入力して「完了」ボタンをクリック。
「charset」を「utf-8」にします。
以前使用した OpenLayers.Layer.WMS レイヤの例を参考に以下のように HTML を作成します。
(geoext05_layer-tree.html に tree.js を追加し body タグ内を修正します。)

---
<title>GeoExt06 Tree Node</title>
---
<!-- tree.js 追加 -->
<script type="text/javascript" src="./tree.js"></script>

</head>
<body>

<div id="desc">
<h1 id="title">GeoExt 06 - Tree Node</h1>
<p id="shortdesc">
GeoExt.tree Components
</p>
<p>This example shows how to work with a layer tree. The basic
component for building layer trees is the LayerNode, and there are
different types of containers for automatically adding a map's
layers to the tree. The tree configuration of this example is pure
JSON and can be edited live by clicking on the "Show/Edit Tree Config"
button below the layers panel.<p>
<p>この例では、レイヤツリーを動作させる方法を示しています。
レイヤツリーを構築するための基本的なコンポーネントは、LayerNodeで、
マップのレイヤーをツリーに自動的に追加するための違った種類のコンテナがあります。
この例のツリーの設定は、純粋な JSON 形式で、レイヤパネルの下の
"表示/編集ツリー設定" ボタンをクリックすることでライブ編集することができます。</p>
</div>

</body>
</html>

2010年11月16日火曜日

GeoExt 05 Layer Tree Example - Examples 編

Example サイト
http://www.geoext.org/examples.html

「Layer Tree」リンクをクリックすると Layer Tree Example が表示されます。
layercontainer.js を参考にします。

説明を意訳すると、GeoExt はLayerContainer や LayerNodes と ExtJS の TreePanel でツリーを作成します。

JS ファイルを新規作成します。
「openlayersTokyoproj」 を右クリックして 新規 -> JavaScript ファイル をクリック。
「JavaScript ファイル」ウィンドウの「ファイル名(任意:layercontainer.js)」に入力して「完了」ボタンをクリック。
GeoExt 04 で使用したレイヤの例を参考に以下のように JavaScript を作成します。


var store, tree, panel, map, layer1, layer2, layer3, layer4, layer5, layer6, layer7;

Ext.onReady(function() {

// create a new WMS capabilities store
// マップとレイヤのときは GeoExt.data.LayerStore を使用。
map = new OpenLayers.Map('map', {
allOverlays: true,
projection: new OpenLayers.Projection("EPSG:2456"),
maxResolution: 183.59375, //'367.1875', 'auto'
maxExtent: new OpenLayers.Bounds(-279000,1054000,-185000,1104000),
units: 'meters',
displayProjection: new OpenLayers.Projection("EPSG:4326")
});


layer1 = new OpenLayers.Layer.WMS( "Tokyo Height WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_bmi_pgis_img2.map',
layers: 'height',
// isBaselayer: true,
format: 'image/png'
}
);


layer2 = new OpenLayers.Layer.WMS( "Tokyo Kukaku Sen WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_bmi_pgis_img2.map',
layers: 'kukaku',
transparent: true,
format: 'image/png'
}
);


layer3 = new OpenLayers.Layer.WMS( "Railroad Shinkansen WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_pf_pgis.map',
layers: 'shinkansen',
transparent: true,
format: 'image/png'
},{
projection: new OpenLayers.Projection("EPSG:4326")
}
);


layer4 = new OpenLayers.Layer.WMS( "Railroad JR Line WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_pf_pgis.map',
layers: 'jrline',
transparent: true,
format: 'image/png'
},{
projection: new OpenLayers.Projection("EPSG:4326")
}
);


layer5 = new OpenLayers.Layer.WMS( "Railroad Public Line WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_pf_pgis.map',
layers: 'publicline',
transparent: true,
format: 'image/png'
},{
projection: new OpenLayers.Projection("EPSG:4326")
}
);


layer6 = new OpenLayers.Layer.WMS( "Railroad Private Line WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_pf_pgis.map',
layers: 'privateline',
transparent: true,
format: 'image/png'
},{
projection: new OpenLayers.Projection("EPSG:4326")
}
);


layer7 = new OpenLayers.Layer.WMS( "Railroad Third Sector Line WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_pf_pgis.map',
layers: 'thirdsec',
transparent: true,
format: 'image/png'
},{
projection: new OpenLayers.Projection("EPSG:4326")
}
);
map.addLayers([layer1, layer2, layer3, layer4, layer5, layer6, layer7]);
// map.addControl(new OpenLayers.Control.MousePosition());
// map.addControl(new OpenLayers.Control.ScaleLine());
map.zoomToMaxExtent();


/* MapServer の WMS GetCapabilities はグリッドの表示ができません。
GeoServer ならできるのかも。
store = new GeoExt.data.WMSCapabilitiesStore({
url: "http://192.168.1.6/cgi-bin/mapserv?map=/home/nob61/mapfile/tokyo_pf_pgis.map&service=WMS&request=GetCapabilities"
*/
store = new GeoExt.data.LayerStore({ // レイヤのデータの取得
map: map,
layers: map.layers
});
// load the store with records derived from the doc at the above url
// store.load();


// create a grid to display records from the store

var grid = new Ext.grid.GridPanel({
title: "WMS Capabilities",
store: store,
cm: new Ext.grid.ColumnModel([ // グリッドのカラム表示方法
{header: "Name", dataIndex: "name", sortable: true}, // 最初のデータはレイヤ
{id: "title", header: "Title", dataIndex: "title", sortable: true}
]),
sm: new Ext.grid.RowSelectionModel({singleSelect:true}), // 列の選択
autoExpandColumn: "title", // 内容によってカラムを伸縮
renderTo: "capgrid",
height: 300,
width: 350,
floating: true,
x: 10,
y: 0,
bbar: ["->", { // bottom toolbar, テキストに合わせて伸縮
text: "Add Layer",
handler: function() {
var record = grid.getSelectionModel().getSelected(); // グリッドの選択モデルを返す、最初に選択されたレコードを返す
if(record) {
var copy = record.copy(); // レコードのコピー
// Ext 3.X does not allow circular references in objects passed
// to record.set
/* レイヤ表示のパラメータなので必要なし。
copy.data["layer"] = record.getLayer();
copy.getLayer().mergeNewParams({
format: "image/png",
transparent: "true"
});
*/
panel.layers.add(copy); // コピーをパネルに追加
/* マップ表示の範囲設定なので必要なし。
ここではレイヤごとの範囲を設定している。
panel.map.zoomToExtent(
OpenLayers.Bounds.fromArray(copy.get("llbbox"))
);
*/ }
}
}]
});


// create a map panel
panel = new GeoExt.MapPanel({
renderTo: "mappanel",
width: 350,
height: 300,
// map: map, // 追加
floating: true,
x: 570,
y: 0
});


tree = new Ext.tree.TreePanel({
renderTo: "tree",
root: new GeoExt.tree.LayerContainer({
text: 'Map Layers',
layerStore: panel.layers,
leaf: false,
expanded: true
}),
enableDD: true,
width: 170,
height: 300,
floating: true,
x: 380,
y: 0
});

});


マップ map の レゾリューション Resolution
map の設定で

maxResolution: 'auto'

としたとき、FireBug の DOM タブの Window の左の "+" をクリックし、Layer1 の左の "+" をクリックして、maxResolution をみると 94000 になっています。
resolutions の左の "+" をクリックしてみると "94000" から 16 段階(ズーム)になっています。
今回のマップの maxResolution は 

(279000-185000)/256 = 367.1875

ですが、半分の 183.59375 にするとマップが表示されます。

maxResolution: 183.59375,


HTML ファイルを新規作成します。
「openlayersTokyoproj」 を右クリックして 新規 -> HTML ファイル をクリック。
「HTML ファイル」ウィンドウの「ファイル名(任意:geoext05_layer-tree.html)」に入力して「完了」ボタンをクリック。
「charset」を「utf-8」にします。
以前使用した OpenLayers.Layer.WMS レイヤの例を参考に以下のように HTML を作成します。
(geoext03_mappanel-window.html に layercontainer.js を追加し body タグ内を修正します。)

---
<title>GeoExt05 Layer Tree</title>
---
<!-- layercontainer.js 追加 -->
<script type="text/javascript" src="./layercontainer.js"></script>

</head>
</body>
<h1 id="title">GeoExt 05 - Layer Tree</h1>
<p id="shortdesc">
Layer Tree Example
</p>
<div id="docs">
<p>This is example that shows how create a TreePanel with layers from a map.
GeoExt does not provide a LayerTree component.
Instead, to create a tree with nodes that represent layers, create a tree with a LayerContainer at the root, or add LayerNodes directly.
See also the tree example for a more complex tree configuration.
</p>
<p>
これは、マップのレイヤと TreePanel を作成する方法を示す例です。
GeoExt は LayerTree コンポーネントを提供していません。
代わりに、レイヤーを表すノードを持つツリーを作成するには、root で LayerContainer 使用してツリーを作成したり、直接 LayerNodes を追加します。
より複雑なツリー設定もツリーの例を参照してください。
</p>
</div>
<div style="position: relative;">
<div id="capgrid"></div>
<div id="tree"></div>
<div id="mappanel"></div>
</div>

</body>
</html>



このままではレイヤの表示がパネルの中心から外れてしまいました。
また、パンとズームのコントロールパネルの機能の動作に時間がかかります。
パネルとマップやレイヤの設定がうまくできていないようです。
これらは修正できませんでした。

GeoServer の WMS GetCapabilities はグリッドの表示を試してみます。
GeoServer は設定されているすべてのレイヤの WMS を出力します。
Tokyo の PostgresQLのデータベースの railroad2 が既に GeoServer の Data の Layers に設定されているので、これを使用します。
GeoServer の WMS を有効にするには、Services -> WMS をクリックして Service Metadata の Enable WMS にチェックをつけて Submit ボタンをクリックします。

次のコマンドで GeoServer の WMS GetCapabilities のデータを取得します。

wget -O geoserver_wms.xml "http://192.168.1.6:8080/geoserver/ows?service=WMS&request=GetCapabilities"

geoserver_wms.xml ファイルを Eclipse の openlayersTokyoproj プロジェクトにインポートします。

Example サイト
http://www.geoext.org/examples.html

の「Layer Tree」リンクをクリックすると Layer Tree Example が表示されます。
layercontainer.js をコピーします。

JS ファイルを新規作成します。
「openlayersTokyoproj」 を右クリックして 新規 -> JavaScript ファイル をクリック。
「JavaScript ファイル」ウィンドウの「ファイル名(任意:layercontainer2.js)」に入力して「完了」ボタンをクリック。
コピーしたコードを貼り付けます。
store の部分だけ修正して geoserver_wms.xml を読み込みます。

var store, tree, panel;

Ext.onReady(function() {

// create a new WMS capabilities store
store = new GeoExt.data.WMSCapabilitiesStore({
url: "./geoserver_wms.xml"
// パネルが表示されない
// url: "http://192.168.1.6:8080/geoserver/ows?service=WMS&request=GetCapabilities"
// パネルは表示されるが地図は表示されない
// url: "./tokyo_pf_pgis_wms.xml"
});
// load the store with records derived from the doc at the above url
store.load();
---

geoext05_layer-tree.html ファイルを layercontainer2.js を読み込むように修正します。

---
<!-- layercontainer2.js に修正 -->
<script src="./layercontainer2.js"></script>

</head>
<body>
---

2010年11月15日月曜日

GeoExt 04c Layer Tree - Visibility Grouping

OpenLayers で基本レイヤのない状態(allOverlays が true に設定されているとき)にLayerNode の checkedGroup を設定すると、該当レイヤは基本レイヤのようにレイヤノードはチェックボックスの替りにラジオボタンがレンダリングされ、同じ checkedGroup と設定されてたすべてのレイヤーは、同時に1つだけが表示されます。
geoext02_layer-tree.html を修正します。

---
Ext.onReady(function () {
map = new OpenLayers.Map('map', {
allOverlays: true, // 追加
projection: new OpenLayers.Projection("EPSG:2456"),
maxResolution: 'auto',
maxExtent: new OpenLayers.Bounds(-279000,1054000,-185000,1104000),
units: 'meters',
displayProjection: new OpenLayers.Projection("EPSG:4326")
});


layer1 = new OpenLayers.Layer.WMS( "Tokyo Height WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_bmi_pgis_img2.map',
layers: 'height',
// isBaselayer: true, 削除
format: 'image/png'
});

---

var layerList = new GeoExt.tree.LayerContainer({
text: 'Tokyo Layers',
layerStore: mapPanel.layers,
leaf: false,
expanded: true,
loader: {
filter: function(record) {
return record.get("layer").name.indexOf("Tokyo") !== -1 // 修正
// OpenLayers.Layer.WMS の名前
},
// 追加
baseAttrs: {
checkedGroup: "tokyo"
}
// ここまで
}
});
---




Layer Nodes with Additional Radio Buttons 以下はうまく表示できませんでした。

GeoExt 04b Layer Tree - Filtering

LayerContainer の LayerLoader はレイヤの保持と表示をします。
独自の filter 機能を loader に設定できます。
geoext02_layer-tree.html を修正します。

---
<script type="text/javascript">
var map, layer1, layer2, layer3, layer4, layer5, layer6, layer7;
// Filtering 用にレイヤ追加

---

layer4 = new OpenLayers.Layer.WMS( "Railroad JR Line WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_pf_pgis.map',
layers: 'jrline',
transparent: true,
format: 'image/png'
},{
projection: new OpenLayers.Projection("EPSG:4326")
}
);


layer5 = new OpenLayers.Layer.WMS( "Railroad Public Line WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_pf_pgis.map',
layers: 'publicline',
transparent: true,
format: 'image/png'
},{
projection: new OpenLayers.Projection("EPSG:4326")
}
);


layer6 = new OpenLayers.Layer.WMS( "Railroad Private Line WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_pf_pgis.map',
layers: 'privateline',
transparent: true,
format: 'image/png'
},{
projection: new OpenLayers.Projection("EPSG:4326")
}
);


layer7 = new OpenLayers.Layer.WMS( "Railroad Third Sector Line WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_pf_pgis.map',
layers: 'thirdsec',
transparent: true,
format: 'image/png'
},{
projection: new OpenLayers.Projection("EPSG:4326")
}
);


map.addLayers([layer1, layer2, layer3, layer4, layer5, layer6, layer7]);

---

var layerList = new GeoExt.tree.LayerContainer({
text: 'Raiload Layers',
layerStore: mapPanel.layers,
leaf: false,
expanded: true,
// 追加
loader: {
filter: function(record) {
return record.get("layer").name.indexOf("Railroad") !== -1
// OpenLayers.Layer.WMS の名前
}
}
// ここまで
});
---

GeoExt 04a Layer Tree - レイヤ項目のツリー表示

Layer Tree Tutorial サイト
http://www.geoext.org/tutorials/layertree-tutorial.html

を参考にレイヤ項目をツリー表示します。
stock Ext.tree.TreePanel クラスで GeoExt.tree.LayerContainer を使ってレイヤー表示を切り替え、描画順序を並べ替えてみます。

Start With a Map のコードを試してみます。
GeoExt.tree.LayerContainer は、マップのレイヤリストの変更ができるコンポーネントです。LayerContainer は、表示のために、Ext.tree.TreePanel に含まれなければならないノードです。

HTML ファイルを新規作成します。
「openlayersTokyoproj」 を右クリックして 新規 -> HTML ファイル をクリック。
「HTML ファイル」ウィンドウの「ファイル名(任意:geoext02_layer-tree.html)」に入力して「完了」ボタンをクリック。
geoext01_basic-ex.html をすべてコピーし、貼り付けます。
以下のように修正します。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>GeoExt04 Layer Tree</title>
<link rel="stylesheet" href="./theme/default/style.css" type="text/css" />
<link rel="stylesheet" href="./examples/style.css" type="text/css" />

<script src="./lib/Firebug/firebug.js"></script>
<script src="./OpenLayers-2.10/lib/OpenLayers.js"></script>


<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>
<!-- 追加 -->
<script src="./ext-3.2.1/adapter/ext/ext-base.js" type="text/javascript"></script>
<script src="./ext-3.2.1/ext-all.js" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="./ext-3.2.1/resources/css/ext-all.css"></link> <!-- 修正 -->
<!--
<script src="OpenLayers/OpenLayers.js" type="text/javascript"></script>
-->
<script src="./GeoExt/lib/GeoExt.js" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="./GeoExt/resources/css/geoext-all-debug.css"></link> <!-- 修正 -->


<script type="text/javascript">
var map, layer1, layer2;

Ext.onReady(function () {
map = new OpenLayers.Map('map', {
projection: new OpenLayers.Projection("EPSG:2456"),
maxResolution: 'auto',
maxExtent: new OpenLayers.Bounds(-279000,1054000,-185000,1104000),
units: 'meters',
displayProjection: new OpenLayers.Projection("EPSG:4326")
});


layer1 = new OpenLayers.Layer.WMS( "Tokyo Height WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_bmi_pgis_img2.map',
layers: 'height',
isBaselayer: true,
format: 'image/png'
});

layer2 = new OpenLayers.Layer.WMS( "Tokyo Kukaku Sen WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_bmi_pgis_img2.map',
layers: 'kukaku',
transparent: true,
format: 'image/png'
});

map.addLayers([layer1, layer2]);
map.addControl(new OpenLayers.Control.LayerSwitcher()); // 追加
map.addControl(new OpenLayers.Control.MousePosition()); // 追加
map.addControl(new OpenLayers.Control.ScaleLine()); // 追加
map.zoomToMaxExtent();

--- ここまで geoext01_basic-ex.html と同じ ---

var mapPanel = new GeoExt.MapPanel({ // 修正
renderTo: 'gxmap',
height: 400,
width: 600,
map: map,
title: 'A GeoExt Tree' // 修正
});

// ここから追加
var layerList = new GeoExt.tree.LayerContainer({
text: 'All Layers',
layerStore: mapPanel.layers,
leaf: false,
expanded: true
});

var layerTree = new Ext.tree.TreePanel({
title: 'Map Layers',
renderTo: 'layerTree',
root: layerList
});

});

</script>
</head>


<body>
<h1 id="title">GeoExt02 Layer Tree</h1>
<p id="shortdesc">
GeoExt JS Layer Tree Example.
</p>
<div id="gxmap"></div>
<div id="layerTree"></div><!-- 追加 -->
<div id="docs">
<!-- 修正 -->
<p>GeoExt JS の Layer Tree Tutorial を参考に地図を表示します。</p>
</div>
</body>
</html>



LayerContainers は自動的にレイヤ表示を選択できるチェックボックス(基本レイヤはラジオボタン)を追加します。
TreePanel の enableDD プロパティを簡単に設定することで描画するレイヤをドラッグアンドドロップで移動できます。

---
<script type="text/javascript">
var map, layer1, layer2, layer3; // 追加
---
// layer3 を追加
layer3 = new OpenLayers.Layer.WMS( "Railroad Shinkansen WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_pf_pgis.map',
layers: 'railroad',
transparent: true,
format: 'image/png'
},{
projection: new OpenLayers.Projection("EPSG:4326")
}
);

map.addLayers([layer1, layer2, layer3]);
---
var layerTree = new Ext.tree.TreePanel({
title: 'Map Layers',
renderTo: 'layerTree',
enableDD: true, // 追加
root: layerList
});
---

2010年11月14日日曜日

GeoExt 03 GeoExt.MapPanel in an Ext.Window - Ext.Window 内の GeoExt.MapPanel

GeoExt ホームページ
http://www.geoext.org/index.html

の Example サイト
http://www.geoext.org/examples.html

を使って東京都の地図を表示してみます。

「Map panel (in a Window)」リンクをクリックすると GeoExt.MapPanel in an Ext.Window が表示されます。
mappanel-window.js を参考にします。

JS ファイルを新規作成します。
「openlayersTokyoproj」 を右クリックして 新規 -> JavaScript ファイル をクリック。
「JavaScript ファイル」ウィンドウの「ファイル名(任意:mappanel-window.js)」に入力して「完了」ボタンをクリック。
GeoExt 02 で使用したレイヤの例を参考に以下のように JavaScript を作成します。


var mapPanel, map;

Ext.onReady(function() {

map = new OpenLayers.Map('map', {
controls: [
new OpenLayers.Control.PanZoom(),
new OpenLayers.Control.LayerSwitcher(),
new OpenLayers.Control.MousePosition(),
new OpenLayers.Control.ScaleLine()
],
projection: new OpenLayers.Projection("EPSG:2456"),
maxResolution: 'auto',
maxExtent: new OpenLayers.Bounds(-279000,1054000,-185000,1104000),
units: 'meters',
displayProjection: new OpenLayers.Projection("EPSG:4326")
});


new Ext.Window({ // ウィンドウ表示クラス
title: "GeoExt MapPanel Window",
height: 400,
width: 600,
layout: "fit",
items: [{
xtype: "gx_mappanel", // コンポーネントを追加するレジストリの指定
id: "mappanel",
layers: [
new OpenLayers.Layer.WMS( "Tokyo Height WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_bmi_pgis_img2.map',
layers: 'height',
isBaselayer: true,
format: 'image/png'
}
),
new OpenLayers.Layer.WMS( "Tokyo Kukaku Sen WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_bmi_pgis_img2.map',
layers: 'kukaku',
transparent: true,
format: 'image/png'
}
)
],
map: map
}]
}).show();

mapPanel = Ext.getCmp("mappanel"); // Ext で生成された Component を取得
});

HTML ファイルを新規作成します。
「openlayersTokyoproj」 を右クリックして 新規 -> HTML ファイル をクリック。
「HTML ファイル」ウィンドウの「ファイル名(任意:geoext03_mappanel-window.html)」に入力して「完了」ボタンをクリック。
「charset」を「utf-8」にします。
以前使用した OpenLayers.Layer.WMS レイヤの例を参考に以下のように HTML を作成します。
(body タグ内に表示のためのタグは必要ありません。)

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>GeoExt 03 Ext.Window 内の GeoExt.MapPanel</title>
<link rel="stylesheet" href="./theme/default/style.css" type="text/css" />
<link rel="stylesheet" href="./examples/style.css" type="text/css" />

<script src="./lib/Firebug/firebug.js"></script>
<script src="./OpenLayers-2.10/lib/OpenLayers.js"></script>

<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>
<!-- Ext JS ライブラリ追加 -->
<script src="./ext-3.2.1/adapter/ext/ext-base.js" type="text/javascript"></script>
<script src="./ext-3.2.1/ext-all.js" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="./ext-3.2.1/resources/css/ext-all.css"></link> <!-- 修正 -->
<!-- GeoExt ライブラリ追加 -->
<script src="./GeoExt/lib/GeoExt.js" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="./GeoExt/resources/css/geoext-all-debug.css"></link> <!-- 修正 -->
<!-- mappanel-window.js 追加 -->
<script type="text/javascript" src="./mappanel-window.js"></script>

</head>


<body>

<h1 id="title">GeoExt 03 - Ext.Window 内の GeoExt.MapPanel</h1>
<p id="shortdesc">
GeoExt.MapPanel in an Ext.Window
</p>
<div id="docs">
<p>This example shows the how to place a MapPanel in another Ext container
without creating a map first. See mappanel-div.html for an example that
creates the map before creating the map panel.

<p>この例では、最初にマップを作成することなくもう一つの Ext コンテナにMapPanelを
配置する方法を示しています。 マップパネルを作成する前にマップを作成する例
mappanel-div.html を参照してください。</p>
</div>

</body>
</html>

2010年11月13日土曜日

GeoExt 02 GeoExt.MapPanel with an Existing OpenLayers.Map - OpenLayers.Map を使った GeoExt.MapPanel

GeoExt ホームページ
http://www.geoext.org/index.html

の Example サイト
http://www.geoext.org/examples.html

にある Map Panel の例を使って東京都の地図を表示してみます。

最初に、「Map panel」からやっていきます。
リンクをクリックすると GeoExt.MapPanel with an Existing OpenLayers.Map が表示されます。
mappanel-div.js を参考にします。


JS ファイルを新規作成します。
「openlayersTokyoproj」 を右クリックして 新規 -> JavaScript ファイル をクリック。
「JavaScript ファイル」ウィンドウの「ファイル名(任意:mappanel-div.js)」に入力して「完了」ボタンをクリック。
以前使用した OpenLayers.Layer.WMS レイヤの例を参考に以下のように JavaScript を作成します。


var mapPanel, map, layer1, layer2;

Ext.onReady(function() { // ドキュメントが準備できたとき実行
Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
// 状態(例えばgridのカラム幅・表示カラム・カラム表示順・ソート順)を保存。
map = new OpenLayers.Map('map', {
projection: new OpenLayers.Projection("EPSG:2456"),
maxResolution: 'auto',
maxExtent: new OpenLayers.Bounds(-279000,1054000,-185000,1104000),
units: 'meters',
displayProjection: new OpenLayers.Projection("EPSG:4326")
});

layer1 = new OpenLayers.Layer.WMS( "Tokyo Height WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_bmi_pgis_img2.map',
layers: 'height',
isBaselayer: true,
format: 'image/png'
});

layer2 = new OpenLayers.Layer.WMS( "Tokyo Kukaku Sen WMS",
"http://192.168.1.6/cgi-bin/mapserv?",
{
map: '/home/nob61/mapfile/tokyo_bmi_pgis_img2.map',
layers: 'kukaku',
transparent: true,
format: 'image/png'
});

map.addLayers([layer1, layer2]);
map.addControl(new OpenLayers.Control.LayerSwitcher());
map.addControl(new OpenLayers.Control.MousePosition());
map.addControl(new OpenLayers.Control.ScaleLine());
map.zoomToMaxExtent();


// マップパネルの表示
mapPanel = new GeoExt.MapPanel({
title: "GeoExt MapPanel", // パネル上部に表示されるタイトル
renderTo: "mappanel", // マップ描画のための id
stateId: "mappanel", // Ext.state.CookieProvider 用
height: 400, // パネル高さ
width: 600, // パネル幅
map: map, // OpenLayers.Map
// center: new OpenLayers.LonLat(5, 45),
// zoom: 4,
// GetState と applyState はオーバーロード(再定義)されて、
// パネルのサイズを格納し復元することができます。
getState: function() {
var state = GeoExt.MapPanel.prototype.getState.apply(this);
state.width = this.getSize().width;
state.height = this.getSize().height;
return state;
},
applyState: function(state) {
GeoExt.MapPanel.prototype.applyState.apply(this, arguments);
this.width = state.width;
this.height = state.height;
}
});
});


// マップパネルのサイズ変更関数
function mapSizeUp() {
var size = mapPanel.getSize();
size.width += 100; // ちょっと大きめに
size.height += 100;
mapPanel.setSize(size);
}
function mapSizeDown() {
var size = mapPanel.getSize();
size.width -= 100;
size.height -= 100;
mapPanel.setSize(size);
}

HTML ファイルを新規作成します。
「openlayersTokyoproj」 を右クリックして 新規 -> HTML ファイル をクリック。
「HTML ファイル」ウィンドウの「ファイル名(任意:geoext02_mappanel-olmap.html)」に入力して「完了」ボタンをクリック。
「charset」を「utf-8」にします。
以前使用した OpenLayers.Layer.WMS レイヤの例を参考に以下のように HTML を作成します。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>GeoExt 02 OpenLayers.Map を使った GeoExt.MapPanel</title>
<link rel="stylesheet" href="./theme/default/style.css" type="text/css" />
<link rel="stylesheet" href="./examples/style.css" type="text/css" />

<script src="./lib/Firebug/firebug.js"></script>
<script src="./OpenLayers-2.10/lib/OpenLayers.js"></script>

<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>
<!-- Ext JS ライブラリ追加 -->
<script src="./ext-3.2.1/adapter/ext/ext-base.js" type="text/javascript"></script>
<script src="./ext-3.2.1/ext-all.js" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="./ext-3.2.1/resources/css/ext-all.css"></link>
<!-- GeoExt ライブラリ追加 -->
<script src="./GeoExt/lib/GeoExt.js" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="./GeoExt/resources/css/geoext-all-debug.css"></link>
<!-- mappanel-div.js 追加 -->
<script type="text/javascript"src="./mappanel-div.js"></script>

</head>


<body>

<h1 id="title">GeoExt 02 - OpenLayers.Map を使った GeoExt.MapPanel</h1>
<p id="shortdesc">
GeoExt.MapPanel with an Existing OpenLayers.Map
</p>

<div id="docs">
<p>OpenLayers.Map を使って GeoExt.MapPanel で地図を表示しました。</p>
This example shows the how to create a MapPanel with a map that
has already been created. See mappanel-window.html for an example
that creates the MapPanel without creating the map first.</p>

<p>この例では、既に作成されているマップに MapPanel を作成する方法を示します。
MapPanel が最初にマップを作成することなくMapPanelを作成する例である window.html
を参照してください。</p>

<p>This example makes use of a CookieProvider. The MapPanel being
a stateful component, if you reload the page the map should be at
the same location as previously. Also the getState and applyState
methods are overloaded so the size of the map panel is also restored
when refreshing the page.</p>

<p>この例では、CookieProvider を使用しています。MapPanelは、ステートフル
(状態を保持するよう)なコンポーネントで、ページをリロードする場合、マップが以前と
同じ場所にあるようにします。ので、またgetStateをとapplyStateメソッドが
オーバーロードされると、マップパネルのサイズはページ更新時に復元されます。</p>
</div>

<!-- パネル表示 -->
<div id="mappanel"></div>
<!-- マップ縮小・復元ボタン -->
<input type="button" onclick="mapSizeUp()" value="bigger"></input>
<input type="button" onclick="mapSizeDown()" value="smaller"></input>

</body>
</html>