2013-11-27 3 views
2

Я работаю с OpenStreetMap на Java с помощью JMapViewer. Я могу рисовать полигон и прямоугольник с помощью JMapViewer, но как рисовать полилинию?Рисовать полилинию в JMapViewer

спасибо.

+1

Вы можете быть в состоянии использовать подход, продемонстрированный [здесь] (http://stackoverflow.com/q/10744798/230513). – trashgod

ответ

3

Вы можете создать собственную реализацию полилинии. Ниже приведен пример, основанный на существующих MapPolygonImpl. Это хаки, но, похоже, нет способа в JMapViewer добавить строки.

enter image description here

import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.geom.Path2D; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 
import org.openstreetmap.gui.jmapviewer.Coordinate; 
import org.openstreetmap.gui.jmapviewer.JMapViewer; 
import org.openstreetmap.gui.jmapviewer.MapPolygonImpl; 
import org.openstreetmap.gui.jmapviewer.interfaces.ICoordinate; 

public class TestMap { 

    public static class MapPolyLine extends MapPolygonImpl { 
     public MapPolyLine(List<? extends ICoordinate> points) { 
      super(null, null, points); 
     } 

     @Override 
     public void paint(Graphics g, List<Point> points) { 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.setColor(getColor()); 
      g2d.setStroke(getStroke()); 
      Path2D path = buildPath(points); 
      g2d.draw(path); 
      g2d.dispose(); 
     } 

     private Path2D buildPath(List<Point> points) { 
      Path2D path = new Path2D.Double(); 
      if (points != null && points.size() > 0) { 
       Point firstPoint = points.get(0); 
       path.moveTo(firstPoint.getX(), firstPoint.getY()); 
       for (Point p : points) { 
        path.lineTo(p.getX(), p.getY());  
       } 
      } 
      return path; 
     } 
    } 

    private static void createAndShowUI() { 
     JFrame frame = new JFrame("Demo"); 
     JMapViewer viewer = new JMapViewer(); 

     List<Coordinate> coordinates = new ArrayList<Coordinate>(); 
     coordinates.add(new Coordinate(50, 10)); 
     coordinates.add(new Coordinate(52, 15)); 
     coordinates.add(new Coordinate(55, 15)); 

     MapPolyLine polyLine = new MapPolyLine(coordinates); 
     viewer.addMapPolygon(polyLine); 

     frame.add(viewer); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationByPlatform(true); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 
1

AFAIK JMapViewer расширяет JPanel.

Поэтому вы просто переопределяете paintComponent и используете данный объект Graphics.

class MyMap extends JMapViewer { 
    @Override 
    protected void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     g.setColor(Color.RED); 
     g.drawPolyline(...); 
    } 
}