changeset 4484:819eafe60f41

Merged
author Sascha Wilde <wilde@intevation.de>
date Thu, 26 Sep 2019 12:16:23 +0200
parents 778b13025244 (current diff) 43c52a2d4f17 (diff)
children 685a5fd3a2f3
files
diffstat 9 files changed, 998 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/README.md	Thu Sep 26 11:32:33 2019 +0200
+++ b/README.md	Thu Sep 26 12:16:23 2019 +0200
@@ -40,7 +40,8 @@
 
 - You will need a PostgreSQL cluster with PostGIS.
 
-- To install the **gemma** schema and roles use the script
+- To install the **gemma** schema, roles and some default system configuration
+  use the script
   `./schema/install-db.sh`.
 
 - `./schema/install-db.sh --help` shows you available options.
@@ -57,7 +58,7 @@
 - Install and run GeoServer as described here:
   http://docs.geoserver.org/stable/en/user/installation/
 
-- Add tables you want to publish as OGC-Service Layers via GeoServer in
+- Add addional tables you want to publish as OGC-Service Layers via GeoServer in
   the database. For example publish the bottleneck areas:
   ```
   INSERT INTO sys_admin.published_services (name, as_wfs) VALUES
@@ -92,6 +93,16 @@
   ./cmd/gemma/gemma
   ```
 
+## Adding default style templates for geoserver
+
+- To add default style layers for geoserver run the script:
+  ```
+  ./style-templates/upload-styles.sh
+  ```
+
+- `./style-templates/upload-styles.sh --help` shows an overview of its options.
+
+
 ## Proxying OGC services through gemma
 
 - Add services you want to publish via gemma (e.g. for same-origin policy
--- a/client/src/components/Pdftool.vue	Thu Sep 26 11:32:33 2019 +0200
+++ b/client/src/components/Pdftool.vue	Thu Sep 26 12:16:23 2019 +0200
@@ -153,13 +153,12 @@
             {
               type: "scalebar",
               position: "bottomright",
-              offset: { x: 2, y: 2 }
+              offset: { x: 1, y: 1 }
             },
             {
               type: "textbox",
               position: "bottomleft",
-              offset: { x: 2, y: 2 },
-              width: 60,
+              offset: { x: 1, y: 1 },
               fontSize: 8,
               text: this.$gettext("Generated by") + " " + "{user}, {date}"
             },
@@ -168,6 +167,16 @@
               position: "topleft",
               offset: { x: 6, y: 4 },
               size: 2
+            },
+            {
+              type: "bottleneck",
+              position: "topright",
+              offset: { x: 2, y: 2 }
+            },
+            {
+              type: "legend",
+              position: "topright",
+              offset: { x: 2, y: 25 }
             }
           ]
         }
@@ -749,39 +758,44 @@
 
         // bottleneck
         this.pdf.doc.setFontStyle("italic");
-        this.pdf.doc.text(x + padding, y + padding, str1_1, textOptions);
+        this.pdf.doc.text(x + padding, y + padding + 2, str1_1, textOptions);
         this.pdf.doc.setFontStyle("bold");
-        this.pdf.doc.text(x + padding + w1_1, y + padding, str1_2, textOptions);
+        this.pdf.doc.text(
+          x + padding + w1_1,
+          y + padding + 2,
+          str1_2,
+          textOptions
+        );
 
         // survey date
         this.pdf.doc.setFontStyle("italic");
-        this.pdf.doc.text(x + padding, y + padding + 4, str2_1, textOptions);
+        this.pdf.doc.text(x + padding, y + padding + 6, str2_1, textOptions);
         this.pdf.doc.setFontStyle("normal");
         this.pdf.doc.text(
           x + padding + w2_1,
-          y + padding + 4,
+          y + padding + 6,
           str2_2,
           textOptions
         );
 
         // ref gauge
         this.pdf.doc.setFontStyle("italic");
-        this.pdf.doc.text(x + padding, y + padding + 8, str3_1, textOptions);
+        this.pdf.doc.text(x + padding, y + padding + 10, str3_1, textOptions);
         this.pdf.doc.setFontStyle("normal");
         this.pdf.doc.text(
           x + padding + w3_1,
-          y + padding + 8,
+          y + padding + 10,
           str3_2,
           textOptions
         );
 
         // depth relative to
         this.pdf.doc.setFontStyle("italic");
-        this.pdf.doc.text(x + padding, y + padding + 12, str4_1, textOptions);
+        this.pdf.doc.text(x + padding, y + padding + 14, str4_1, textOptions);
         this.pdf.doc.setFontStyle("normal");
         this.pdf.doc.text(
           x + padding + w4_1,
-          y + padding + 12,
+          y + padding + 14,
           str4_2,
           textOptions
         );
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/style-templates/distance_marks_ashore_geoserver.sld-template	Thu Sep 26 12:16:23 2019 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<StyledLayerDescriptor version="1.0.0"
+  xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/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>distance_marks_ashore_geoserver</Name>
+    <UserStyle>
+      <FeatureTypeStyle>
+        <Rule>
+          <PointSymbolizer>
+            <Graphic>
+              <Mark>
+                <WellKnownName>circle</WellKnownName>
+                <Stroke>
+		   <CssParameter name="stroke">{{ .distance_marks_ashore_stroke }}</CssParameter>
+                </Stroke>
+                <Fill>
+	           <CssParameter name="fill">{{ .distance_marks_ashore_fill }}</CssParameter>
+                  <CssParameter name="fill-opacity">{{ .distance_marks_ashore_fill_opacity }}</CssParameter>
+                </Fill>
+              </Mark>
+              <Size>10</Size>
+            </Graphic>
+          </PointSymbolizer>
+        </Rule>
+      </FeatureTypeStyle>
+    </UserStyle>
+  </NamedLayer>
+</StyledLayerDescriptor>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/style-templates/distance_marks_geoserver.sld-template	Thu Sep 26 12:16:23 2019 +0200
@@ -0,0 +1,450 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<sld:StyledLayerDescriptor xmlns="http://www.opengis.net/sld" xmlns:sld="http://www.opengis.net/sld" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" version="1.0.0">
+  <sld:NamedLayer>
+    <sld:Name>distance_marks_geoserver</sld:Name>
+    <sld:UserStyle>
+      <sld:Name>distance_marks_geoserver</sld:Name>
+      <sld:FeatureTypeStyle>
+         <sld:Rule>
+          <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
+            <ogc:PropertyIsEqualTo>
+              <ogc:Sub>
+                <ogc:PropertyName>hectometre</ogc:PropertyName>
+                <ogc:Mul>
+                  <ogc:Literal>1000</ogc:Literal>
+                  <ogc:Function name="round">
+                    <ogc:Div>
+                      <ogc:PropertyName>hectometre</ogc:PropertyName>
+                      <ogc:Literal>1000</ogc:Literal>
+                    </ogc:Div>
+                  </ogc:Function>
+                </ogc:Mul>
+              </ogc:Sub>
+              <ogc:Literal>0</ogc:Literal>
+            </ogc:PropertyIsEqualTo>
+          </ogc:Filter>
+          <sld:MinScaleDenominator>8500000</sld:MinScaleDenominator>
+            <sld:TextSymbolizer>
+            <sld:Label>
+              <ogc:Function name="round">
+                <ogc:Div>
+                  <ogc:PropertyName>hectometre</ogc:PropertyName>
+                  <ogc:Literal>10</ogc:Literal>
+                </ogc:Div>
+              </ogc:Function>
+            </sld:Label>
+            <sld:Font>
+              <sld:CssParameter name="font-family">Sans Serif</sld:CssParameter>
+              <sld:CssParameter name="font-size">10</sld:CssParameter>
+              <sld:CssParameter name="font-weight">bold</sld:CssParameter>
+            </sld:Font>
+            <sld:LabelPlacement>
+              <sld:PointPlacement>
+                <sld:AnchorPoint>
+                  <sld:AnchorPointX>0</sld:AnchorPointX>
+                  <sld:AnchorPointY>-0.5</sld:AnchorPointY>
+                </sld:AnchorPoint>
+              </sld:PointPlacement>
+            </sld:LabelPlacement>
+            <sld:Fill>
+              <sld:CssParameter name="fill">#000000</sld:CssParameter>
+            </sld:Fill>
+            <sld:Halo>
+            </sld:Halo>
+          </sld:TextSymbolizer>
+          <sld:PointSymbolizer>
+            <sld:Graphic>
+              <sld:Mark>
+                <sld:WellKnownName>circle</sld:WellKnownName>
+                <sld:Fill>
+                  <sld:CssParameter name="fill">{{ .distance_marks_fill }}</sld:CssParameter>
+                  <sld:CssParameter name="fill-opacity">{{ .distance_marks_fill_opacity }}</sld:CssParameter>
+                </sld:Fill>
+                <sld:Stroke>
+                  <sld:CssParameter name="stroke">#5555FF</sld:CssParameter>
+                  <sld:CssParameter name="stroke-width">1</sld:CssParameter>
+                </sld:Stroke>
+              </sld:Mark>
+              <sld:Size>10</sld:Size>
+            </sld:Graphic>
+          </sld:PointSymbolizer>
+        </sld:Rule>
+         <sld:Rule>
+          <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
+            <ogc:PropertyIsEqualTo>
+              <ogc:Sub>
+                <ogc:PropertyName>hectometre</ogc:PropertyName>
+                <ogc:Mul>
+                  <ogc:Literal>500</ogc:Literal>
+                  <ogc:Function name="round">
+                    <ogc:Div>
+                      <ogc:PropertyName>hectometre</ogc:PropertyName>
+                      <ogc:Literal>500</ogc:Literal>
+                    </ogc:Div>
+                  </ogc:Function>
+                </ogc:Mul>
+              </ogc:Sub>
+              <ogc:Literal>0</ogc:Literal>
+            </ogc:PropertyIsEqualTo>
+          </ogc:Filter>
+          <sld:MinScaleDenominator>1100000</sld:MinScaleDenominator>
+          <sld:MaxScaleDenominator>8500000</sld:MaxScaleDenominator>
+           <sld:TextSymbolizer>
+            <sld:Label>
+              <ogc:Function name="round">
+                <ogc:Div>
+                  <ogc:PropertyName>hectometre</ogc:PropertyName>
+                  <ogc:Literal>10</ogc:Literal>
+                </ogc:Div>
+              </ogc:Function>
+            </sld:Label>
+            <sld:Font>
+              <sld:CssParameter name="font-family">Sans Serif</sld:CssParameter>
+              <sld:CssParameter name="font-size">10</sld:CssParameter>
+              <sld:CssParameter name="font-weight">bold</sld:CssParameter>
+             </sld:Font>
+            <sld:LabelPlacement>
+              <sld:PointPlacement>
+                <sld:AnchorPoint>
+                  <sld:AnchorPointX>0</sld:AnchorPointX>
+                  <sld:AnchorPointY>-0.5</sld:AnchorPointY>
+                </sld:AnchorPoint>
+              </sld:PointPlacement>
+            </sld:LabelPlacement>
+            <sld:Fill>
+              <sld:CssParameter name="fill">#000000</sld:CssParameter>
+            </sld:Fill>
+            <sld:Halo>
+            </sld:Halo>
+          </sld:TextSymbolizer>
+          <sld:PointSymbolizer>
+            <sld:Graphic>
+              <sld:Mark>
+                <sld:WellKnownName>circle</sld:WellKnownName>
+                <sld:Fill>
+                  <sld:CssParameter name="fill">{{ .distance_marks_fill }}</sld:CssParameter>
+                  <sld:CssParameter name="fill-opacity">{{ .distance_marks_fill_opacity }}</sld:CssParameter>
+                </sld:Fill>
+                <sld:Stroke>
+                  <sld:CssParameter name="stroke">{{ .distance_marks_stroke }}</sld:CssParameter>
+                  <sld:CssParameter name="stroke-width">1</sld:CssParameter>
+                </sld:Stroke>
+              </sld:Mark>
+              <sld:Size>10</sld:Size>
+            </sld:Graphic>
+          </sld:PointSymbolizer>
+        </sld:Rule>
+        <sld:Rule>
+          <sld:Name>100</sld:Name>
+          <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
+            <ogc:PropertyIsEqualTo>
+              <ogc:Sub>
+                <ogc:PropertyName>hectometre</ogc:PropertyName>
+                <ogc:Mul>
+                  <ogc:Literal>100</ogc:Literal>
+                  <ogc:Function name="round">
+                    <ogc:Div>
+                      <ogc:PropertyName>hectometre</ogc:PropertyName>
+                      <ogc:Literal>100</ogc:Literal>
+                    </ogc:Div>
+                  </ogc:Function>
+                </ogc:Mul>
+              </ogc:Sub>
+              <ogc:Literal>0</ogc:Literal>
+            </ogc:PropertyIsEqualTo>
+          </ogc:Filter>
+          <sld:MinScaleDenominator>800000</sld:MinScaleDenominator>
+          <sld:MaxScaleDenominator>1100000</sld:MaxScaleDenominator>
+           <sld:TextSymbolizer>
+            <sld:Label>
+              <ogc:Function name="round">
+                <ogc:Div>
+                  <ogc:PropertyName>hectometre</ogc:PropertyName>
+                  <ogc:Literal>10</ogc:Literal>
+                </ogc:Div>
+              </ogc:Function>
+            </sld:Label>
+            <sld:Font>
+              <sld:CssParameter name="font-family">Sans Serif</sld:CssParameter>
+              <sld:CssParameter name="font-size">10</sld:CssParameter>
+              <sld:CssParameter name="font-weight">bold</sld:CssParameter>
+            </sld:Font>
+            <sld:LabelPlacement>
+              <sld:PointPlacement>
+                <sld:AnchorPoint>
+                  <sld:AnchorPointX>0</sld:AnchorPointX>
+                  <sld:AnchorPointY>-0.5</sld:AnchorPointY>
+                </sld:AnchorPoint>
+              </sld:PointPlacement>
+            </sld:LabelPlacement>
+            <sld:Fill>
+              <sld:CssParameter name="fill">#000000</sld:CssParameter>
+            </sld:Fill>
+            <sld:Halo>
+            </sld:Halo>
+          </sld:TextSymbolizer>
+          <sld:PointSymbolizer>
+            <sld:Graphic>
+              <sld:Mark>
+                <sld:WellKnownName>circle</sld:WellKnownName>
+                <sld:Fill>
+                  <sld:CssParameter name="fill">{{ .distance_marks_fill }}</sld:CssParameter>
+                  <sld:CssParameter name="fill-opacity">{{ .distance_marks_fill_opacity }}</sld:CssParameter>
+                </sld:Fill>
+                <sld:Stroke>
+                  <sld:CssParameter name="stroke">{{ .distance_marks_stroke }}</sld:CssParameter>
+                  <sld:CssParameter name="stroke-width">1</sld:CssParameter>
+                </sld:Stroke>
+              </sld:Mark>
+              <sld:Size>10</sld:Size>
+            </sld:Graphic>
+          </sld:PointSymbolizer>
+        </sld:Rule>
+        <sld:Rule>
+          <sld:Name>50</sld:Name>
+          <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
+            <ogc:PropertyIsEqualTo>
+              <ogc:Sub>
+                <ogc:PropertyName>hectometre</ogc:PropertyName>
+                <ogc:Mul>
+                  <ogc:Literal>50</ogc:Literal>
+                  <ogc:Function name="round">
+                    <ogc:Div>
+                      <ogc:PropertyName>hectometre</ogc:PropertyName>
+                      <ogc:Literal>50</ogc:Literal>
+                    </ogc:Div>
+                  </ogc:Function>
+                </ogc:Mul>
+              </ogc:Sub>
+              <ogc:Literal>0</ogc:Literal>
+            </ogc:PropertyIsEqualTo>
+          </ogc:Filter>
+          <sld:MinScaleDenominator>200000</sld:MinScaleDenominator>
+          <sld:MaxScaleDenominator>800000</sld:MaxScaleDenominator>
+           <sld:TextSymbolizer>
+            <sld:Label>
+              <ogc:Function name="round">
+                <ogc:Div>
+                  <ogc:PropertyName>hectometre</ogc:PropertyName>
+                  <ogc:Literal>10</ogc:Literal>
+                </ogc:Div>
+              </ogc:Function>
+            </sld:Label>
+            <sld:Font>
+              <sld:CssParameter name="font-family">Sans Serif</sld:CssParameter>
+              <sld:CssParameter name="font-size">10</sld:CssParameter>
+              <sld:CssParameter name="font-weight">bold</sld:CssParameter>
+             </sld:Font>
+            <sld:LabelPlacement>
+              <sld:PointPlacement>
+                <sld:AnchorPoint>
+                  <sld:AnchorPointX>0</sld:AnchorPointX>
+                  <sld:AnchorPointY>-0.5</sld:AnchorPointY>
+                </sld:AnchorPoint>
+              </sld:PointPlacement>
+            </sld:LabelPlacement>
+            <sld:Fill>
+              <sld:CssParameter name="fill">#000000</sld:CssParameter>
+            </sld:Fill>
+            <sld:Halo>
+            </sld:Halo>
+          </sld:TextSymbolizer>
+          <sld:PointSymbolizer>
+            <sld:Graphic>
+              <sld:Mark>
+                <sld:WellKnownName>circle</sld:WellKnownName>
+                <sld:Fill>
+                  <sld:CssParameter name="fill">{{ .distance_marks_fill }}</sld:CssParameter>
+                  <sld:CssParameter name="fill-opacity">{{ .distance_marks_fill_opacity }}</sld:CssParameter>
+                </sld:Fill>
+                <sld:Stroke>
+                  <sld:CssParameter name="stroke">{{ .distance_marks_stroke }}</sld:CssParameter>
+                  <sld:CssParameter name="stroke-width">1</sld:CssParameter>
+                </sld:Stroke>
+              </sld:Mark>
+              <sld:Size>10</sld:Size>
+            </sld:Graphic>
+          </sld:PointSymbolizer>
+        </sld:Rule>
+        <sld:Rule>
+          <sld:Name>20</sld:Name>
+          <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
+            <ogc:PropertyIsEqualTo>
+              <ogc:Sub>
+                <ogc:PropertyName>hectometre</ogc:PropertyName>
+                <ogc:Mul>
+                  <ogc:Literal>20</ogc:Literal>
+                  <ogc:Function name="round">
+                    <ogc:Div>
+                      <ogc:PropertyName>hectometre</ogc:PropertyName>
+                      <ogc:Literal>20</ogc:Literal>
+                    </ogc:Div>
+                  </ogc:Function>
+                </ogc:Mul>
+              </ogc:Sub>
+              <ogc:Literal>0</ogc:Literal>
+            </ogc:PropertyIsEqualTo>
+          </ogc:Filter>
+          <sld:MinScaleDenominator>60000</sld:MinScaleDenominator>
+          <sld:MaxScaleDenominator>200000</sld:MaxScaleDenominator>
+           <sld:TextSymbolizer>
+            <sld:Label>
+              <ogc:Function name="round">
+                <ogc:Div>
+                  <ogc:PropertyName>hectometre</ogc:PropertyName>
+                  <ogc:Literal>10</ogc:Literal>
+                </ogc:Div>
+                </ogc:Function>
+            </sld:Label>
+            <sld:Font>
+              <sld:CssParameter name="font-family">Sans Serif</sld:CssParameter>
+              <sld:CssParameter name="font-size">10</sld:CssParameter>
+              <sld:CssParameter name="font-weight">bold</sld:CssParameter>
+            </sld:Font>
+            <sld:LabelPlacement>
+              <sld:PointPlacement>
+                <sld:AnchorPoint>
+                  <sld:AnchorPointX>0</sld:AnchorPointX>
+                  <sld:AnchorPointY>-0.5</sld:AnchorPointY>
+                </sld:AnchorPoint>
+              </sld:PointPlacement>
+            </sld:LabelPlacement>
+            <sld:Fill>
+              <sld:CssParameter name="fill">#000000</sld:CssParameter>
+            </sld:Fill>
+            <sld:Halo>
+            </sld:Halo>
+          </sld:TextSymbolizer>
+          <sld:PointSymbolizer>
+            <sld:Graphic>
+              <sld:Mark>
+                <sld:WellKnownName>circle</sld:WellKnownName>
+                <sld:Fill>
+                  <sld:CssParameter name="fill">{{ .distance_marks_fill }}</sld:CssParameter>
+                  <sld:CssParameter name="fill-opacity">{{ .distance_marks_fill_opacity }}</sld:CssParameter>
+                </sld:Fill>
+                <sld:Stroke>
+                  <sld:CssParameter name="stroke">{{ .distance_marks_stroke }}</sld:CssParameter>
+                  <sld:CssParameter name="stroke-width">1</sld:CssParameter>
+                </sld:Stroke>
+              </sld:Mark>
+              <sld:Size>10</sld:Size>
+            </sld:Graphic>
+          </sld:PointSymbolizer>
+        </sld:Rule>
+        <sld:Rule>
+          <sld:Name>10</sld:Name>
+          <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
+            <ogc:PropertyIsEqualTo>
+              <ogc:Sub>
+                <ogc:PropertyName>hectometre</ogc:PropertyName>
+                <ogc:Mul>
+                  <ogc:Literal>10</ogc:Literal>
+                  <ogc:Function name="round">
+                    <ogc:Div>
+                      <ogc:PropertyName>hectometre</ogc:PropertyName>
+                      <ogc:Literal>10</ogc:Literal>
+                    </ogc:Div>
+                  </ogc:Function>
+                </ogc:Mul>
+              </ogc:Sub>
+              <ogc:Literal>0</ogc:Literal>
+            </ogc:PropertyIsEqualTo>
+          </ogc:Filter>
+          <sld:MinScaleDenominator>10000</sld:MinScaleDenominator>
+          <sld:MaxScaleDenominator>60000</sld:MaxScaleDenominator>
+           <sld:TextSymbolizer>
+            <sld:Label>
+              <ogc:Function name="round">
+                <ogc:Div>
+                  <ogc:PropertyName>hectometre</ogc:PropertyName>
+                  <ogc:Literal>10</ogc:Literal>
+                </ogc:Div>
+                </ogc:Function>
+            </sld:Label>
+            <sld:Font>
+              <sld:CssParameter name="font-family">Sans Serif</sld:CssParameter>
+              <sld:CssParameter name="font-size">10</sld:CssParameter>
+              <sld:CssParameter name="font-weight">bold</sld:CssParameter>
+            </sld:Font>
+            <sld:LabelPlacement>
+              <sld:PointPlacement>
+                <sld:AnchorPoint>
+                  <sld:AnchorPointX>0</sld:AnchorPointX>
+                  <sld:AnchorPointY>-0.5</sld:AnchorPointY>
+                </sld:AnchorPoint>
+              </sld:PointPlacement>
+            </sld:LabelPlacement>
+            <sld:Fill>
+              <sld:CssParameter name="fill">#000000</sld:CssParameter>
+            </sld:Fill>
+            <sld:Halo>
+            </sld:Halo>
+          </sld:TextSymbolizer>
+          <sld:PointSymbolizer>
+            <sld:Graphic>
+              <sld:Mark>
+                <sld:WellKnownName>circle</sld:WellKnownName>
+                <sld:Fill>
+                  <sld:CssParameter name="fill">{{ .distance_marks_fill }}</sld:CssParameter>
+                  <sld:CssParameter name="fill-opacity">{{ .distance_marks_fill_opacity }}</sld:CssParameter>
+                </sld:Fill>
+                <sld:Stroke>
+                  <sld:CssParameter name="stroke">{{ .distance_marks_stroke }}</sld:CssParameter>
+                  <sld:CssParameter name="stroke-width">1</sld:CssParameter>
+                </sld:Stroke>
+              </sld:Mark>
+              <sld:Size>10</sld:Size>
+            </sld:Graphic>
+          </sld:PointSymbolizer>
+        </sld:Rule>
+        <sld:Rule>
+          <sld:Name>1</sld:Name>
+          <sld:MaxScaleDenominator>10000</sld:MaxScaleDenominator>
+           <sld:TextSymbolizer>
+            <sld:Label>
+              <ogc:Div>
+                <ogc:PropertyName>hectometre</ogc:PropertyName>
+                <ogc:Literal>10</ogc:Literal>
+              </ogc:Div>
+            </sld:Label>
+            <sld:Font>
+              <sld:CssParameter name="font-family">Sans Serif</sld:CssParameter>
+              <sld:CssParameter name="font-size">10</sld:CssParameter>
+              <sld:CssParameter name="font-weight">bold</sld:CssParameter>
+            </sld:Font>
+            <sld:LabelPlacement>
+              <sld:PointPlacement>
+                <sld:AnchorPoint>
+                  <sld:AnchorPointX>0</sld:AnchorPointX>
+                  <sld:AnchorPointY>-0.5</sld:AnchorPointY>
+                </sld:AnchorPoint>
+              </sld:PointPlacement>
+            </sld:LabelPlacement>
+            <sld:Fill>
+              <sld:CssParameter name="fill">#000000</sld:CssParameter>
+            </sld:Fill>
+            <sld:Halo>
+            </sld:Halo>
+          </sld:TextSymbolizer>
+          <sld:PointSymbolizer>
+            <sld:Graphic>
+              <sld:Mark>
+                <sld:WellKnownName>circle</sld:WellKnownName>
+                <sld:Fill>
+                  <sld:CssParameter name="fill">{{ .distance_marks_fill }}</sld:CssParameter>
+                  <sld:CssParameter name="fill-opacity">{{ .distance_marks_fill_opacity }}</sld:CssParameter>
+                </sld:Fill>
+                <sld:Stroke>
+                  <sld:CssParameter name="stroke">{{ .distance_marks_stroke }}</sld:CssParameter>
+                  <sld:CssParameter name="stroke-width">1</sld:CssParameter>
+                </sld:Stroke>
+              </sld:Mark>
+              <sld:Size>10</sld:Size>
+            </sld:Graphic>
+          </sld:PointSymbolizer>
+        </sld:Rule>
+      </sld:FeatureTypeStyle>
+    </sld:UserStyle>
+  </sld:NamedLayer>
+</sld:StyledLayerDescriptor>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/style-templates/sounding_differences.sld-template	Thu Sep 26 12:16:23 2019 +0200
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<StyledLayerDescriptor
+    xmlns="http://www.opengis.net/sld"
+    xmlns:se="http://www.opengis.net/se"
+    xmlns:ogc="http://www.opengis.net/ogc"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd"
+    version="1.1.0">
+  <NamedLayer>
+    <se:Name>sounding_differences</se:Name>
+    <UserStyle>
+      <se:Name>sounding_differences</se:Name>
+      <se:FeatureTypeStyle>
+          <se:Name>differences</se:Name>
+        <se:Description>
+          <se:Abstract>
+            FeatureTypeStyle defining colour classes for height attribute
+          </se:Abstract>
+        </se:Description>
+        {{ range . -}}
+        <se:Rule>
+        {{- if not .HasLow }}
+          <se:Name>&#8804; {{ printf "%g" .High }}</se:Name>
+          <ogc:Filter>
+            <ogc:PropertyIsLessThanOrEqualTo>
+              <ogc:PropertyName>height</ogc:PropertyName>
+              <ogc:Literal>{{ printf "%f" .High }}</ogc:Literal>
+            </ogc:PropertyIsLessThanOrEqualTo>
+          </ogc:Filter>
+        {{- else if not .HasHigh }}
+          <se:Name>&gt; {{ printf "%g" .Low }}</se:Name>
+          <ogc:Filter>
+            <ogc:PropertyIsGreaterThanOrEqualTo>
+              <ogc:PropertyName>height</ogc:PropertyName>
+              <ogc:Literal>{{ printf "%f" .Low }}</ogc:Literal>
+            </ogc:PropertyIsGreaterThanOrEqualTo>
+          </ogc:Filter>
+        {{- else }}
+          <se:Name>&#8804; {{ printf "%g" .High }}</se:Name>
+          <ogc:Filter>
+            <ogc:And>
+              <ogc:PropertyIsGreaterThan>
+                <ogc:PropertyName>height</ogc:PropertyName>
+                <ogc:Literal>{{ printf "%f" .Low }}</ogc:Literal>
+              </ogc:PropertyIsGreaterThan>
+              <ogc:PropertyIsLessThanOrEqualTo>
+                <ogc:PropertyName>height</ogc:PropertyName>
+                <ogc:Literal>{{ printf "%f" .High }}</ogc:Literal>
+              </ogc:PropertyIsLessThanOrEqualTo>
+            </ogc:And>
+          </ogc:Filter>
+        {{- end }}
+           <se:LineSymbolizer>
+            <se:Stroke>
+              <se:SvgParameter name="stroke">{{ .Color }}</se:SvgParameter>
+              <se:SvgParameter name="stroke-width">0.5</se:SvgParameter>
+            </se:Stroke>
+          </se:LineSymbolizer>
+        </se:Rule>
+        {{ end }}
+      </se:FeatureTypeStyle>
+      <se:FeatureTypeStyle>
+        <se:Name>contour_lines_emph</se:Name>
+        <se:Description>
+          <se:Abstract>
+            FeatureTypeStyle for emphasized contour lines
+          </se:Abstract>
+          </se:Description>
+          <se:Rule>
+            <se:LegendGraphic>
+              <se:Graphic>
+            </se:Graphic>
+          </se:LegendGraphic>
+          <ogc:Filter>
+             <ogc:Or>
+              {{ range . -}}
+              {{ if .HasHigh -}}
+                <ogc:PropertyIsEqualTo>
+                <ogc:Function name="numberFormat">
+                  <ogc:Literal>0.000000</ogc:Literal>
+                  <ogc:PropertyName>height</ogc:PropertyName>
+                </ogc:Function>
+                <ogc:Literal>{{ printf "%f" .High }}</ogc:Literal>
+                </ogc:PropertyIsEqualTo>
+              {{ end -}}
+              {{ end }}
+            </ogc:Or>
+          </ogc:Filter>
+          <se:MaxScaleDenominator>5e3</se:MaxScaleDenominator>
+          <se:LineSymbolizer>
+            <se:Stroke>
+              <se:SvgParameter name="stroke-width">1.5</se:SvgParameter>
+              <se:SvgParameter name="stroke">
+                <ogc:Function name="Recode">
+                  <ogc:Function name="numberFormat">
+                    <ogc:Literal>0.000000</ogc:Literal>
+                    <ogc:PropertyName>height</ogc:PropertyName>
+                  </ogc:Function>
+                  {{ range . -}}
+                  {{ if .HasHigh -}}
+                  <ogc:Literal>{{ printf "%f" .High }}</ogc:Literal>
+                  <ogc:Literal>{{ .Color }}</ogc:Literal>
+                  {{ end -}}
+                  {{ end }}
+                </ogc:Function>
+              </se:SvgParameter>
+            </se:Stroke>
+          </se:LineSymbolizer>
+        </se:Rule>
+      </se:FeatureTypeStyle>
+      <se:FeatureTypeStyle>
+        <se:Name>contour_lines_label</se:Name>
+        <se:Description>
+          <se:Abstract>
+            FeatureTypeStyle for labels at contour lines
+          </se:Abstract>
+        </se:Description>
+        <se:Rule>
+          <se:MaxScaleDenominator>5e3</se:MaxScaleDenominator>
+          <se:TextSymbolizer>
+            <se:Label>
+              <ogc:Function name="Recode">
+                <ogc:Function name="numberFormat">
+                  <ogc:Literal>0.000000</ogc:Literal>
+                  <ogc:PropertyName>height</ogc:PropertyName>
+                </ogc:Function>
+                {{ range . -}}
+                {{ if .HasHigh -}}
+                    <ogc:Literal>
+                    {{- printf "%f" .High -}}
+                    </ogc:Literal><ogc:Literal>
+                    {{- printf "%g" .High -}}
+                    </ogc:Literal>
+                {{ end -}}
+                {{ end }}
+              </ogc:Function>
+            </se:Label>
+            <se:Font>
+              <se:SvgParameter name="font-family">Avenir</se:SvgParameter>
+              <se:SvgParameter name="font-family">Helvetica</se:SvgParameter>
+              <se:SvgParameter name="font-family">Arial</se:SvgParameter>
+              <se:SvgParameter name="font-family">sans-serif</se:SvgParameter>
+            </se:Font>
+            <se:LabelPlacement>
+              <se:LinePlacement>
+                <se:PerpendicularOffset>5</se:PerpendicularOffset>
+              </se:LinePlacement>
+            </se:LabelPlacement>
+            <se:Fill>
+              <se:SvgParameter name="fill">#070707</se:SvgParameter>
+            </se:Fill>
+          </se:TextSymbolizer>
+        </se:Rule>
+      </se:FeatureTypeStyle>
+    </UserStyle>
+  </NamedLayer>
+</StyledLayerDescriptor>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/style-templates/sounding_results_contour_lines_geoserver.sld-template	Thu Sep 26 12:16:23 2019 +0200
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<StyledLayerDescriptor
+    xmlns="http://www.opengis.net/sld"
+    xmlns:se="http://www.opengis.net/se"
+    xmlns:ogc="http://www.opengis.net/ogc"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd"
+    version="1.1.0">
+  <NamedLayer>
+    <se:Name>sounding_results_contour_lines</se:Name>
+    <UserStyle>
+      <se:Name>sounding_results_contour_lines</se:Name>
+      <se:FeatureTypeStyle>
+          <se:Name>contour_line_colours</se:Name>
+        <se:Description>
+          <se:Abstract>
+            FeatureTypeStyle defining colour classes for height attribute
+          </se:Abstract>
+        </se:Description>
+        {{ range . -}}
+        <se:Rule>
+        {{- if not .HasLow }}
+          <se:Name>&#8804; {{ printf "%g" .High }}</se:Name>
+          <ogc:Filter>
+            <ogc:PropertyIsLessThanOrEqualTo>
+              <ogc:PropertyName>height</ogc:PropertyName>
+              <ogc:Literal>{{ printf "%f" .High }}</ogc:Literal>
+            </ogc:PropertyIsLessThanOrEqualTo>
+          </ogc:Filter>
+        {{- else if not .HasHigh }}
+          <se:Name>&gt; {{ printf "%g" .Low }}</se:Name>
+          <ogc:Filter>
+            <ogc:PropertyIsGreaterThanOrEqualTo>
+              <ogc:PropertyName>height</ogc:PropertyName>
+              <ogc:Literal>{{ printf "%f" .Low }}</ogc:Literal>
+            </ogc:PropertyIsGreaterThanOrEqualTo>
+          </ogc:Filter>
+        {{- else }}
+          <se:Name>&#8804; {{ printf "%g" .High }}</se:Name>
+          <ogc:Filter>
+            <ogc:And>
+              <ogc:PropertyIsGreaterThan>
+                <ogc:PropertyName>height</ogc:PropertyName>
+                <ogc:Literal>{{ printf "%f" .Low }}</ogc:Literal>
+              </ogc:PropertyIsGreaterThan>
+              <ogc:PropertyIsLessThanOrEqualTo>
+                <ogc:PropertyName>height</ogc:PropertyName>
+                <ogc:Literal>{{ printf "%f" .High }}</ogc:Literal>
+              </ogc:PropertyIsLessThanOrEqualTo>
+            </ogc:And>
+          </ogc:Filter>
+        {{- end }}
+           <se:LineSymbolizer>
+            <se:Stroke>
+              <se:SvgParameter name="stroke">{{ .Color }}</se:SvgParameter>
+              <se:SvgParameter name="stroke-width">0.5</se:SvgParameter>
+            </se:Stroke>
+          </se:LineSymbolizer>
+        </se:Rule>
+        {{ end }}
+      </se:FeatureTypeStyle>
+      <se:FeatureTypeStyle>
+        <se:Name>contour_lines_emph</se:Name>
+        <se:Description>
+          <se:Abstract>
+            FeatureTypeStyle for emphasized contour lines
+          </se:Abstract>
+          </se:Description>
+          <se:Rule>
+            <se:LegendGraphic>
+              <se:Graphic>
+            </se:Graphic>
+          </se:LegendGraphic>
+          <ogc:Filter>
+             <ogc:Or>
+              {{ range . -}}
+              {{ if .HasHigh -}}
+                <ogc:PropertyIsEqualTo>
+                <ogc:Function name="numberFormat">
+                  <ogc:Literal>0.000000</ogc:Literal>
+                  <ogc:PropertyName>height</ogc:PropertyName>
+                </ogc:Function>
+                <ogc:Literal>{{ printf "%f" .High }}</ogc:Literal>
+                </ogc:PropertyIsEqualTo>
+              {{ end -}}
+              {{ end }}
+            </ogc:Or>
+          </ogc:Filter>
+          <se:MaxScaleDenominator>5e3</se:MaxScaleDenominator>
+          <se:LineSymbolizer>
+            <se:Stroke>
+              <se:SvgParameter name="stroke-width">1.5</se:SvgParameter>
+              <se:SvgParameter name="stroke">
+                <ogc:Function name="Recode">
+                  <ogc:Function name="numberFormat">
+                    <ogc:Literal>0.000000</ogc:Literal>
+                    <ogc:PropertyName>height</ogc:PropertyName>
+                  </ogc:Function>
+                  {{ range . -}}
+                  {{ if .HasHigh -}}
+                  <ogc:Literal>{{ printf "%f" .High }}</ogc:Literal>
+                  <ogc:Literal>{{ .Color }}</ogc:Literal>
+                  {{ end -}}
+                  {{ end }}
+                </ogc:Function>
+              </se:SvgParameter>
+            </se:Stroke>
+          </se:LineSymbolizer>
+        </se:Rule>
+      </se:FeatureTypeStyle>
+      <se:FeatureTypeStyle>
+        <se:Name>contour_lines_label</se:Name>
+        <se:Description>
+          <se:Abstract>
+            FeatureTypeStyle for labels at contour lines
+          </se:Abstract>
+        </se:Description>
+        <se:Rule>
+          <se:MaxScaleDenominator>5e3</se:MaxScaleDenominator>
+          <se:TextSymbolizer>
+            <se:Label>
+              <ogc:Function name="Recode">
+                <ogc:Function name="numberFormat">
+                  <ogc:Literal>0.000000</ogc:Literal>
+                  <ogc:PropertyName>height</ogc:PropertyName>
+                </ogc:Function>
+                {{ range . -}}
+                {{ if .HasHigh -}}
+                    <ogc:Literal>
+                    {{- printf "%f" .High -}}
+                    </ogc:Literal><ogc:Literal>
+                    {{- printf "%g" .High -}}
+                    </ogc:Literal>
+                {{ end -}}
+                {{ end }}
+              </ogc:Function>
+            </se:Label>
+            <se:Font>
+              <se:SvgParameter name="font-family">Avenir</se:SvgParameter>
+              <se:SvgParameter name="font-family">Helvetica</se:SvgParameter>
+              <se:SvgParameter name="font-family">Arial</se:SvgParameter>
+              <se:SvgParameter name="font-family">sans-serif</se:SvgParameter>
+            </se:Font>
+            <se:LabelPlacement>
+              <se:LinePlacement>
+                <se:PerpendicularOffset>5</se:PerpendicularOffset>
+              </se:LinePlacement>
+            </se:LabelPlacement>
+            <se:Fill>
+              <se:SvgParameter name="fill">#070707</se:SvgParameter>
+            </se:Fill>
+          </se:TextSymbolizer>
+        </se:Rule>
+      </se:FeatureTypeStyle>
+    </UserStyle>
+  </NamedLayer>
+</StyledLayerDescriptor>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/style-templates/upload-styles.sh	Thu Sep 26 12:16:23 2019 +0200
@@ -0,0 +1,119 @@
+#!/bin/bash -e
+#
+# This is Free Software under GNU Affero General Public License v >= 3.0
+# without warranty, see README.md and license for details.
+#
+# SPDX-License-Identifier: AGPL-3.0-or-later
+# License-Filename: LICENSES/AGPL-3.0.txt
+#
+# Copyright (C) 2019 by via donau
+#   – Österreichische Wasserstraßen-Gesellschaft mbH
+# Software engineering by Intevation GmbH
+#
+# Author(s):
+# * Sascha Wilde <wilde@intevation.de>
+
+ME=`basename "$0"`
+BASEDIR=`dirname "$0"`
+
+usage()
+{
+  cat <<EOF
+$ME [OPTION]...
+
+Upload map styles to gemma.
+
+Options:
+  -P, --g_port=GPORT  connect to gemma server at GPORT. Default 8000.
+  -g, --g_host=GHOST  connect to gemma server on GHOST. Default "localhost".
+  -u, --g_user=GUSER  login to gemma as user GUSER. Default "sophie".
+      --g_pw=GPW      password for GUSER. Default "so2Phie4".
+      --help          display this help and exit
+
+EOF
+}
+
+fatal()
+{
+  echo >&2 "$1"
+  exit 23
+}
+
+# Defaults:
+
+g_port=8000
+g_host="localhost"
+g_user="sophie"
+g_pw="so2Phie4"
+
+# Parse options:
+
+OPTS=`getopt \
+      -l help,g_port:,g_host:,g_user:,g_pw: \
+      -o P:g:u: -n "$ME" -- "$@"`
+[ $? -eq 0 ] || { usage ; exit 1 ; }
+
+eval set -- "$OPTS"
+
+while true ; do
+  case "$1" in
+    --g_port|-P)
+      g_port="$2"
+      shift 2
+      ;;
+    --g_host|-g)
+      g_host="$2"
+      shift 2
+      ;;
+    --g_user|-u)
+      g_user="$2"
+      shift 2
+      ;;
+    --g_pw)
+      g_pw="$2"
+      shift 2
+      ;;
+    --help)
+      { usage ; exit 0 ; }
+      ;;
+    --)
+      shift
+      break
+      ;;
+  esac
+done
+
+if [ $# != 0 ] ; then
+  { usage ; exit 23 ; }
+fi
+
+# Main ------------------------------------------------------------
+
+# Login to gemma server
+login=$(curl -f -s -S -X POST \
+             -d "{\"user\":\"${g_user}\",\"password\":\"${g_pw}\"}" \
+             "http://${g_host}:${g_port}/api/login")
+token=$(jq -r '.token' <<<"$login")
+if [ -z "$token" ]
+then
+  echo "could not login to gemma server" >&2
+  exit 1
+fi
+
+roles=$(jq -r '.roles' <<<"$login")
+
+basedir=$( dirname $( realpath "${BASH_SOURCE[0]}" ))
+datadir="${basedir}/."
+
+if jq -e 'any(. == "sys_admin")' <<<"$roles" > /dev/null
+then
+  echo "== Configuring geoserver styles" >&2
+  for style in $(basename -s .sld-template $(ls $datadir/*.sld-template))
+  do
+    curl -f -s -S -H "X-Gemma-Auth:${token}" -X POST \
+         -F style=@"${datadir}/${style}.sld-template" \
+         "http://${g_host}:${g_port}/api/geo/style/${style}"
+  done
+else
+  echo >&2 'Not authorized as sys_admin'
+fi
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/style-templates/waterway_area.sld-template	Thu Sep 26 12:16:23 2019 +0200
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<StyledLayerDescriptor version="1.0.0"
+  xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/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>waterway_area</Name>
+    <UserStyle>
+      <Title>A yellow polygon style</Title>
+      <FeatureTypeStyle>
+        <Rule>
+          <Title>yellow polygon</Title>
+          <PolygonSymbolizer>
+            <Stroke>
+	       <CssParameter name="stroke">{{ .waterway_area_stroke }}</CssParameter>
+              <CssParameter name="stroke-width">1</CssParameter>
+            </Stroke>
+          </PolygonSymbolizer>
+        </Rule>
+      </FeatureTypeStyle>
+    </UserStyle>
+  </NamedLayer>
+</StyledLayerDescriptor>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/style-templates/waterway_axis.sld-template	Thu Sep 26 12:16:23 2019 +0200
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<StyledLayerDescriptor version="1.0.0"
+  xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/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>waterway_axis</Name>
+    <UserStyle>
+      <Title>A cyan line style</Title>
+      <FeatureTypeStyle>
+        <Rule>
+          <Title>cyan line</Title>
+          <LineSymbolizer>
+            <Stroke>
+	       <CssParameter name="stroke">{{ .waterway_axis_stroke }}</CssParameter>
+              <CssParameter name="stroke-dasharray">5 5</CssParameter>
+              <!--CssParameter name="stroke-opacity">0.5</CssParameter-->
+            </Stroke>
+          </LineSymbolizer>
+        </Rule>
+      </FeatureTypeStyle>
+    </UserStyle>
+  </NamedLayer>
+</StyledLayerDescriptor>