ホーム » GeoServer

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

TOMCATが起動しない

久しぶりにGeoServerを起動しようとしたら、またもTOMCATが起動しない。
ということでJREのバージョンアップを確認。

現行のJREの情報

イベントビューアーを確認すると11/05にJREが更新されており、バージョンが「jre1.8.0_191」に更新されている。

よってJAVA_HOMEを「C:\Program Files\Java\jre1.8.0_151\bin」から「C:\Program Files\Java\jre1.8.0_191\bin」に変更

「C:\Program Files\Apache Software Foundation\Tomcat 7.0\bin\Tomcat7w.exe」を起動してJREの設定を変更

「C:\Program Files\Java\jre1.8.0_151\bin\server\jvm.dll」を「C:\Program Files\Java\jre1.8.0_191\bin\server\jvm.dll」に変更

以上、PCを再起動して終了

GeoServerでグラフ表示

GeeoServerではExtensionを追加してグラフ表示が可能

GeoServerのダウンロードサイトを開き、 Archivedタブをクリックしてダウンロード対象のGeoServerのバージョンを選択。
Chart Symbolizerを選択してgeoserver-2.10.1-charts-plugin.zipをダウンロード。

解凍してjarファイルを以下のフォルダにコピー

[code]
C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\geoserver\WEB-INF\lib
[/code]

GeoServerを再起動してレイヤ「USA Population」のスタイルをGeoServer Trainingに従って作成したスタイルに変更する。

参考サイト

GeoServer Training

ベースとなったgoogle chart

GeoServer chart extension

GeoServerが動かない→Tomcatが動かない

GeoServerが動作しないためTomcatのサービスを確認すると起動していない。
サービスを起動しようとすると以下のエラーが表示される。

イベントログには以下が出力されている「Apache Tomcat 7.0 Tomcat7 サービスは、次のサービス固有エラーで終了しました: ファンクションが間違っています。」

どうやらJavaがバージョンアップされてTomcatが参照しているJREの場所を更新する必要があるようだ。

環境変数:JRE_HOME
[code]
JRE_HOME=C:\Program Files\Java\jre1.8.0_111\bin
[/code]

C:\Program Files\Apache Software Foundation\Tomcat 7.0\bin\Tomcat7w.exeを起動して
jvm.dllのパスを確認

[code]
C:\Program Files\Java\jre1.8.0_111\bin\server\jvm.dll
[/code]

JREのディレクトリ確認

最初にインストールした「jre1.8.0_111」から「jre1.8.0_131」にバージョンアップされている。

Tomcat7w.exeの値と環境変数をいかに修正

C:\Program Files\Java\jre1.8.0_131\bin\server\jvm.dll

C:\Program Files\Java\jre1.8.0_131\bin

GeoServer org.geoserver.platform.ServiceException: Rendering request would use 96531KB, whilst the maximum memory allowed is 65536KB

GeoServerでWMS配信をタイルから全画面に変更したら以下のエラーが出力された。

明らかにメモリ不足だが、JVMのメモリ設定も合わせて再確認のために記載。
※OSはWindowsサーバー、GeoServerのコンテナにはTomcatを使用。

(1)Tomcatのメモリ設定

Tomcatのbinフォルダにある「tomcat7w.exe」を起動

初期メモリと最大メモリを設定

初期メモリと最大メモリは同一の値にしたほうがよいらしい。

※この設定がJVMのメモリ設定に反映されると思われる

GeoServerのメモリ設定

Tomcatのメモリ設定はGeoServerにも反映される。

WMSのメモリ設定

メニューのWMSを選択して「Web Map Service」の設定ページを表示

必ずワークスペースを指定して

メモリを設定

以上

GeoServerのSQLビューに渡す引数について

複数引数を必要とするSQLビューにOpenLayersから引数を渡す

[code]
select
geometry
from
shops
where
shop_code = ‘%shop_code%’
and
owner_no = %owner_no%
[/code]

上記のSQLビューに引数を渡すには以下のように引数「key:value」をセミコロンで連結
[code]
var params = "shop_code:123456789;owner_no:54321";
var layer = new OpenLayers.Layer.WMS(
"layer name",
"../geoserver/ワークスペース名/wms",
{
LAYERS: ‘レイヤ名’,
format: ‘image/png’,
transparent: true,
viewparams: params
},
{
singleTile: false
}
);
[code]

in句を使った条件に複数の引数を渡す
[code]
select
geometry
from
shops
where
shop_code in (%shop_code%)
[/code]

[code]
var params = "shop_code:’123456789’\\,’987654321’";
var layer = new OpenLayers.Layer.WMS(
"layer name",
"../geoserver/ワークスペース名/wms",
{
LAYERS: ‘レイヤ名’,
format: ‘image/png’,
transparent: true,
viewparams: params
},
{
singleTile: false
}
);
[/code]

GeoServerのスタイルにイメージを設定

久しぶりにGeoServerのスタイル設定をしたら忘れていたことがあったのでメモ。
ポイントのスタイルにイメージを設定する時は以下の書式でSLDを記述。
[code]
<StyledLayerDescriptor 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" version="1.0.0" xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd">
<NamedLayer>
<Name>blue shop icon</Name>
<UserStyle>
<FeatureTypeStyle>
<Rule>
<PointSymbolizer>
<Graphic>
<ExternalGraphic>
<OnlineResource xlink:type="simple" xlink:href="blue_shop.png"/>
<Format>image/png</Format>
</ExternalGraphic>
<Size>32</Size>
</Graphic>
</PointSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
[/code]
イメージファイルはGeoServerのData directory\ワークスペース\stylesディレクトリ直下に置く

clip_2

clip_6

OpenLayersに表示したGeoServerのPOINT(シンボル)のFeatureInfo(情報)をクリックして照会(WMSGetFeatureInfoです)

OpenLayersのWMSGetFeatureInfoを使用するとクリックした位置にある地物(Obejct)の情報を照会できる。

以下の画像は学校を旗(32×32のPNG画像)で表示。
clip_1

OpenLayers.Mapにコントロ-ル「WMSGetFeatureInfo」を追加してeventListenersのコールバック関数「getfeatureinfo」で
クリックした位置にある地物の情報を取得。
[code]
var selectControl = new OpenLayers.Control.WMSGetFeatureInfo({
url: "../geoserver/ワークスペース/wms",
title: "",
maxFeatures: 50,
queryVisible: true,
vendorParams: {
buffer: 100
},
infoFormat: "application/json",
eventListeners: {
getfeatureinfo: function(event){
var j = JSON.parse(event.text);
console.log(j, j.features, event);
}
}
});
map.addControl(selectControl);
selectControl.activate();
[/code]
シンボル、ポイントのように領域を持たない地物を選択する時は、vendorParamsのbufferまたはradiusでバッファ範囲を指定する。(単位はピクセル)
vendorParamsの詳細

上記の設定ではWMSGetFeatureInfoは表示されている全てのレイヤを照会の対象とする。

照会対象の項目はGeoServerで指定(以下はSQLViewで作成したLayersの時)
clip_3

注意点
GeoServerのLayersでGeometryのSRIDが正しく指定されていないとエラーになる

ドキュメント

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>traffic12_5L</Name>
<UserStyle>
<FeatureTypeStyle>
<Rule>
<Name>0-999</Name>
<ogc:Filter>
<ogc:And>
<ogc:PropertyIsGreaterThanOrEqualTo>
<ogc:PropertyName>trfvol</ogc:PropertyName>
<ogc:Literal>0</ogc:Literal>
</ogc:PropertyIsGreaterThanOrEqualTo>
<ogc:PropertyIsLessThan>
<ogc:PropertyName>trfvol</ogc:PropertyName>
<ogc:Literal>999</ogc:Literal>
</ogc:PropertyIsLessThan>
</ogc:And>
</ogc:Filter>
<LineSymbolizer>
<Stroke>
<CssParameter name="stroke">#C0C0C0</CssParameter>
<CssParameter name="stroke-width">2</CssParameter>
</Stroke>
</LineSymbolizer>
</Rule>
<Rule>
<Name>1000-1999</Name>
<ogc:Filter>
<ogc:And>
<ogc:PropertyIsGreaterThanOrEqualTo>
<ogc:PropertyName>trfvol</ogc:PropertyName>
<ogc:Literal>1000</ogc:Literal>
</ogc:PropertyIsGreaterThanOrEqualTo>
<ogc:PropertyIsLessThan>
<ogc:PropertyName>trfvol</ogc:PropertyName>
<ogc:Literal>1999</ogc:Literal>
</ogc:PropertyIsLessThan>
</ogc:And>
</ogc:Filter>
<LineSymbolizer>
<Stroke>
<CssParameter name="stroke">#C0C0C0</CssParameter>
<CssParameter name="stroke-width">2</CssParameter>
</Stroke>
</LineSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
[/code]

OpenLayersでGoogleMap上にGeoServerのWMSを表示

道路データ(数年前のデータで旧日本則地形)をGeoServerで配信してGoogleMap上に表示。
同様のことを電子国土でやった経験から簡単にできると思ったが、
意外にてこずり、時間がかかったのでメモ。

GeoServerの設定

特別な設定はしていない「Native SRS」、「Declared SRS」共に旧日本則地形を指定
※表示されない時はSRSを色々と変更したが、結局このまま。

clip_13

OpenLayersのコード

GoogleMap、OSMをOpenLayersで表示する時はmapの投影にEPSG:900913を使用する。
但し、以下のように投影を敢えて明記せずに使用することがある。
もちろん、これは正しく動作する。

var map = new OpenLayers.Map('id_div_map');
var gmap = new OpenLayers.Layer.Google("Google ROADMAP",{numZoomLevels: 20});
map.addLayer(gmap);

しかし、ここにwmsのレイヤーを追加しても正しく表示されない。
OpenLayers.Mapに正しく投影の情報や最大のExtentを明示的に指定する必要がある。

var map = new OpenLayers.Map('id_div_map', {
	maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
	maxResolution: 156543.0399,
	numZoomLevels: "auto",
	units: 'm',
	projection: new OpenLayers.Projection("EPSG:4326"),
	displayProjection: new OpenLayers.Projection("EPSG:900913")
	});
var gmap = new OpenLayers.Layer.Google("Google ROADMAP",{numZoomLevels: 20});
map.addLayer(gmap);
var road = new OpenLayers.Layer.WMS("LOCAL_ROADS",
	"http://192.9.200.25/geoserver/road/wms?",
	{
		LAYERS: 'road:ROAD5439',
		format: 'image/png',
         	transparent: 'true',
         	isBaseLayer: 'false',
         	projection: 'EPSG:4301',
         	reproject: 'true',
		styles: ''
	});
map.addLayer(road);

※maxExtentに指定した値は(-180、-90)、(180、90)を座標変換した値
-20037508.34,-20037508.34,20037508.34,20037508.34

表示結果

clipll

OpenLayersで著作権等を表示

OpenLayersでMapQuest-OSMタイルを無償で使用するためには著作権表示が必要。

改めてOpenLayersにおける著作権表示について調査。

コントロールを空でOpenLayers.Map作成すると

var map = new OpenLayers.Map('map', {controls:[]});

拡大縮小等のコントロールは何も表示されない。

clipc

OpenLayers.Control.Attributionコントロールを追加すると

map.addControl(new OpenLayers.Control.Attribution());

勝手に著作権情報が表示される

Googleの場合

clipg

OSMの場合

clipo

MapQuest-OSMの場合

clipo2

OSMの著作権だけ表示されてMapQuestが要求する著作権表示になっていない!

オプションで明示的に指定

var mapQuestOption = {
attribution:'Tiles Courtesy of MapQuest'
};
var layer_osm_mapquest = new OpenLayers.Layer.OSM("MapQuest-OSM", mapQuestArray,mapQuestOption);

期待した結果になった

clipo3