Skip to content

Commit

Permalink
GEOS-8823: SLDservice improvements for the classify service, also fix…
Browse files Browse the repository at this point in the history
…ed unit tests and inclusion in the community build
  • Loading branch information
mbarto committed Jul 5, 2018
1 parent 951bb18 commit 3a22a29
Show file tree
Hide file tree
Showing 11 changed files with 1,096 additions and 162 deletions.
4 changes: 2 additions & 2 deletions src/community/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@
<descriptor>release/ext-activeMQ.xml</descriptor>
<descriptor>release/ext-solr.xml</descriptor>
<!--descriptor>release/ext-geofence.xml</descriptor-->
<!-- <descriptor>release/ext-sldservice.xml</descriptor> -->
<descriptor>release/ext-sldservice.xml</descriptor>
<!-- <descriptor>release/ext-rest-upload.xml</descriptor> -->
<descriptor>release/ext-gwc-distributed.xml</descriptor>
<!--descriptor>release/ext-geofence-server.xml</descriptor-->
Expand Down Expand Up @@ -225,7 +225,7 @@
<!-- <module>rest-upload</module> -->
<!--module>geofence</module-->
<!--module>geofence-server</module-->
<!-- <module>sldService</module> -->
<module>sldService</module>
<module>params-extractor</module>
<module>wps-remote</module>
<module>wps-jdbc</module>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package org.geoserver.sldservice.rest;

import javax.xml.transform.TransformerException;
import org.geoserver.catalog.Catalog;
import org.geoserver.rest.catalog.AbstractCatalogController;
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.styling.SLDTransformer;
import org.geotools.styling.StyleFactory;
import org.geotools.styling.StyledLayerDescriptor;

public abstract class BaseSLDServiceController extends AbstractCatalogController {
protected static final StyleFactory SF = CommonFactoryFinder.getStyleFactory();

public BaseSLDServiceController(Catalog catalog) {
super(catalog);
}

protected String sldAsString(StyledLayerDescriptor sld) throws TransformerException {
SLDTransformer transform = new SLDTransformer();
transform.setIndentation(2);
return transform.transform(sld);
}
}

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,13 @@
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.transform.TransformerException;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.CoverageInfo;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.catalog.ResourceInfo;
import org.geoserver.catalog.StyleInfo;
import org.geoserver.rest.RestBaseController;
import org.geoserver.rest.catalog.AbstractCatalogController;
import org.geoserver.sldservice.utils.classifier.ColorRamp;
import org.geoserver.sldservice.utils.classifier.impl.BlueColorRamp;
import org.geoserver.sldservice.utils.classifier.impl.CustomColorRamp;
Expand All @@ -30,10 +30,12 @@
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.styling.ColorMap;
import org.geotools.styling.FeatureTypeStyle;
import org.geotools.styling.NamedLayer;
import org.geotools.styling.RasterSymbolizer;
import org.geotools.styling.Rule;
import org.geotools.styling.Style;
import org.geotools.styling.StyleBuilder;
import org.geotools.styling.StyledLayerDescriptor;
import org.geotools.styling.Symbolizer;
import org.geotools.util.logging.Logging;
import org.opengis.filter.FilterFactory2;
Expand All @@ -53,7 +55,7 @@
@RestController
@ControllerAdvice
@RequestMapping(path = RestBaseController.ROOT_PATH + "/sldservice")
public class RasterizerController extends AbstractCatalogController {
public class RasterizerController extends BaseSLDServiceController {
private static final Logger LOGGER = Logging.getLogger(RasterizerController.class);

public enum COLORRAMP_TYPE {
Expand Down Expand Up @@ -162,8 +164,21 @@ public Object rasterize(
} catch (Exception e) {
throw new InvalidSymbolizer();
}

return wrapObject(rasterized, Style.class);
StyledLayerDescriptor sld = SF.createStyledLayerDescriptor();
NamedLayer namedLayer = SF.createNamedLayer();
namedLayer.setName(layerName);
namedLayer.addStyle(rasterized);
sld.addStyledLayer(namedLayer);
try {
return sldAsString(sld);
} catch (TransformerException e) {
if (LOGGER.isLoggable(Level.FINE))
LOGGER.log(
Level.FINE,
"Exception occurred while transforming the style "
+ e.getLocalizedMessage(),
e);
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,30 @@ public class RulesBuilder {

private StyleBuilder sb;

private double strokeWeight = 1;
private Color strokeColor = Color.BLACK;
private boolean includeStrokeForPoints = false;

public RulesBuilder() {
ff = CommonFactoryFinder.getFilterFactory2(GeoTools.getDefaultHints());
styleFactory = CommonFactoryFinder.getStyleFactory(GeoTools.getDefaultHints());
sb = new StyleBuilder();
}

public void setStrokeWeight(double strokeWeight) {
this.strokeWeight = strokeWeight;
}

public void setStrokeColor(Color strokeColor) {
if (strokeColor != null) {
this.strokeColor = strokeColor;
}
}

public void setIncludeStrokeForPoints(boolean includeStrokeForPoints) {
this.includeStrokeForPoints = includeStrokeForPoints;
}

/**
* Generate a List of rules using quantile classification Sets up only filter not symbolizer
*
Expand Down Expand Up @@ -213,7 +231,10 @@ public void polygonStyle(List<Rule> rules, ColorRamp fillRamp, boolean reverseCo
rule.setSymbolizers(
new Symbolizer[] {
sb.createPolygonSymbolizer(
sb.createStroke(Color.BLACK, 1), sb.createFill(color))
strokeWeight < 0
? null
: sb.createStroke(strokeColor, strokeWeight),
sb.createFill(color))
});
}
} catch (Exception e) {
Expand Down Expand Up @@ -256,7 +277,9 @@ public void pointStyle(List<Rule> rules, ColorRamp fillRamp, boolean reverseColo
sb.createMark(
StyleBuilder.MARK_CIRCLE,
sb.createFill(color),
sb.createStroke(color));
includeStrokeForPoints
? sb.createStroke(strokeColor, strokeWeight)
: null);
rule.setSymbolizers(
new Symbolizer[] {
sb.createPointSymbolizer(sb.createGraphic(null, mark, null))
Expand Down Expand Up @@ -316,7 +339,7 @@ public StyleFactory getStyleFactory() {
* @param groups
* @param property
*/
private List<Rule> openRangedRules(
public List<Rule> openRangedRules(
RangedClassifier groups, String property, Class<?> propertyType, boolean normalize) {

Rule r;
Expand All @@ -327,7 +350,7 @@ private List<Rule> openRangedRules(
try {
/* First class */
r = styleFactory.createRule();
if (groups.getMin(0).equals(groups.getMax(0))) {
/*if (groups.getMin(0).equals(groups.getMax(0))) {
f = ff.equals(att, ff.literal(groups.getMax(0)));
r.setFilter(f);
r.setTitle(ff.literal(groups.getMax(0)).toString());
Expand All @@ -337,7 +360,11 @@ private List<Rule> openRangedRules(
r.setFilter(f);
r.setTitle(" <= " + ff.literal(groups.getMax(0)));
list.add(r);
}
}*/
f = ff.lessOrEqual(att, ff.literal(groups.getMax(0)));
r.setFilter(f);
r.setTitle(" <= " + ff.literal(groups.getMax(0)));
list.add(r);
for (int i = 1; i < groups.getSize() - 1; i++) {
r = styleFactory.createRule();
if (groups.getMin(i).equals(groups.getMax(i))) {
Expand All @@ -361,7 +388,7 @@ private List<Rule> openRangedRules(
}
/* Last class */
r = styleFactory.createRule();
if (groups.getMin(groups.getSize() - 1).equals(groups.getMax(groups.getSize() - 1))) {
/*if (groups.getMin(groups.getSize() - 1).equals(groups.getMax(groups.getSize() - 1))) {
f = ff.equals(att, ff.literal(groups.getMin(groups.getSize() - 1)));
r.setFilter(f);
r.setTitle(ff.literal(groups.getMin(groups.getSize() - 1)).toString());
Expand All @@ -371,7 +398,11 @@ private List<Rule> openRangedRules(
r.setFilter(f);
r.setTitle(" > " + ff.literal(groups.getMin(groups.getSize() - 1)));
list.add(r);
}
}*/
f = ff.greater(att, ff.literal(groups.getMin(groups.getSize() - 1)));
r.setFilter(f);
r.setTitle(" > " + ff.literal(groups.getMin(groups.getSize() - 1)));
list.add(r);
return list;
} catch (Exception e) {
if (LOGGER.isLoggable(Level.INFO))
Expand Down Expand Up @@ -399,7 +430,7 @@ private Expression normalizeProperty(
* @param groups
* @param property
*/
private List<Rule> closedRangedRules(
public List<Rule> closedRangedRules(
RangedClassifier groups, String property, Class<?> propertyType, boolean normalize) {

Rule r;
Expand Down Expand Up @@ -450,7 +481,7 @@ private List<Rule> closedRangedRules(
* @param groups
* @param property
*/
private List<Rule> explicitRules(
public List<Rule> explicitRules(
ExplicitClassifier groups, String property, Class<?> propertyType) {

Rule r;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ public class CustomColorRamp implements ColorRamp {

private Color midColor = null;

private List<Color> inputColors = null;

public int getNumClasses() {
return classNum;
}
Expand Down Expand Up @@ -63,50 +65,81 @@ public void setMid(Color mid) {
midColor = mid;
}

public void setInputColors(List<Color> inputColors) {
this.inputColors = inputColors;
}

protected void createRamp() throws Exception {
int red, green, blue;
double sRed, sGreen, sBlue;
int mid;
if (startColor == null || endColor == null)
throw new Exception("Start or end color not setted unable to build color ramp");

if (midColor == null) {
sRed = ((double) endColor.getRed() - startColor.getRed()) / (double) (classNum - 1);
sGreen =
((double) endColor.getGreen() - startColor.getGreen())
/ (double) (classNum - 1);
sBlue = ((double) endColor.getBlue() - startColor.getBlue()) / (double) (classNum - 1);
for (int i = 0; i < classNum - 1; i++) {
red = (int) (sRed * i + startColor.getRed());
green = (int) (sGreen * i + startColor.getGreen());
blue = (int) (sBlue * i + startColor.getBlue());
colors.add(new Color(red, green, blue));
int classes = classNum - 1;
if (inputColors != null) {
if (classes == inputColors.size()) {
colors = inputColors;
} else if (classes > inputColors.size()) {
int slices = inputColors.size() - 1;
int sliceSize = classes / slices;
colors = new ArrayList<Color>();
int total = 0;
for (int i = 0; i < slices - 1; i++) {
total += sliceSize - 1;
interpolate(
colors, inputColors.get(i), inputColors.get(i + 1), sliceSize, i > 0);
}
interpolate(
colors,
inputColors.get(inputColors.size() - 2),
inputColors.get(inputColors.size() - 1),
classes - total,
true);
} else {
colors = inputColors.subList(0, classes);
}
} else {
mid = (classNum - 1) / 2;
int rest = (classNum - 1) % 2;
sRed = ((double) midColor.getRed() - startColor.getRed()) / (double) (mid);
sGreen = ((double) midColor.getGreen() - startColor.getGreen()) / (double) (mid);
sBlue = ((double) midColor.getBlue() - startColor.getBlue()) / (double) (mid);
for (int i = 0; i < mid; i++) {
red = (int) (sRed * i + startColor.getRed());
green = (int) (sGreen * i + startColor.getGreen());
blue = (int) (sBlue * i + startColor.getBlue());
colors.add(new Color(red, green, blue));
}
int count = mid;
sRed = ((double) endColor.getRed() - midColor.getRed()) / (double) (mid + rest - 1);
sGreen =
((double) endColor.getGreen() - midColor.getGreen())
/ (double) (mid + rest - 1);
sBlue = ((double) endColor.getBlue() - midColor.getBlue()) / (double) (mid + rest - 1);
for (int i = 0; i < (mid + rest); i++) {
red = (int) (sRed * i + midColor.getRed());
green = (int) (sGreen * i + midColor.getGreen());
blue = (int) (sBlue * i + midColor.getBlue());
colors.add(new Color(red, green, blue));
count++;
int mid;
if (startColor == null || endColor == null)
throw new Exception("Start or end color not setted unable to build color ramp");

if (midColor == null) {
interpolate(colors, startColor, endColor, classNum - 1);
} else {
mid = classes / 2;
int rest = classes - mid;
interpolate(colors, startColor, midColor, mid);
interpolate(colors, midColor, endColor, rest, true);
}
}
}

private void interpolate(
List<Color> result, Color start, Color end, int samples, boolean offset) {
if (offset) {
double sRed = ((double) end.getRed() - start.getRed()) / (double) (samples);
double sGreen = ((double) end.getGreen() - start.getGreen()) / (double) (samples);
double sBlue = ((double) end.getBlue() - start.getBlue()) / (double) (samples);

start =
new Color(
(int) (start.getRed() + sRed),
(int) (start.getGreen() + sGreen),
(int) (start.getBlue() + sBlue));
}
interpolate(colors, start, end, samples);
}

private void interpolate(List<Color> result, Color start, Color end, int samples) {
int red;
int green;
int blue;
double sRed;
double sGreen;
double sBlue;
sRed = ((double) end.getRed() - start.getRed()) / (double) (samples - 1);
sGreen = ((double) end.getGreen() - start.getGreen()) / (double) (samples - 1);
sBlue = ((double) end.getBlue() - start.getBlue()) / (double) (samples - 1);
for (int i = 0; i < samples; i++) {
red = (int) (sRed * i + start.getRed());
green = (int) (sGreen * i + start.getGreen());
blue = (int) (sBlue * i + start.getBlue());
result.add(new Color(red, green, blue));
}
}
}

0 comments on commit 3a22a29

Please sign in to comment.