Revision: 5999 http://sourceforge.net/p/jump-pilot/code/5999 Author: ma15569 Date: 2018-11-30 14:07:27 +0000 (Fri, 30 Nov 2018) Log Message: ----------- Added methods to save/load symbology.
Modified Paths: -------------- core/trunk/src/org/openjump/core/apitools/IOTools.java Modified: core/trunk/src/org/openjump/core/apitools/IOTools.java =================================================================== --- core/trunk/src/org/openjump/core/apitools/IOTools.java 2018-11-30 14:02:52 UTC (rev 5998) +++ core/trunk/src/org/openjump/core/apitools/IOTools.java 2018-11-30 14:07:27 UTC (rev 5999) @@ -14,25 +14,59 @@ package org.openjump.core.apitools; +import static com.vividsolutions.jump.workbench.ui.plugin.PersistentBlackboardPlugIn.get; +import static javax.xml.parsers.DocumentBuilderFactory.newInstance; + import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; import java.io.OutputStreamWriter; +import java.io.StringReader; +import java.io.StringWriter; +import java.nio.channels.FileChannel; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.Iterator; +import java.util.LinkedHashSet; import java.util.List; import java.util.Vector; +import java.util.regex.Pattern; +import javax.swing.JFileChooser; +import javax.swing.JOptionPane; import javax.swing.JTable; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; import org.apache.commons.lang3.StringUtils; import org.geotools.dbffile.DbfFieldDef; import org.geotools.dbffile.DbfFile; import org.geotools.dbffile.DbfFileWriter; +import org.openjump.core.ccordsys.srid.SRIDStyle; +import org.openjump.core.ui.plugin.file.open.JFCWithEnterAction; +import org.openjump.core.ui.plugin.style.ImportSLDPlugIn; import org.openjump.core.ui.util.ScreenScale; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jump.I18N; @@ -50,10 +84,18 @@ import com.vividsolutions.jump.io.WKTReader; import com.vividsolutions.jump.io.datasource.DataSource; import com.vividsolutions.jump.io.datasource.DataSourceQuery; +import com.vividsolutions.jump.util.Blackboard; import com.vividsolutions.jump.util.java2xml.Java2XML; +import com.vividsolutions.jump.util.java2xml.XML2Java; import com.vividsolutions.jump.workbench.JUMPWorkbench; +import com.vividsolutions.jump.workbench.Logger; import com.vividsolutions.jump.workbench.model.Layer; import com.vividsolutions.jump.workbench.model.LayerManager; +import com.vividsolutions.jump.workbench.plugin.PlugInContext; +import com.vividsolutions.jump.workbench.ui.GUIUtil; +import com.vividsolutions.jump.workbench.ui.MultiInputDialog; +import com.vividsolutions.jump.workbench.ui.WorkbenchFrame; +import com.vividsolutions.jump.workbench.ui.renderer.style.Style; import de.latlon.deejump.plugin.style.LayerStyle2SLDPlugIn; @@ -507,4 +549,634 @@ } } + /** + * Method to save Openjump symbology of a layer to a XML file + * + * + * @param style + * file to save (ex. file.style.xml) + * @param layer + * source layer + * @throws Exception + */ + + public static void saveSimbology_Jump(File file, Layer layer) + throws Exception { + final StringWriter stringWriter = new StringWriter(); + try { + + new Java2XML().write(layer, "layer", stringWriter); + } finally { + stringWriter.flush(); + } + + final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory + .newInstance(); + final DocumentBuilder documentBuilder = documentBuilderFactory + .newDocumentBuilder(); + final InputSource is = new InputSource(new StringReader( + stringWriter.toString())); + final Document document = documentBuilder.parse(is); + // Remove all other elements than <Styles> from XML + removeElements(document); + + document.normalize(); + //Write the style.xml file + final DOMSource source = new DOMSource(document); + final FileWriter writer = new FileWriter(new File( + file.getAbsolutePath())); + final StreamResult result = new StreamResult(writer); + final TransformerFactory transformerFactory = TransformerFactory + .newInstance(); + final Transformer transformer = transformerFactory.newTransformer(); + transformer.transform(source, result); + + //define the folder for possible pictures used as vertex symbols + final Pattern ext = Pattern.compile("(?<=.)\\.[^.]+$"); + final String folder = ext.matcher(file.getAbsolutePath()) + .replaceAll(""); + + //Create a list of pictures + final List<String> listPictures = getListOfElements(document); + + if (!listPictures.isEmpty()) { + new File(folder).mkdir(); + //copy pictures into the folder + for (final String str : listPictures) { + final File inputFile = new File( + convertPathToSystemIndependentPath(str)); + copyFileToFolder(inputFile, new File(folder).getAbsolutePath()); + } + + //save a list of original paths of the pictures as txt file + try { + final OutputStreamWriter wrt = new OutputStreamWriter( + new FileOutputStream(new File(folder).getAbsolutePath() + .concat(File.separator).concat("picture.txt")), + StandardCharsets.UTF_8); + String listString = ""; + for (final String s : listPictures) { + listString += s + System.getProperty("line.separator"); + } + wrt.write(listString); + wrt.close(); + + } catch (final IOException i) { + } + } + } + + /** + * Simple method to copy a file to a folder + * @param inputFile + * @param outputDir + * @throws IOException + */ + public static void copyFileToFolder(File inputFile, String outputDir) + throws IOException { + final File directoryFile = new File(outputDir); + if (directoryFile.canRead()) { + final File outFile = new File(outputDir.concat(File.separator) + .concat(inputFile.getName())); + FileChannel inputChannel = null; + FileChannel outputChannel = null; + try { + inputChannel = new FileInputStream(inputFile).getChannel(); + outputChannel = new FileOutputStream(outFile).getChannel(); + outputChannel + .transferFrom(inputChannel, 0, inputChannel.size()); + } finally { + inputChannel.close(); + outputChannel.close(); + } + } + } + + /** + * Converts a system-dependent path into an independent one + * + * @param oldPath + * @return newPath + */ + public static String convertPathToSystemIndependentPath(String oldPath) { + final String path = Paths.get(oldPath).toUri().getPath(); + return path; + + } + + /** + * filter all elements to remove all tags except symbology ones + * used by Save To JUMP Symbology method + */ + private static void removeElements(Node parent) { + final NodeList children = parent.getChildNodes(); + for (int i = 0; i < children.getLength(); i++) { + final Node child = children.item(i); + if (child.getNodeType() == Node.ELEMENT_NODE) { + if (child.getNodeName().equals("description") + || child.getNodeName().equals("data-source-query") + || child.getNodeName().equals( + "feature-schema-operation")) { + + parent.removeChild(child); + while (child.hasChildNodes()) { + child.removeChild(child.getFirstChild()); + } + + } else { + removeElements(child); + } + final Element eElement = (Element) child; + if (eElement.getAttribute("class").contains( + "org.openjump.core.ccordsys.srid.SRIDStyle")) { + + parent.removeChild(child); + while (child.hasChildNodes()) { + child.removeChild(child.getFirstChild()); + } + } + } + } + + } + + /** + * get a list of urls of pictures used as vertex symbols + * search into <style> and <vertex-style> elements + * used by Save To JUMP Symbology method + * @param parent + * @return List + */ + private static List<String> getListOfElements(Node parent) { + final NodeList children = ((Document) parent).getDocumentElement() + .getElementsByTagName("style"); + final LinkedHashSet<String> uniqueStrings = new LinkedHashSet<String>(); + for (int i = 0; i < children.getLength(); i++) { + final Node child = children.item(i); + if (child.getNodeType() == Node.ELEMENT_NODE) { + final Element eElement = (Element) child; + if (!eElement.getAttribute("imageURL").isEmpty()) { + final String url = eElement.getAttribute("imageURL"); + uniqueStrings.add(url); + } + } + } + final NodeList children1 = ((Document) parent).getDocumentElement() + .getElementsByTagName("vertex-style"); + for (int i = 0; i < children1.getLength(); i++) { + final Node child = children1.item(i); + if (child.getNodeType() == Node.ELEMENT_NODE) { + final Element eElement = (Element) child; + if (!eElement.getAttribute("imageURL").isEmpty()) { + final String url = eElement.getAttribute("imageURL"); + uniqueStrings.add(url); + } + } + } + final List<String> asList = new ArrayList<String>(uniqueStrings); + return asList; + } + + /** + * check if in the XML file there are nodes with attributes as "imageURL" + * used by Load JUMP Symbology method + * @param file + * @return + * @throws ParserConfigurationException + * @throws SAXException + * @throws IOException + * @throws TransformerException + */ + + private static boolean imageURLExist(File file) + throws ParserConfigurationException, SAXException, IOException, + TransformerException { + + final DocumentBuilderFactory dbFactory = DocumentBuilderFactory + .newInstance(); + final DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); + final Document doc = dBuilder.parse(file); + final LinkedHashSet<String> uniqueStrings = new LinkedHashSet<String>(); + final NodeList children = doc.getDocumentElement() + .getElementsByTagName("style"); + final NodeList children1 = doc.getDocumentElement() + .getElementsByTagName("vertex-style"); + for (int i = 0; i < children.getLength(); i++) { + final Node child = children.item(i); + if (child.getNodeType() == Node.ELEMENT_NODE) { + final Element eElement = (Element) child; + if (!eElement.getAttribute("imageURL").isEmpty()) { + final String url = eElement.getAttribute("imageURL"); + + uniqueStrings.add(url); + + } + } + } + + for (int i = 0; i < children1.getLength(); i++) { + final Node child = children1.item(i); + if (child.getNodeType() == Node.ELEMENT_NODE) { + final Element eElement = (Element) child; + if (!eElement.getAttribute("imageURL").isEmpty()) { + final String url = eElement.getAttribute("imageURL"); + + uniqueStrings.add(url); + + } + } + } + if (uniqueStrings.isEmpty()) { + return false; + } else { + return true; + } + } + + /** + + * This method will recompile the XML file according to location (folder) of the image symbology files + * used by Load JUMP Symbology method + * @param xml. + * XML file + * @param directory. + * Folder where the images are stored + * @return File + * @throws ParserConfigurationException + * @throws SAXException + * @throws IOException + * @throws TransformerException + */ + public static File recompileXMLFile(File file, String directory) + throws ParserConfigurationException, SAXException, IOException, + TransformerException { + final DocumentBuilderFactory dbFactory = DocumentBuilderFactory + .newInstance(); + final DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); + final Document doc = dBuilder.parse(file); + final NodeList children = doc.getDocumentElement() + .getElementsByTagName("style"); + for (int i = 0; i < children.getLength(); i++) { + final Node child = children.item(i); + if (child.getNodeType() == Node.ELEMENT_NODE) { + final Element eElement = (Element) child; + if (!eElement.getAttribute("imageURL").isEmpty()) { + final String url = convertPathToSystemIndependentPath(eElement + .getAttribute("imageURL")); + final String name = new File(url).getName(); + final String newNamePath = directory.concat(File.separator) + .concat(name); + eElement.setAttribute("imageURL", newNamePath); + } + } + } + final NodeList children1 = doc.getDocumentElement() + .getElementsByTagName("vertex-style"); + for (int i = 0; i < children1.getLength(); i++) { + final Node child = children1.item(i); + if (child.getNodeType() == Node.ELEMENT_NODE) { + final Element eElement = (Element) child; + if (!eElement.getAttribute("imageURL").isEmpty()) { + final String url = convertPathToSystemIndependentPath(eElement + .getAttribute("imageURL")); + final String name = new File(url).getName(); + final String newNamePath = directory.concat(File.separator) + .concat(name); + eElement.setAttribute("imageURL", newNamePath); + } + } + } + final Transformer transformer = TransformerFactory.newInstance() + .newTransformer(); + final DOMSource input = new DOMSource(doc); + final File outFile = new File(file.getAbsolutePath()); + final StreamResult output = new StreamResult(outFile); + transformer.transform(input, output); + return outFile; + } + + /** + * Method to load an OpenJUMP symbology file (xml jump) into a layer + * + * @param style + * file to load (ex. file.style.xml) + * @param layer + * target layer + * @throws Exception + */ + public static void loadSimbology_Jump(File file, Layer layer) + throws Exception { + final WorkbenchFrame workbenchFrame = JUMPWorkbench.getInstance() + .getFrame(); + File recompiled = null; + //Check if the xml file contains urls for vertex bitmaps. + //if not, there is no need to recompile the file + if (!imageURLExist(file)) { + recompiled = file; + } else { + final Pattern ext = Pattern.compile("(?<=.)\\.[^.]+$"); + final String folder = ext.matcher(file.getAbsolutePath()) + .replaceAll(""); + final File fold = new File(folder); + //If the folder, with the same name of the xml file, containing vertex bitmaps, exist + //It is automatically loaded to recompile XML file + if (fold.exists() && fold.isDirectory()) { + recompiled = recompileXMLFile(file, fold.getAbsolutePath()); + } else { + // If the folder is not automatically found + // a filechooser is open to select that dolder + final JFCWithEnterAction chooser = new JFCWithEnterAction(); + chooser.setCurrentDirectory(new java.io.File(".")); + chooser.setDialogTitle("Select folder where vertex images are located"); + chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + + chooser.setAcceptAllFileFilterUsed(false); + if (chooser.showOpenDialog(JUMPWorkbench.getInstance() + .getFrame()) == JFileChooser.APPROVE_OPTION) { + recompiled = recompileXMLFile(file, chooser + .getSelectedFile().getAbsolutePath()); + } else { + //Last choice, load any possible symbology from XML file and + //warning to user that some symbols could be not loaded + recompiled = file; + + workbenchFrame.getContext().getLayerViewPanel() + .getContext() + .warnUser("Some styles could not be loaded"); + } + } + } + final FileReader reader = new FileReader(recompiled); + + try { + final Layer sourceLayer = (Layer) new XML2Java(workbenchFrame + .getContext().getWorkbench().getPlugInManager() + .getClassLoader()).read(reader, Layer.class); + final Collection<Style> styleColection = sourceLayer.getStyles(); + final ArrayList<Style> names = new ArrayList<Style>(); + for (final Style style2 : styleColection) { + names.add(style2); + if (style2 instanceof SRIDStyle) { + names.remove(style2); + } + } + try { + layer.setStyles(names); + } catch (final Exception e) { + Logger.error(e); + final String errorMessage = "Error on loading symbols. Try to do it manually"; //$NON-NLS-1$ + JOptionPane.showMessageDialog( + workbenchFrame.getActiveInternalFrame(), errorMessage, + "Error", JOptionPane.ERROR_MESSAGE); + } + } finally { + reader.close(); + } + } + + /** + * Method to load a style file ( SLD - Spatial layer descriptor) into a + * layer + * + * @param style + * file to load (ex. file.sld) + * @param layer + * target layer + * @throws Exception + */ + + public static void loadSimbology_SLD(File file, PlugInContext context) + throws SAXException, IOException, ParserConfigurationException { + final Blackboard bb = get(JUMPWorkbench.getInstance().getFrame() + .getContext()); + bb.put("ImportSLDPlugin.filename", file.getAbsoluteFile().toString()); + final DocumentBuilderFactory dbf = newInstance(); + dbf.setNamespaceAware(true); + + final Document doc = dbf.newDocumentBuilder().parse(file); + try { + ImportSLDPlugIn.importSLD(doc, context); + } catch (final Exception e) { + Logger.error(e); + } + + } + + /** + * Method to save the style of a layer as SLD (Spatial layer + * descriptor) file + * + * @param style + * file to save (ex. file.style.sld) + * @param layer + * source layer + * @throws Exception + */ + public static void saveSimbology_SLD(File file, Layer layer) + throws Exception { + + final double internalScale = 1d / JUMPWorkbench.getInstance() + .getFrame().getContext().getLayerViewPanel().getViewport() + .getScale(); + final double realScale = ScreenScale + .getHorizontalMapScale(JUMPWorkbench.getInstance().getFrame() + .getContext().getLayerViewPanel().getViewport()); + final double scaleFactor = internalScale / realScale; + + final File inputXML = File.createTempFile("temptask", ".xml"); + inputXML.deleteOnExit(); + final String name = layer.getName(); + // TODO don't assume has 1 item!!! + // Should create this condition in EnableCheckFactory + if (layer.getFeatureCollectionWrapper().getFeatures().size() == 0) { + throw new Exception( + I18N.get("org.openjump.core.ui.plugin.tools.statistics.StatisticOverViewPlugIn.Selected-layer-is-empty")); + } + final BasicFeature bf = (BasicFeature) layer + .getFeatureCollectionWrapper().getFeatures().get(0); + final Geometry geo = bf.getGeometry(); + final String geoType = geo.getGeometryType(); + final Java2XML java2Xml = new Java2XML(); + java2Xml.write(layer, "layer", inputXML); + final FileInputStream input = new FileInputStream(inputXML); + // FileWriter fw = new FileWriter( outputXML ); + final OutputStreamWriter fw = new OutputStreamWriter( + new FileOutputStream(file), Charset.defaultCharset()); + // "UTF-8"); + final HashMap<String, String> map = new HashMap<String, String>(9); + map.put("wmsLayerName", name); + map.put("featureTypeStyle", name); + map.put("styleName", name); + map.put("styleTitle", name); + map.put("geoType", geoType); + map.put("geomProperty", I18N + .get("deejump.pluging.style.LayerStyle2SLDPlugIn.geomProperty")); + map.put("Namespace", "http://www.deegree.org/app"); + // map.put("NamespacePrefix", prefix + ":"); + // map.put("NamespacePrefixWithoutColon", prefix); + // ATTENTION : note that min and max are swapped in JUMP!!! + // It will swap later, in transformContext + Double d = layer.getMinScale(); + d = d != null ? d : new Double(0); + map.put("minScale", + "" + + LayerStyle2SLDPlugIn.toRealWorldScale(scaleFactor, + d.doubleValue())); + // using Double.MAX_VALUE is creating a large number - too many 0's + // make it simple and hardcode a large number + final double largeNumber = 99999999999d; + d = layer.getMaxScale(); + d = d != null ? d : new Double(largeNumber); + map.put("maxScale", + "" + + LayerStyle2SLDPlugIn.toRealWorldScale(scaleFactor, + d.doubleValue())); + fw.write(LayerStyle2SLDPlugIn.transformContext(input, map)); + fw.close(); + } + + public static void saveSimbology_SLD2(File file, Layer layer) + throws Exception { + final String name = layer.getName(); + final BasicFeature bf = (BasicFeature) layer + .getFeatureCollectionWrapper().getFeatures().get(0); + final Geometry geo = bf.getGeometry(); + final String geoType = geo.getGeometryType(); + final MultiInputDialog dialog = new MultiInputDialog( + JUMPWorkbench.getInstance().getFrame(), + I18N.get("deejump.pluging.style.LayerStyle2SLDPlugIn.SLD-Parameters"), + true); + String geomProperty = "GEOM"; + + final FeatureSchema schema = layer.getFeatureCollectionWrapper() + .getFeatureSchema(); + for (int i = 0; i < schema.getAttributeCount(); ++i) { + if (schema.getAttributeType(i) == AttributeType.GEOMETRY) { + geomProperty = schema.getAttributeName(i); + } + } + dialog.addSeparator(); + + dialog.addTextField( + I18N.get("deejump.pluging.style.LayerStyle2SLDPlugIn.geomProperty"), + geomProperty, + 25, + null, + I18N.get("deejump.pluging.style.LayerStyle2SLDPlugIn.Input-the-name-of-the-geometry-property")); + + dialog.addSeparator(); + + dialog.addTextField( + I18N.get("deejump.pluging.style.LayerStyle2SLDPlugIn.WMS-Layer-name"), + name, + 25, + null, + I18N.get("deejump.pluging.style.LayerStyle2SLDPlugIn.WMS-Layer-name")); + dialog.addTextField( + I18N.get("deejump.pluging.style.LayerStyle2SLDPlugIn.Style-name"), + name, + 25, + null, + I18N.get("deejump.pluging.style.LayerStyle2SLDPlugIn.Style-name")); + dialog.addTextField( + I18N.get("deejump.pluging.style.LayerStyle2SLDPlugIn.Style-title"), + name, + 25, + null, + I18N.get("deejump.pluging.style.LayerStyle2SLDPlugIn.Style-title")); + dialog.addTextField( + I18N.get("deejump.pluging.style.LayerStyle2SLDPlugIn.Feature-Type-Style"), + name, + 25, + null, + I18N.get("deejump.pluging.style.LayerStyle2SLDPlugIn.Feature-Type-Style")); + dialog.addTextField( + I18N.get("deejump.pluging.style.LayerStyle2SLDPlugIn.Namespace"), + "http://www.deegree.org/app", + 25, + null, + I18N.get("deejump.pluging.style.LayerStyle2SLDPlugIn.Namespace")); + GUIUtil.centreOnWindow(dialog); + + dialog.setVisible(true); + + if (!dialog.wasOKPressed()) { + return; + } + + // why the field name given when constructing the dialog are used both + // for the label and + // for the key is beyond me + final String wmsLayerName = dialog + .getText(I18N + .get("deejump.pluging.style.LayerStyle2SLDPlugIn.WMS-Layer-name")); + final String styleName = dialog.getText(I18N + .get("deejump.pluging.style.LayerStyle2SLDPlugIn.Style-name")); + final String styleTitle = dialog.getText(I18N + .get("deejump.pluging.style.LayerStyle2SLDPlugIn.Style-title")); + final String featureTypeStyle = dialog + .getText(I18N + .get("deejump.pluging.style.LayerStyle2SLDPlugIn.Feature-Type-Style")); + geomProperty = dialog + .getText(I18N + .get("deejump.pluging.style.LayerStyle2SLDPlugIn.geomProperty")); + final String namespace = dialog.getText(I18N + .get("deejump.pluging.style.LayerStyle2SLDPlugIn.Namespace")); + + final double internalScale = 1d / JUMPWorkbench.getInstance() + .getFrame().getContext().getLayerViewPanel().getViewport() + .getScale(); + final double realScale = ScreenScale + .getHorizontalMapScale(JUMPWorkbench.getInstance().getFrame() + .getContext().getLayerViewPanel().getViewport()); + final double scaleFactor = internalScale / realScale; + + final File inputXML = File.createTempFile("temptask", ".xml"); + inputXML.deleteOnExit(); + + // TODO don't assume has 1 item!!! + // Should create this condition in EnableCheckFactory + if (layer.getFeatureCollectionWrapper().getFeatures().size() == 0) { + throw new Exception( + I18N.get("org.openjump.core.ui.plugin.tools.statistics.StatisticOverViewPlugIn.Selected-layer-is-empty")); + } + + final Java2XML java2Xml = new Java2XML(); + java2Xml.write(layer, "layer", inputXML); + final FileInputStream input = new FileInputStream(inputXML); + // FileWriter fw = new FileWriter( outputXML ); + final OutputStreamWriter fw = new OutputStreamWriter( + new FileOutputStream(file), "UTF-8");// Charset.defaultCharset()); + // "UTF-8"); + final HashMap<String, String> map = new HashMap<String, String>(9); + map.put("wmsLayerName", wmsLayerName); + map.put("featureTypeStyle", featureTypeStyle); + map.put("styleName", styleName); + map.put("styleTitle", styleTitle); + map.put("geoType", geoType); + map.put("geomProperty", geomProperty); + map.put("Namespace", namespace); + // map.put("NamespacePrefix", prefix + ":"); + // map.put("NamespacePrefixWithoutColon", prefix); + // ATTENTION : note that min and max are swapped in JUMP!!! + // It will swap later, in transformContext + Double d = layer.getMinScale(); + d = d != null ? d : new Double(0); + map.put("minScale", + "" + + LayerStyle2SLDPlugIn.toRealWorldScale(scaleFactor, + d.doubleValue())); + // using Double.MAX_VALUE is creating a large number - too many 0's + // make it simple and hardcode a large number + final double largeNumber = 99999999999d; + d = layer.getMaxScale(); + d = d != null ? d : new Double(largeNumber); + map.put("maxScale", + "" + + LayerStyle2SLDPlugIn.toRealWorldScale(scaleFactor, + d.doubleValue())); + fw.write(LayerStyle2SLDPlugIn.transformContext(input, map)); + fw.close(); + } + } _______________________________________________ Jump-pilot-devel mailing list Jump-pilot-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel