module GeoserverMigrations::SldHelpers

Public Instance Methods

build_sld_filter(filter_hash) click to toggle source
# File lib/geoserver_migrations/sld_helpers.rb, line 5
    def build_sld_filter(filter_hash)
      filter_text = ""
      filters_count = filter_hash.keys.count
      if filters_count > 0
        if filters_count == 1
          filter_text = <<-FILTER
            <ogc:Filter>
              <ogc:PropertyIsEqualTo>
                <ogc:PropertyName>#{filter_hash.keys[0]}</ogc:PropertyName>
                <ogc:Literal>#{filter_hash.values[0]}</ogc:Literal>
              </ogc:PropertyIsEqualTo>
            </ogc:Filter>
          FILTER
        elsif filters_count == 2
          filter_text = <<-FILTER
            <ogc:Filter>
              <ogc:And>
                <ogc:PropertyIsEqualTo>
                  <ogc:PropertyName>#{filter_hash.keys[0]}</ogc:PropertyName>
                  <ogc:Literal>#{filter_hash.values[0]}</ogc:Literal>
                </ogc:PropertyIsEqualTo>
                <ogc:PropertyIsEqualTo>
                  <ogc:PropertyName>#{filter_hash.keys[1]}</ogc:PropertyName>
                  <ogc:Literal>#{filter_hash.values[1]}</ogc:Literal>
                </ogc:PropertyIsEqualTo>
              </ogc:And>  
            </ogc:Filter>
          FILTER
        else
          raise StandardError.new("Unsupported filter! For now we only support 1 or 2 filter-values :( :(")
        end
      end
      filter_text
    end
icon_style_with_label(title, icon_name, icon_style_options={}) click to toggle source
# File lib/geoserver_migrations/sld_helpers.rb, line 41
    def icon_style_with_label(title, icon_name, icon_style_options={})
      display_label = icon_style_options[:display_label] || title
      abstract      = icon_style_options[:abstract] || title

      filter_text = ""
      if icon_style_options[:filter].present? && icon_style_options[:filter].is_a?(Hash)
        filter_text = build_sld_filter(icon_style_options[:filter])
      end

      max_scale_text = ""
      if icon_style_options[:max_scale_denominator].present?
        max_scale_text = "<MaxScaleDenominator>#{icon_style_options[:max_scale_denominator]}</MaxScaleDenominator>"
      end

      @options[:sld] = <<-SLD.strip_heredoc 
        <?xml version="1.0" encoding="UTF-8"?>
        <StyledLayerDescriptor version="1.0.0" 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"
          xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd">
          <NamedLayer>
            <Name>#{title}</Name>
            <UserStyle>
              <Name>#{title}</Name>
              <Title>#{title}</Title>
              <Abstract>#{abstract}</Abstract>
              <FeatureTypeStyle>
                <Rule>
                  <Title>#{display_label}</Title>  
                  #{filter_text}
                  #{max_scale_text}  
                  <PointSymbolizer>
                    <Graphic>
                      <ExternalGraphic>
                        <OnlineResource xlink:type="simple" xlink:href="#{icon_name}" />
                        <Format>image/png</Format>
                      </ExternalGraphic>
                    </Graphic>
                    <VendorOption name="labelObstacle">true</VendorOption>
                  </PointSymbolizer>
                  <TextSymbolizer>
                    <Label>
                      <ogc:PropertyName>name</ogc:PropertyName>
                    </Label>
                    <Font>
                      <CssParameter name="font-family">Arial</CssParameter>
                      <CssParameter name="font-size">11</CssParameter>
                      <CssParameter name="font-style">normal</CssParameter>
                      <CssParameter name="font-weight">bold</CssParameter>
                    </Font>
                    <LabelPlacement>
                      <PointPlacement>
                        <AnchorPoint>
                          <AnchorPointX>0</AnchorPointX>
                          <AnchorPointY>0</AnchorPointY>
                        </AnchorPoint>
                      </PointPlacement>
                    </LabelPlacement>
                    <Halo>
                      <Radius>
                        <ogc:Literal>1</ogc:Literal>
                      </Radius>
                      <Fill>
                        <CssParameter name="fill">#ffffff</CssParameter>
                      </Fill>
                    </Halo>
                    <Fill>
                      <CssParameter name="fill">#2f3133</CssParameter>
                    </Fill>
                    <VendorOption name="maxDisplacement">40</VendorOption>
                    <!--VendorOption name="displacementMode">S, SW, W, NW, N</VendorOption-->
                    <VendorOption name="conflictResolution">true</VendorOption>   
                    <VendorOption name="partials">true</VendorOption>
                  </TextSymbolizer>          
                </Rule>
              </FeatureTypeStyle>
            </UserStyle>
          </NamedLayer>
        </StyledLayerDescriptor>
      SLD

    end
line_style(title, style_options={}) click to toggle source
# File lib/geoserver_migrations/sld_helpers.rb, line 199
    def line_style(title, style_options={})
      display_label = style_options[:display_label] || title
      abstract      = style_options[:abstract] || title

      stroke_colour = style_options[:stroke_colour] || "#000000"
      stroke_width  = style_options[:stroke_width]  || "1"


      filter_text = ""
      if style_options[:filter].present? && style_options[:filter].is_a?(Hash)
        filter_text = build_sld_filter(style_options[:filter])
      end

      max_scale_text = ""
      if style_options[:max_scale_denominator].present?
        max_scale_text = "<MaxScaleDenominator>#{style_options[:max_scale_denominator]}</MaxScaleDenominator>"
      end

      @options[:sld] = <<-SLD.strip_heredoc
        <?xml version="1.0" encoding="UTF-8"?>
        <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>#{title}</Name>
            <UserStyle>
              <Name>#{title}</Name>
              <Title>#{title}</Title>
              <Abstract>#{abstract}</Abstract>
              <FeatureTypeStyle>
                <Rule>
                  <Title>#{display_label}</Title>  
                  #{filter_text}
                  #{max_scale_text}  
                  <LineSymbolizer>
                    <Stroke>
                      <CssParameter name="stroke">#{stroke_colour}</CssParameter>
                      <CssParameter name="stroke-width">#{stroke_width}</CssParameter>
                   </Stroke>
                  </LineSymbolizer>
                </Rule>
              </FeatureTypeStyle>
            </UserStyle>
          </NamedLayer>
        </StyledLayerDescriptor>
      SLD

    end
polygon_style(title, style_options={}) click to toggle source
# File lib/geoserver_migrations/sld_helpers.rb, line 124
    def polygon_style(title, style_options={})
      display_label = style_options[:display_label] || title
      abstract      = style_options[:abstract] || title

      fill_colour   = style_options[:fill_colour]   || "#aaaaaa"
      fill_opacity  = style_options[:fill_opacity]  || "1"
      stroke_colour = style_options[:stroke_colour] || "#000000"
      stroke_width  = style_options[:stroke_width]  || "1"

      filter_text = ""
      if style_options[:filter].present? && style_options[:filter].is_a?(Hash)
        filter_text = build_sld_filter(style_options[:filter])
      end

      fill_style = ""
      unless style_options[:no_fill] == true
        fill_styles = ["<Fill>"]
        fill_styles << "                      <CssParameter name=\"fill\">#{fill_colour}</CssParameter>"
        fill_styles << "                      <CssParameter name=\"opacity\">#{fill_opacity}</CssParameter>" if style_options[:fill_opacity].present?
        fill_styles << "                    </Fill>"
        fill_style = fill_styles.join("\n")
      end


      stroke_styles = []
      stroke_styles << "<Stroke>"
      stroke_styles << "                      <CssParameter name=\"stroke\">#{stroke_colour}</CssParameter>"
      stroke_styles << "                      <CssParameter name=\"stroke-width\">#{stroke_width}</CssParameter>"

      if style_options[:stroke_dasharray].present?
        stroke_styles << "                      <CssParameter name=\"stroke-dasharray\">"
        stroke_styles << "                           <ogc:Literal>#{style_options[:stroke_dasharray]}</ogc:Literal>"
        stroke_styles << "                      </CssParameter>"
      end
      stroke_styles << "                    </Stroke>"
      stroke_style = stroke_styles.join("\n")

      max_scale_text = ""
      if style_options[:max_scale_denominator].present?
        max_scale_text = "<MaxScaleDenominator>#{style_options[:max_scale_denominator]}</MaxScaleDenominator>"
      end

      @options[:sld] = <<-SLD.strip_heredoc
        <?xml version="1.0" encoding="UTF-8"?>
        <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>#{title}</Name>
            <UserStyle>
              <Name>#{title}</Name>
              <Title>#{title}</Title>
              <Abstract>#{abstract}</Abstract>
              <FeatureTypeStyle>
                <Rule>
                  <Title>#{display_label}</Title>  
                  #{filter_text}
                  #{max_scale_text}  
                  <PolygonSymbolizer>   
                    #{fill_style}
                    #{stroke_style}
                  </PolygonSymbolizer>
                </Rule>
              </FeatureTypeStyle>
            </UserStyle>
          </NamedLayer>
        </StyledLayerDescriptor>
      SLD

    end