Exporting Shapefile to SVG using Java & GeoTools?

المشرف العام

Administrator
طاقم الإدارة
I am currently working on how to read in ESRI shapefiles, parse/edit layers and then export out to SVG (Scalable Vector Graphic) file type. I have been using GeoTools primarily for reading/loading shapefiles. I am also displaying them using an JMapFrame GUI.

My issue currently is how to export a shapefile, after reading it in, to an SVG file. There is a great example by OpenJUMP which does exactly as I need, however, while looking at the code used to implement this feature, I am unable to figure out how to do it myself. I want to avoid using OpenJUMP's program as export to SVG using java code (so I can do other things before exporting).

Here is some of my code reading in shapefiles:

MapContent map;private JMapFrame jframe;// Load Shapefile into JMapFrameprotected void loadFile(URL shape) throws IOException { FileDataStore store = FileDataStoreFinder.getDataStore(shape); SimpleFeatureSource featureSource = store.getFeatureSource(); Style style = SLD.createSimpleStyle( featureSource.getSchema() ); FeatureLayer layer = new FeatureLayer(featureSource, style); ShapefileDataStore ds = new ShapefileDataStore(shape); FeatureSource fs = ds.getFeatureSource(); map = new MapContent(); map.addLayer(layer); jframe.setMapContent(map);}// Constructor, create/display JMapFrame GUIpublic ShapefileExporter() { jframe = new JMapFrame(); jframe.setSize(1000, 800); jframe.enableStatusBar(true); jframe.enableToolBar(true); jframe.enableLayerTable(true); JMenuBar menuBar = new JMenuBar(); jframe.setJMenuBar(menuBar); JMenu menu = new JMenu("File"); menuBar.add(menu); menu.add(new SafeAction("Load file") { @Override public void action(ActionEvent e) throws Throwable { setJFCFilter("Shapefiles", "shp"); int returnVal = jfc.showOpenDialog(jframe); if (returnVal == JFileChooser.APPROVE_OPTION) { String pathname = jfc.getSelectedFile().getAbsolutePath(); URL shape = acquireURL(pathname); if (shape == null) { JOptionPane.showMessageDialog(jframe, "could not find file \"" +pathname+ "\"","Could not find file", JOptionPane.ERROR_MESSAGE); } try { loadFile(shape); } catch (IOException ex) { System.err.println("File exception for file: " + shape); } } } }); menu.add(new SafeAction("Export Shapefile") { @Override public void action(ActionEvent e) throws Throwable { setJFCFilter("Scaleable Vector Graphics", "svg"); int returnVal = jfc.showSaveDialog(jframe); if (returnVal == JFileChooser.APPROVE_OPTION) { String pathname = jfc.getSelectedFile().getAbsolutePath(); URL svg = acquireURL(pathname); if (svg == null) { JOptionPane.showMessageDialog(jframe, "could not find file \"" +pathname+ "\"","Could not find file", JOptionPane.ERROR_MESSAGE); } try { if (svg != null) exportSHP.exportToSVG(new File(svg.getPath()), null); } catch (Exception ex) { System.err.println("File exception for file: " + svg); } } } }); jframe.setVisible(true);}OpenJump Code:

public void exportToSVG(File shp_file, PlugInContext context) throws Exception { File svgFile = ShapefileExporter.changeFileExt(shp_file, ".svg"); // Get a DOMImplementation DOMImplementation domImpl = GenericDOMImplementation.getDOMImplementation(); // Create an instance of org.w3c.dom.Document Document doc = domImpl.createDocument(null, "svg", null); // Create an instance of the SVG Generator SVGGraphics2D svgGen = new SVGGraphics2D(doc); Viewport viewport = context.getLayerViewPanel().getViewport(); LayerViewPanel lvp = context.getLayerViewPanel(); RenderingManager rms = lvp.getRenderingManager(); List layers = context.getLayerManager().getVisibleLayers(false); // Check if there are many features to draw and warn the user Envelope view = context.getLayerViewPanel().getViewport().getEnvelopeInModelCoordinates(); int totalNumberOfFeatures = 0; for (int i = 0; i < layers.size(); i++) { FeatureCollection fc = ((Layer) layers.get(i)).getFeatureCollectionWrapper(); totalNumberOfFeatures += fc.query(view).size(); } if (totalNumberOfFeatures > 100000) { JTextArea labelArea = new JTextArea(); labelArea.setEditable(true); labelArea.setOpaque(false); labelArea.setFont(new JLabel().getFont()); labelArea.setText(I18N .get("org.openjump.core.ui.plugin.file.SaveImageAsSVGPlugIn.large-dataset-message")); OKCancelDialog dialog = new OKCancelDialog( context.getWorkbenchFrame(), I18N.get("org.openjump.core.ui.plugin.file.SaveImageAsSVGPlugIn.warning-message-title"), true, labelArea, null); dialog.setVisible(true); if (!dialog.wasOKPressed()) return; for (int i = 0; i < layers.size(); i++) { Layer layer = (Layer) layers.get(i); Renderer render = rms.getRenderer(layer); if (render instanceof LayerRenderer) { LayerRenderer myRnew = (LayerRenderer)render; myRnew.setMaxFeatures(10000000); } } lvp.repaint(); // Change drawing resolution to print to svg (0.5 pixel to 0.1 pixel) Java2DConverter oldConverter = lvp.getViewport().getJava2DConverter(); lvp.getViewport().setJava2DConverter(new Java2DConverter(lvp.getViewport(), 0.001)); double scale = ScreenScale.getHorizontalMapScale(lvp.getViewport()); int resolution = ScreenScale.getResolution(); ScreenScale.setResolution(90); ZoomToScalePlugIn zoomToScalePlugin = new ZoomToScalePlugIn(); zoomToScalePlugin.setScale(scale); zoomToScalePlugin.zoomToNewScale(context); lvp.paintComponent(svgGen); // Restore previous rendering resolution lvp.getViewport().setJava2DConverter(oldConverter); ScreenScale.setResolution(resolution); zoomToScalePlugin.setScale(scale); zoomToScalePlugin.zoomToNewScale(context); // Reset the old state of 100 features for (int i = 0; i < layers.size(); i++) { Layer layer = (Layer)layers.get(i); Renderer render = rms.getRenderer(layer); if (render instanceof LayerRenderer) { LayerRenderer myRnew = (LayerRenderer)render; myRnew.setMaxFeatures(100); } } // Stream out SVG to the file try { FileOutputStream fos = new FileOutputStream(svgFile, false); OutputStreamWriter out = new OutputStreamWriter(fos, "UTF-8"); svgGen.stream(out, true); out.close(); } catch (Exception ex) { context.getWorkbenchFrame().handleThrowable(ex); } }}Example of JMapFrame display:



The problem with OpenJUMP's export code is they use information from other plugins (using the PluginContext variable) in order to generate their SVG.

Is there a specific library, or is it possible with GeoTools to export SVG using shapefile read with GeoTools?



أكثر...
 
أعلى