ホーム » 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が動かない→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ディレクトリ直下に置く
OpenLayersに表示したGeoServerのPOINT(シンボル)のFeatureInfo(情報)をクリックして照会(WMSGetFeatureInfoです)
OpenLayersのWMSGetFeatureInfoを使用するとクリックした位置にある地物(Obejct)の情報を照会できる。
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の時)
注意点
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を色々と変更したが、結局このまま。
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
表示結果
OpenLayersで著作権等を表示
OpenLayersでMapQuest-OSMタイルを無償で使用するためには著作権表示が必要。
改めてOpenLayersにおける著作権表示について調査。
コントロールを空でOpenLayers.Map作成すると
var map = new OpenLayers.Map('map', {controls:[]});
拡大縮小等のコントロールは何も表示されない。
OpenLayers.Control.Attributionコントロールを追加すると
map.addControl(new OpenLayers.Control.Attribution());
勝手に著作権情報が表示される
Googleの場合
OSMの場合
MapQuest-OSMの場合
OSMの著作権だけ表示されてMapQuestが要求する著作権表示になっていない!
オプションで明示的に指定
var mapQuestOption = { attribution:'Tiles Courtesy of MapQuest' }; var layer_osm_mapquest = new OpenLayers.Layer.OSM("MapQuest-OSM", mapQuestArray,mapQuestOption);
期待した結果になった