2017-07-24 2 views
0

Angenommen, ich möchte eine SHP-Datei laden, meine Daten darauf speichern und die Karte als Bild speichern.Zoom speichern Bildlevel in Datei

Um ein Bild zu speichern Ich verwende:

public void saveImage(final MapContent map, final String file, final int imageWidth) { 

     GTRenderer renderer = new StreamingRenderer(); 
     renderer.setMapContent(map); 

     Rectangle imageBounds = null; 
     ReferencedEnvelope mapBounds = null; 

     try { 
      mapBounds = map.getMaxBounds(); 
      double heightToWidth = mapBounds.getSpan(1)/mapBounds.getSpan(0); 
      imageBounds = new Rectangle(0, 0, imageWidth, (int) Math.round(imageWidth * heightToWidth)); 
     } catch (Exception e) { 
      // Failed to access map layers 
      throw new RuntimeException(e); 
     } 

     BufferedImage image = new BufferedImage(imageBounds.width, imageBounds.height, BufferedImage.TYPE_INT_RGB); 
     Graphics2D gr = image.createGraphics(); 
     gr.setPaint(Color.WHITE); 
     gr.fill(imageBounds); 

     try { 
      renderer.paint(gr, imageBounds, mapBounds); 
      File fileToSave = new File(file); 
      ImageIO.write(image, "png", fileToSave); 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
    } 

Aber lassen Sie uns sagen, dass ich so etwas wie dies tue:

... 
MapContent map = new MapContent(); 
map.setTitle("TEST"); 
map.addLayer(layer); 
map.addLayer(shpLayer); 

// zoom into the line 
MapViewport viewport = new MapViewport(featureCollection.getBounds()); 
map.setViewport(viewport); 

saveImage(map, "/tmp/img.png", 800); 

1) Das Problem ist, dass die Zoomstufe isn‘ t in der Bilddatei gespeichert. Gibt es eine Möglichkeit, es zu speichern?

2) Wenn ich tue MapViewport(featureCollection.getBounds()); gibt es eine Möglichkeit, ein wenig die Grenzen zu erweitern, um eine bessere visuelle Darstellung zu haben?

...

Antwort

1

Der Grund, dass Sie die Karte nicht an der aktuellen Zoomstufe Speichern ist, dass in Ihrem saveImage Methode Sie die Zeile haben:

mapBounds = map.getMaxBounds(); 

, die immer in vollem Umfang nutzt

0: von der Karte, können Sie diese

mapBounds = map.getViewport().getBounds(); 

Sie mögen ändern, um einen Begrenzungsrahmen von etwas erweitern

ReferencedEnvelope bounds = featureCollection.getBounds(); 
    double delta = bounds.getWidth()/20.0; //5% on each side 
    bounds.expandBy(delta); 
    MapViewport viewport = new MapViewport(bounds); 
    map.setViewport(viewport); 

Ein schneller (und einfacher) Weg, um eine Karte von der GUI zu sparen, ist eine Methode, wie diese zu verwenden, die genau nur sparen, was auf dem Bildschirm ist:

public void drawMapToImage(File outputFile, String outputType, 
     JMapPane mapPane) { 
    ImageOutputStream outputImageFile = null; 
    FileOutputStream fileOutputStream = null; 
    try { 
     fileOutputStream = new FileOutputStream(outputFile); 
     outputImageFile = ImageIO.createImageOutputStream(fileOutputStream); 
     RenderedImage bufferedImage = mapPane.getBaseImage(); 
     ImageIO.write(bufferedImage, outputType, outputImageFile); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } finally { 
     try { 
      if (outputImageFile != null) { 
       outputImageFile.flush(); 
       outputImageFile.close(); 
       fileOutputStream.flush(); 
       fileOutputStream.close(); 
      } 
     } catch (IOException e) {// don't care now 
     } 
    } 
} 
+0

Nizza, dank Was auch immer Wert Ich habe versucht, zu dividieren mit ('double delta = bounds.getWidth()/20.0'), hatte keinen Effekt.So, ich benutze einfach' delta delta = bounds.getWidth() 'und es funktioniert gut (es zoomt aus). Auch, wie soll ich 'JMapPane' in meinem Fall verwenden? Weil ich' MapContent' verwende.Danke! (Upv) – George

+0

Prüfe im Debugger, was der Wert von getwidth ist? Division durch 20 sollte 5% ergeben, was vielleicht zu klein ist, um aufzutauchen. –

+0

Wenn Sie einen JMapFrame haben, können Sie den mapPane daraus erhalten, wenn nicht, machen Sie sich keine Sorgen. –