SLDReaderを利用して、ラインの最後尾の頂点にアイコンを追加する
はじめに
前回は、Openlayersを編集して、道路網図の道路の起点から終点までの位置がわかるよう、アイコンを設定してしましたが、SLDReaderにも、起点又は終点のアイコンが設定できる機能があったので、試してみました。
ラインの最後尾の頂点にアイコンを追加する例
l_road.txt
SLDReaderには、SLDのベンダーオプション(Vendor Option)にlastPointを設定します。ソースを見てみるとQGISのベンダーオプションようです。あと、UOMの対応もできたので、UOMをLineSymbolizerの属性に追加しています。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<?xml version="1.0" encoding="utf-16" standalone="no"?> <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>l_trans_road_emg</Name> <UserStyle> <Title>道路網図</Title> <FeatureTypeStyle> <Rule> <Name>0</Name> <Title>市道1級</Title> <LineSymbolizer uom="http://www.opengeospatial.org/se/units/metre"> <Stroke> <CssParameter name="stroke">#ff0000</CssParameter> <CssParameter name="stroke-width">12</CssParameter> </Stroke> </LineSymbolizer> <LineSymbolizer uom="http://www.opengeospatial.org/se/units/metre"> <VendorOption name="placement">lastPoint</VendorOption> <Stroke> <GraphicStroke> <Graphic> <ExternalGraphic> <OnlineResource xlink:type="simple" xlink:href="/OpenLayersSample/SLDReader/images/circle.svg" /> <Format>image/svg+xml</Format> </ExternalGraphic> <Size>0.5</Size> </Graphic> </GraphicStroke> </Stroke> </LineSymbolizer> </Rule> </FeatureTypeStyle> </UserStyle> </NamedLayer> </StyledLayerDescriptor> |
sldreader.js
SLDReader本体をカスタマイズします。SLDReaderでは、アイコンのサイズが固定ですが、今回はUOM指定を取り入れ、縮尺によってアイコンサイズを変更しています。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
function getGraphicStrokeRenderer(linesymbolizer, getProperty) { // 省略 var graphicSizeExpression = (graphicstroke.graphic && graphicstroke.graphic.size) || defaultGraphicSize; // UOM指定の場合は、アイコンサイズを変更 if(linesymbolizer.uom){ graphicSizeExpression = graphicstroke.graphic.size / renderState.resolution; const image = pointStyle.getImage(); const newScale = graphicstroke.graphic.size / renderState.resolution; image.setScale(newScale); } // 省略 } |
カスタマイズ後の地図
アイコンの回転もSLDReaderが自動で行ってくれているようです。


まとめ
ラインの頂点にアイコンを追加する機能は、SLDの標準仕様ではないですが、SLDReaderのベンダーオプション(Vendor Option)で提供されていたので、よかったです。