tim@335: package de.intevation.gnv.state.profile.horizontalcrosssection; tim@335: tim@468: import com.vividsolutions.jts.geom.Coordinate; tim@468: import com.vividsolutions.jts.geom.Envelope; sascha@484: import com.vividsolutions.jts.geom.MultiLineString; sascha@484: import com.vividsolutions.jts.geom.MultiPolygon; tim@468: import com.vividsolutions.jts.geom.Polygon; ingo@358: sascha@480: import de.intevation.artifactdatabase.Config; sascha@480: import de.intevation.artifactdatabase.XMLUtils; sascha@480: sascha@480: import de.intevation.artifacts.ArtifactNamespaceContext; sascha@480: import de.intevation.artifacts.CallContext; sascha@474: tim@468: import de.intevation.gnv.artifacts.cache.CacheFactory; sascha@480: tim@468: import de.intevation.gnv.artifacts.context.GNVArtifactContext; sascha@474: tim@335: import de.intevation.gnv.geobackend.base.Result; sascha@480: import de.intevation.gnv.geobackend.base.ResultDescriptor; sascha@474: tim@468: import de.intevation.gnv.geobackend.base.query.QueryExecutor; tim@468: import de.intevation.gnv.geobackend.base.query.QueryExecutorFactory; sascha@480: tim@468: import de.intevation.gnv.geobackend.base.query.exception.QueryException; sascha@474: sascha@480: import de.intevation.gnv.geobackend.sde.datasources.RasterObject; sascha@480: sascha@482: import de.intevation.gnv.math.AreaInterpolation; sascha@480: import de.intevation.gnv.math.AttributedPoint2ds; sascha@482: import de.intevation.gnv.math.Point2d; sascha@482: import de.intevation.gnv.math.QueriedXYDepth; sascha@480: sascha@484: import de.intevation.gnv.raster.ExternalIndexConverter; sascha@484: import de.intevation.gnv.raster.IsoAttributeGenerator; sascha@484: import de.intevation.gnv.raster.JTSMultiLineStringProducer; sascha@484: import de.intevation.gnv.raster.JTSMultiPolygonProducer; sascha@484: import de.intevation.gnv.raster.Palette; sascha@484: import de.intevation.gnv.raster.PaletteManager; sascha@484: import de.intevation.gnv.raster.Raster; sascha@484: import de.intevation.gnv.raster.Vectorizer; sascha@484: tim@459: import de.intevation.gnv.state.InputData; sascha@480: import de.intevation.gnv.state.OutputStateBase; sascha@474: tim@335: import de.intevation.gnv.state.exception.StateException; sascha@474: sascha@481: import de.intevation.gnv.utils.FileUtils; sascha@484: import de.intevation.gnv.utils.Pair; sascha@498: import de.intevation.gnv.utils.ShapeFileWriter; tim@468: import de.intevation.gnv.utils.StringUtils; tim@468: import de.intevation.gnv.utils.WKTUtils; tim@335: sascha@482: import java.awt.Dimension; sascha@482: sascha@480: import java.io.File; sascha@480: import java.io.IOException; sascha@480: import java.io.OutputStream; sascha@474: sascha@482: import java.util.ArrayList; sascha@480: import java.util.Collection; sascha@498: import java.util.Date; sascha@484: import java.util.HashMap; sascha@482: import java.util.List; sascha@484: import java.util.Map; sascha@439: sascha@480: import org.apache.log4j.Logger; sascha@480: sascha@480: import org.w3c.dom.Document; sascha@481: import org.w3c.dom.Element; sascha@480: import org.w3c.dom.Node; sascha@474: tim@335: /** sascha@474: * @author Tim Englich (tim.englich@intevation.de) sascha@474: * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) tim@335: */ tim@335: public class HorizontalCrossSectionMeshOutputState sascha@480: extends OutputStateBase sascha@474: { tim@335: private static Logger log = Logger sascha@474: .getLogger(HorizontalCrossSectionMeshOutputState.class); tim@335: tim@335: /** tim@335: * The UID of this Class tim@335: */ tim@335: private static final long serialVersionUID = 3233620652465061860L; tim@468: sascha@528: public static final boolean USE_INDEX_BUFFER = sascha@528: Boolean.getBoolean("gnv.horizontal.cross.section.mesh.index.buffer"); sascha@528: sascha@481: private String ijkQueryID; sascha@481: sascha@481: private Boolean shapeFileLock = new Boolean(true); sascha@481: sascha@481: private String shapeFilePath; tim@335: tim@335: /** tim@335: * Constructor tim@335: */ tim@335: public HorizontalCrossSectionMeshOutputState() { tim@335: } tim@335: sascha@504: public void initialize(String uuid, CallContext callContext) sascha@504: throws StateException { sascha@504: super.initialize(uuid, callContext); sascha@504: if (log.isDebugEnabled()) { sascha@504: log.debug("initialize output state " + uuid); sascha@504: } sascha@504: // fill the cache sascha@504: getResult(uuid, callContext); sascha@504: } sascha@504: sascha@481: public String getShapeFilePath() { sascha@481: synchronized (shapeFileLock) { sascha@481: return shapeFilePath; sascha@481: } sascha@481: } sascha@481: sascha@481: public void setShapeFilePath(String shapeFilePath) { sascha@481: synchronized (shapeFileLock) { sascha@481: this.shapeFilePath = shapeFilePath; sascha@481: } sascha@481: } sascha@481: sascha@481: public String resetShapeFilePath() { sascha@481: synchronized (shapeFileLock) { sascha@481: String path = shapeFilePath; sascha@481: shapeFilePath = null; sascha@481: return path; sascha@481: } sascha@481: } sascha@481: sascha@481: public void endOfLife(Object globalContext) { sascha@481: super.endOfLife(globalContext); sascha@481: sascha@481: // do it in background sascha@481: new Thread() { sascha@481: public void run() { sascha@481: // TODO: Do the un-publishing WMS stuff. sascha@481: String path = resetShapeFilePath(); sascha@481: sascha@481: if (path == null) { sascha@481: return; sascha@481: } sascha@481: sascha@481: File dir = new File(path); sascha@481: sascha@481: for (int i = 0; i < 10; ++i) { sascha@481: if (!dir.exists() || FileUtils.deleteRecursive(dir)) { sascha@481: return; sascha@481: } sascha@481: try { sascha@481: Thread.sleep(10000L); sascha@481: } sascha@481: catch (InterruptedException ie) { sascha@481: } sascha@481: } sascha@481: sascha@481: log.error("failed to remove directory '" + path + "'"); sascha@481: } // run sascha@481: }.start(); sascha@481: } sascha@481: sascha@480: public void out( sascha@480: Document format, sascha@480: Collection inputData, sascha@480: OutputStream outputStream, sascha@480: String uuid, sascha@480: CallContext callContext sascha@480: ) sascha@480: throws StateException sascha@480: { sascha@480: String outputMode = XMLUtils.xpathString( sascha@480: format, XPATH_OUTPUT_MODE, ArtifactNamespaceContext.INSTANCE); tim@335: sascha@480: String mimeType = XMLUtils.xpathString( sascha@480: format, XPATH_MIME_TYPE, ArtifactNamespaceContext.INSTANCE); sascha@480: sascha@480: if (outputMode == null || mimeType == null) { sascha@480: throw new StateException("cannot find outputMode or mime"); tim@335: } tim@335: sascha@480: outputMode = outputMode.toLowerCase(); sascha@471: sascha@504: if (log.isDebugEnabled()) { sascha@504: log.debug("---- asking for: " + outputMode); sascha@504: } tim@468: sascha@480: if ("zip".equals(outputMode)) { sascha@481: writeZip(uuid, callContext, outputStream); sascha@480: } sascha@480: else if ("wms".equals(outputMode)) { sascha@481: XMLUtils.toStream( sascha@481: getWMS(uuid, callContext), sascha@481: outputStream); sascha@480: } sascha@480: else if ("statistics".equals(outputMode)) { sascha@480: // TODO: REMOVE THIS! sascha@481: try { outputStream.write("\n".getBytes()); } sascha@481: catch (IOException ioe) {} tim@468: } sascha@480: else { sascha@480: throw new StateException("unsupported output mode"); sascha@480: } sascha@480: } sascha@480: sascha@481: protected void writeZip( sascha@481: String uuid, sascha@481: CallContext callContext, sascha@481: OutputStream output sascha@481: ) sascha@481: throws StateException sascha@481: { sascha@481: try { sascha@481: String p = getShapeFilePath(); sascha@481: if (p != null) { sascha@481: File dir = new File(p); sascha@481: if (dir.isDirectory()) { sascha@481: FileUtils.createZipArchive(dir, output); sascha@481: } sascha@481: } sascha@481: AttributedPoint2ds result = getResult(uuid, callContext); sascha@481: if (result != null sascha@481: && (p = writeToShapeFile(uuid, result, callContext)) != null) { sascha@481: FileUtils.createZipArchive(new File(p), output); sascha@481: } sascha@481: } sascha@481: catch (IOException ioe) { sascha@481: log.error(ioe.getLocalizedMessage(), ioe); sascha@481: } sascha@481: } sascha@481: sascha@481: protected Document getWMS(String uuid, CallContext callContext) sascha@481: throws StateException sascha@481: { sascha@481: // TODO: Do the real WMS publishing here! sascha@481: Document document = XMLUtils.newDocument(); sascha@481: sascha@481: Element pathElement = document.createElement("path"); sascha@481: document.appendChild(pathElement); sascha@481: sascha@481: String path = getShapeFilePath(); sascha@481: sascha@481: if (path != null && new File(path).isDirectory()) { sascha@481: pathElement.setTextContent(path); sascha@481: } sascha@481: else { sascha@481: AttributedPoint2ds result = getResult(uuid, callContext); sascha@481: if (result != null sascha@481: && (path = writeToShapeFile(uuid, result, callContext)) != null) { sascha@481: pathElement.setTextContent(path); sascha@481: } sascha@481: } sascha@481: sascha@481: return document; sascha@481: } sascha@481: sascha@481: protected String writeToShapeFile( sascha@481: String uuid, sascha@481: AttributedPoint2ds result, sascha@481: CallContext callContext sascha@481: ) { sascha@481: File baseDir = shapefileDirectory(callContext); sascha@481: sascha@481: File shapeDir = new File(baseDir, uuid); sascha@481: sascha@498: boolean success = false; sascha@498: boolean createdDir = false; sascha@481: sascha@498: try { sascha@498: synchronized (shapeFileLock) { sascha@498: int count = 0; sascha@498: while (shapeDir.exists()) { sascha@498: shapeDir = new File(baseDir, uuid + "-" + count); sascha@498: ++count; sascha@498: } sascha@498: sascha@498: if (!shapeDir.mkdirs()) { sascha@498: log.error("cannot create directory '" sascha@498: + shapeDir.getAbsolutePath() + "'"); sascha@498: return null; sascha@498: } sascha@498: createdDir = true; sascha@481: } sascha@481: sascha@498: Map polygons = result.getPolygons(); sascha@498: sascha@498: List> isolines = sascha@498: result.getLineStrings(); sascha@498: sascha@498: File polygonsFile = new File(shapeDir, "polygons.shp"); sascha@498: File isolinesFile = new File(shapeDir, "isolines.shp"); sascha@498: sascha@498: if (!ShapeFileWriter.writeMultiPolygonsToFile( sascha@498: polygonsFile, sascha@498: (Integer)result.getAttribute("parameter"), sascha@498: (Integer)result.getAttribute("layer"), sascha@498: (Date) result.getAttribute("date"), sascha@498: polygons) sascha@498: ) { sascha@498: log.error("writing polygons failed"); sascha@481: return null; sascha@481: } sascha@498: sascha@498: if (!ShapeFileWriter.writeMultiLineStringsToFile( sascha@498: isolinesFile, sascha@498: (Integer)result.getAttribute("parameter"), sascha@498: (Integer)result.getAttribute("layer"), sascha@498: (Date) result.getAttribute("date"), sascha@498: isolines) sascha@498: ) { sascha@498: log.error("writing isolines failed"); sascha@498: return null; sascha@498: } sascha@498: sascha@498: sascha@498: success = true; sascha@498: } sascha@498: finally { sascha@498: if (!success && createdDir) { sascha@498: FileUtils.deleteRecursive(shapeDir); sascha@498: sascha@498: } sascha@481: } sascha@481: sascha@498: return shapeFilePath = shapeDir.getAbsolutePath(); sascha@481: } sascha@481: sascha@481: protected AttributedPoint2ds getResult(String uuid, CallContext callContext) sascha@480: throws StateException sascha@480: { sascha@480: CacheFactory cf = CacheFactory.getInstance(); sascha@480: String key = uuid + super.getID(); sascha@480: sascha@480: if (cf.isInitialized()) { sascha@480: net.sf.ehcache.Element value = cf.getCache().get(key); sascha@480: if (value != null) { sascha@481: return (AttributedPoint2ds)value.getObjectValue(); sascha@480: } sascha@480: } sascha@480: sascha@481: AttributedPoint2ds result = produceResult(callContext); sascha@480: sascha@480: if (result != null && cf.isInitialized()) { sascha@480: cf.getCache().put(new net.sf.ehcache.Element(key, result)); sascha@480: } sascha@480: tim@468: return result; tim@468: } tim@468: sascha@481: protected AttributedPoint2ds produceResult(CallContext callContext) sascha@480: throws StateException sascha@480: { sascha@480: InputData meshPolygon = inputData.get("mesh_polygon"); sascha@480: InputData meshId = inputData.get("meshid"); sascha@480: sascha@480: if (meshPolygon == null) { sascha@480: log.error("mesh_polygon is not defined"); sascha@480: throw new StateException("missing mesh_linestring"); sascha@480: } sascha@480: sascha@480: if (meshId == null) { sascha@480: log.error("meshid is not defined"); sascha@480: throw new StateException("missing meshid"); sascha@480: } sascha@480: sascha@480: Polygon p = WKTUtils.toPolygon(meshPolygon.getValue()); sascha@480: sascha@480: if (p == null) { sascha@480: log.error("no valid polygon"); sascha@480: throw new StateException("no valid polygon"); sascha@480: } sascha@480: sascha@480: try { sascha@480: Envelope env = p.getEnvelopeInternal(); sascha@480: sascha@528: String additionWhere; sascha@480: sascha@528: if (USE_INDEX_BUFFER) { sascha@528: Coordinate [] coords = new Coordinate [] { sascha@528: new Coordinate(env.getMinX(), env.getMinY()), sascha@528: new Coordinate(env.getMinX(), env.getMaxY()), sascha@528: new Coordinate(env.getMaxX(), env.getMaxY()), sascha@528: new Coordinate(env.getMaxX(), env.getMinY()) }; sascha@528: sascha@528: additionWhere = sascha@528: WKTUtils.worldEnvelopeCoordinatesToIndex( sascha@528: coords, sascha@528: meshId.getValue(), sascha@528: ijkQueryID); sascha@528: } sascha@528: else { sascha@528: additionWhere = WKTUtils.TRUE_EXPRESSION; sascha@528: } sascha@480: sascha@480: String[] addedFilterValues = StringUtils.append( sascha@480: generateFilterValuesFromInputData(), sascha@480: additionWhere); sascha@480: sascha@480: QueryExecutor queryExecutor = QueryExecutorFactory sascha@480: .getInstance() sascha@480: .getQueryExecutor(); sascha@480: sascha@480: return process( sascha@480: env, sascha@480: p, sascha@484: callContext, sascha@484: preProcess( sascha@480: queryExecutor.executeQuery( sascha@480: queryID, sascha@484: addedFilterValues))); sascha@480: } sascha@480: catch (QueryException e) { sascha@480: log.error(e,e); sascha@480: } sascha@480: sascha@480: throw new StateException("no result produced"); tim@468: } tim@335: sascha@484: public AttributedPoint2ds preProcess(Collection results) { sascha@480: sascha@480: boolean debug = log.isDebugEnabled(); sascha@480: sascha@480: if (debug) { sascha@484: log.debug("--- preProcess: " + results.size() + " results"); sascha@480: } sascha@480: sascha@480: AttributedPoint2ds ap2ds = new AttributedPoint2ds(); sascha@480: sascha@482: ArrayList points = new ArrayList(results.size()); sascha@482: sascha@482: int sIdx = -1; sascha@482: int iIdx = -1; sascha@482: int jIdx = -1; sascha@482: int vIdx = -1; sascha@482: sascha@482: boolean firstWarn = true; sascha@480: sascha@480: for (Result result: results) { sascha@480: sascha@482: if (sIdx == -1) { sascha@480: ResultDescriptor rd = result.getResultDescriptor(); sascha@482: sIdx = rd.getColumnIndex("SHAPE"); sascha@482: iIdx = rd.getColumnIndex("IPOSITION"); sascha@482: jIdx = rd.getColumnIndex("JPOSITION"); sascha@482: vIdx = rd.getColumnIndex("YORDINATE"); sascha@498: int kIdx = rd.getColumnIndex("KPOSITION"); sascha@482: int tIdx = rd.getColumnIndex("TIMEVALUE"); sascha@482: int pIdx = rd.getColumnIndex("PARAMETERID"); sascha@482: sascha@482: if (sIdx == -1 || iIdx == -1 sascha@482: || jIdx == -1 || kIdx == -1 sascha@482: || vIdx == -1 || tIdx == -1 sascha@482: || pIdx == -1 sascha@482: ) { sascha@482: log.error("missing column in result set"); sascha@482: return null; sascha@482: } sascha@482: sascha@482: ap2ds.setAttribute("date", result.getDate(tIdx)); sascha@482: ap2ds.setAttribute("parameter", result.getInteger(pIdx)); sascha@498: ap2ds.setAttribute("layer", result.getInteger(kIdx)); sascha@480: } sascha@482: Coordinate coord = WKTUtils.toCoordinate(result.getString(sIdx)); sascha@482: if (coord == null) { sascha@482: if (firstWarn) { sascha@482: firstWarn = false; sascha@482: log.warn("cannot fetch coordinate from result"); sascha@482: } sascha@482: continue; sascha@482: } sascha@482: double v = result.getDouble(vIdx); sascha@482: int i = result.getInteger(iIdx); sascha@482: int j = result.getInteger(jIdx); sascha@482: sascha@482: Point2d p2d = new Point2d(coord.x, coord.y, v, i, j); sascha@482: points.add(p2d); sascha@482: sascha@480: } sascha@482: ap2ds.setPoints(points); sascha@481: sascha@480: return ap2ds; tim@335: } tim@335: sascha@481: public AttributedPoint2ds process( sascha@482: Envelope boundingBox, sascha@480: Polygon polygon, sascha@484: CallContext callContext, sascha@484: AttributedPoint2ds input sascha@480: ) { sascha@482: if (input == null) { sascha@482: log.error("no data to interpolate"); sascha@482: return null; sascha@482: } sascha@482: sascha@484: Integer parameterId = sascha@495: (Integer)input.getAttribute("parameter"); // XXX: hardcoded sascha@484: sascha@484: if (parameterId == null) { sascha@484: log.error("missing parameter id"); sascha@484: return null; sascha@484: } sascha@484: sascha@484: Map paletteManagers = sascha@484: getPalettes(callContext); sascha@484: sascha@484: PaletteManager paletteManager = paletteManagers.get(parameterId); sascha@484: sascha@484: if (paletteManager == null) { sascha@484: log.error("no palette found for parameter id " + parameterId); sascha@484: return null; sascha@484: } sascha@484: sascha@482: boolean debug = log.isDebugEnabled(); sascha@482: sascha@482: if (debug) { sascha@484: log.debug("interpolation"); sascha@482: } sascha@482: sascha@482: AreaInterpolation interpolation = sascha@482: new AreaInterpolation(); sascha@482: sascha@484: int numSamples = numSamples(callContext); sascha@484: int groundInterpolation = getGroundInterpolation(callContext); sascha@482: sascha@482: if (!interpolation.interpolate( sascha@484: input.getPoints(), sascha@482: boundingBox, sascha@482: new Dimension(numSamples, numSamples), sascha@482: new QueriedXYDepth(groundInterpolation) sascha@482: )) { sascha@482: log.error("interpolation failed"); sascha@482: return null; sascha@482: } sascha@482: sascha@484: // Do the post processing sascha@484: Raster raster = new Raster( sascha@484: interpolation.getRaster(), sascha@484: numSamples); sascha@484: sascha@484: // TODO: Filter operations. sascha@484: sascha@482: if (debug) { sascha@484: log.debug("to indexed raster"); sascha@482: } sascha@482: sascha@484: // scan for regions with base palette sascha@484: Palette basePalette = paletteManager.getBase(); sascha@484: sascha@484: int [] intRaster = raster.toIndexed(basePalette); sascha@484: sascha@484: // produce JFreeChart compatible polygons sascha@484: sascha@484: if (debug) { sascha@484: log.debug("vectorize indexed raster"); sascha@484: } sascha@484: sascha@484: // produce JTS compatible polygons sascha@484: sascha@484: JTSMultiPolygonProducer jtsmpp = new JTSMultiPolygonProducer( sascha@499: polygon, sascha@484: boundingBox.getMinX(), boundingBox.getMinY(), sascha@484: boundingBox.getMaxX(), boundingBox.getMaxY()); sascha@484: sascha@484: int numRegions = new Vectorizer(intRaster, numSamples) sascha@484: .process(jtsmpp); sascha@484: sascha@484: Map polygons = jtsmpp.getMultiPolygons( sascha@484: new ExternalIndexConverter(basePalette)); sascha@484: sascha@484: jtsmpp.clear(); jtsmpp = null; // help gc sascha@484: sascha@484: int numColors = polygons.size(); sascha@484: sascha@484: if (debug) { sascha@484: log.debug("number of regions: " + numRegions); sascha@484: log.debug("number of colors: " + numColors); sascha@484: } sascha@484: // generate iso lines sascha@484: sascha@484: int numIso; sascha@484: sascha@484: if (numColors < 5) { numIso = 5; } sascha@484: else if (numColors < 10) { numIso = 2; } sascha@484: else { numIso = 0; } sascha@484: sascha@484: Palette isoPalette; sascha@484: sascha@484: if (numIso == 0) { // same palette sascha@484: isoPalette = basePalette; sascha@484: /* intRaster = intRaster; */ sascha@484: } sascha@484: else { sascha@484: isoPalette = paletteManager.getLevel(numIso); sascha@484: intRaster = raster.toIndexed(isoPalette); sascha@484: } sascha@484: sascha@484: JTSMultiLineStringProducer jtslsp = new JTSMultiLineStringProducer( sascha@499: polygon, sascha@484: boundingBox.getMinX(), boundingBox.getMinY(), sascha@484: boundingBox.getMaxX(), boundingBox.getMaxY()); sascha@484: sascha@484: numRegions = new Vectorizer(false, intRaster, numSamples) sascha@484: .process(jtslsp); sascha@484: sascha@484: IsoAttributeGenerator iag = new IsoAttributeGenerator(isoPalette); sascha@484: sascha@484: List> lineStrings = sascha@484: jtslsp.getMultiLineStrings(iag); sascha@484: sascha@484: jtslsp.clear(); jtslsp = null; // help gc sascha@484: sascha@484: input.setInterpolation(interpolation); sascha@484: sascha@484: input.setPolygons(polygons); sascha@484: input.setLineStrings(lineStrings); sascha@484: sascha@484: return input; tim@335: } sascha@480: tim@468: tim@468: @Override tim@468: public void setup(Node configuration) { tim@468: super.setup(configuration); tim@468: this.ijkQueryID = Config.getStringXPath(configuration,"queryID-ijk"); tim@468: tim@468: } tim@468: tim@468: private static int numSamples(CallContext callContext) { tim@468: GNVArtifactContext context = tim@468: (GNVArtifactContext)callContext.globalContext(); tim@468: Integer samples = (Integer)context.get( tim@468: GNVArtifactContext.HORIZONTAL_CROSS_SECTION_SAMPLES_KEY); tim@468: return samples != null tim@468: ? samples.intValue() tim@468: : GNVArtifactContext.DEFAULT_HORIZONTAL_CROSS_SECTION_SAMPLES; tim@468: } tim@335: sascha@474: private static File shapefileDirectory(CallContext callContext) { sascha@474: GNVArtifactContext context = sascha@474: (GNVArtifactContext)callContext.globalContext(); sascha@474: File dir = (File)context.get( sascha@474: GNVArtifactContext.HORIZONTAL_CROSS_SECTION_RESULT_SHAPEFILE_PATH_KEY); sascha@474: return dir != null sascha@474: ? dir sascha@474: : GNVArtifactContext.DEFAULT_HORIZONTAL_CROSS_SECTION_PROFILE_SHAPEFILE_PATH; sascha@474: } sascha@474: sascha@474: private static int getGroundInterpolation(CallContext callContext) { sascha@474: GNVArtifactContext context = sascha@474: (GNVArtifactContext)callContext.globalContext(); sascha@474: sascha@474: String interpolation = (String)context.get( sascha@474: GNVArtifactContext.HORIZONTAL_CROSS_SECTION_GROUND_INTERPOLATION_KEY); sascha@474: sascha@474: return RasterObject.getInterpolationType(interpolation); sascha@474: } sascha@484: sascha@484: private static Map getPalettes( sascha@484: CallContext callContext sascha@484: ) { sascha@484: GNVArtifactContext context = sascha@484: (GNVArtifactContext)callContext.globalContext(); sascha@484: Map palettes = sascha@484: (Map)context.get( sascha@484: GNVArtifactContext.PALETTES_KEY); sascha@484: return palettes != null sascha@484: ? palettes sascha@484: : new HashMap(); sascha@484: } tim@335: } sascha@474: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :