Hallo Leute, ich will ein Programm schreiben, dass die Koordinaten aus einer WKT-Datei visuell darstellt. Die Punkte zu laden und zu zeichnen habe ich hinbekommen. Jetzt soll jedem Punkt auch ein entsprechender Text hinzugefügt werden, den ich aus einer externen CSV in eine Liste speichern wollte - dem String sollen die selben Punktkoordinaten übergeben werden. Die
Methode ist mir bekannt, doch in diesem Fall speichere die Punkte in ein Shape und füge dieses einer Area hinzu, die ich anschließend transformiere. Ich hab es auch schon mit
und
probiert und versucht den Text in ein neues Shape zu laden, um diesen nach einer weiteren Area Transformation in Einklang mit den Punkten zu bringen - bin aber kläglich gescheitert. Die WKT-Datei, darf ich leider nicht weitergeben, aber sie besteht aus ungefähr 180 Einträgen mit folgendem Muster:
So sieht es momentan aus:
Es wäre nett, wenn mir jemand sagen könnte, wie sich den Punkten noch ein String zuordnen lässt.
Vielen Dank.
Code:
drawString()
Code:
glyphVector()
Code:
TextLayout
Code:
POINT (3446249.958 5541197.806)
POINT (3446249.313 5541199.622)
POINT (3446249.237 5541201.918)
POINT (3446249.734 5541204.058)
POINT (3446251.756 5541205.777)
POINT (3446251.636 5541210.304)
etc.....
So sieht es momentan aus:
Es wäre nett, wenn mir jemand sagen könnte, wie sich den Punkten noch ein String zuordnen lässt.
Vielen Dank.
Java:
package org.hs.mainz.praktikum.XMLReader;
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.font.GlyphVector;
import java.awt.font.TextLayout;
import java.awt.image.*;
import java.util.ArrayList;
import java.util.List;
import java.awt.geom.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
public class PointPlotter2 {
PointLoader pl = new PointLoader();
public List<Point2D> points = pl.getPoints();
public static int SZ = 800;
TextField tf = new TextField();
BufferedImage image = new BufferedImage(SZ, SZ, BufferedImage.TYPE_INT_RGB);
private JComponent ui = null;
PointPlotter2() {
initUI();
}
private void drawImage() {
Graphics2D g = image.createGraphics();
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setColor(Color.WHITE);
g.fillRect(0, 0, SZ, SZ);
Area area = new Area();
Area text = new Area();
double r = 0.2;
for (Point2D point : points) {
Ellipse2D.Double e = new Ellipse2D.Double(point.getX() - r, point.getY() - r, 2 * r, 2 * r);
Font font = new Font("Helvetica", Font.PLAIN, 20);
FontRenderContext frc = g.getFontRenderContext();
AffineTransform aT2 = new AffineTransform(1.0, 0.0, 0.0, 0.0, 1.0, 0.0);
Shape layout = new TextLayout("Test", font, frc).getOutline(aT2);
g.setColor(Color.BLUE);
area.add(new Area(layout));
area.add(new Area(e));
}
Rectangle2D rect = area.getBounds2D();
double w = rect.getWidth();
double h = rect.getHeight();
double max = w > h ? w : h;
double s = SZ / max;
AffineTransform scale = AffineTransform.getScaleInstance(s, s);
double tX = -rect.getMinX();
double tY = -rect.getMinY();
AffineTransform translate = AffineTransform.getTranslateInstance(tX, tY);
AffineTransform transform = scale;
transform.concatenate(translate);
area = new Area(transform.createTransformedShape(area));
text = new Area(transform.createTransformedShape(text));
g.draw(area);
g.draw(text);
System.out.println(g.getTransform());
g.dispose();
}
public void initUI() {
if (ui != null) {
return;
}
drawImage();
ui = new JPanel(new BorderLayout(4, 4));
ui.setBorder(new EmptyBorder(4, 4, 4, 4));
ui.add(new JLabel(new ImageIcon(image)));
}
public JComponent getUI() {
return ui;
}
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception useDefault) {
}
PointPlotter2 o = new PointPlotter2();
JFrame f = new JFrame(o.getClass().getSimpleName());
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setLocationByPlatform(true);
f.setContentPane(o.getUI());
f.pack();
f.setMinimumSize(f.getSize());
f.setVisible(true);
}
};
SwingUtilities.invokeLater(r);
}
}