Changeset 1425 in josm


Ignore:
Timestamp:
Feb 17, 2009 7:17:26 PM (4 years ago)
Author:
stoecker
Message:

fixed #1642. patch by xeen

Location:
trunk/src/org/openstreetmap/josm
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/gpx/WayPoint.java

    r1185 r1425  
    1818    public final EastNorth eastNorth; 
    1919    public double time; 
    20     public Color speedLineColor; 
     20    public Color customColoring; 
    2121    public boolean drawLine; 
    2222    public int dir; 
  • trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java

    r1283 r1425  
    8686    private int computeCacheMaxLineLengthUsed; 
    8787    private Color computeCacheColorUsed; 
    88     private boolean computeCacheColored; 
     88    private colorModes computeCacheColored; 
    8989    private int computeCacheColorTracksTune; 
    9090 
     
    369369        {-ll0,-sl9,-ll0,+sl9} 
    370370    }; 
    371  
     371     
     372    // the different color modes 
     373    enum colorModes { none, velocity, dilution } 
     374     
    372375    @Override public void paint(Graphics g, MapView mv) { 
    373376 
     
    377380        // Long startTime = System.currentTimeMillis(); 
    378381        Color neutralColor = getColor(name); 
    379         boolean forceLines = Main.pref.getBoolean("draw.rawgps.lines.force");                     // also draw lines between points belonging to different segments 
    380         boolean direction = Main.pref.getBoolean("draw.rawgps.direction");                        // draw direction arrows on the lines 
    381         int maxLineLength = Main.pref.getInteger("draw.rawgps.max-line-length", -1); 
     382        // also draw lines between points belonging to different segments 
     383        boolean forceLines = Main.pref.getBoolean("draw.rawgps.lines.force");    
     384        // draw direction arrows on the lines 
     385        boolean direction = Main.pref.getBoolean("draw.rawgps.direction");    
    382386        // don't draw lines if longer than x meters 
    383         boolean lines = Main.pref.getBoolean("draw.rawgps.lines");                                // draw line between points, global setting 
     387        int maxLineLength = Main.pref.getInteger("draw.rawgps.max-line-length", -1);         
     388        // draw line between points, global setting 
     389        boolean lines = Main.pref.getBoolean("draw.rawgps.lines");                                 
    384390        String linesKey = "draw.rawgps.lines.layer "+name; 
     391        // draw lines, per-layer setting 
    385392        if (Main.pref.hasKey(linesKey)) 
    386             lines = Main.pref.getBoolean(linesKey);                                                 // draw lines, per-layer setting 
    387         boolean large = Main.pref.getBoolean("draw.rawgps.large");                                // paint large dots for points 
    388         boolean colored = Main.pref.getBoolean("draw.rawgps.colors");                             // color the lines 
    389         boolean alternatedirection = Main.pref.getBoolean("draw.rawgps.alternatedirection");      // paint direction arrow with alternate math. may be faster 
    390         int delta = Main.pref.getInteger("draw.rawgps.min-arrow-distance", 0); 
     393            lines = Main.pref.getBoolean(linesKey);     
     394        // paint large dots for points 
     395        boolean large = Main.pref.getBoolean("draw.rawgps.large"); 
     396        // color the lines 
     397        colorModes colored = colorModes.none; 
     398        try { 
     399            colored = colorModes.values()[Main.pref.getInteger("draw.rawgps.colors", 0)];  
     400        } catch(Exception e) { } 
     401        // paint direction arrow with alternate math. may be faster 
     402        boolean alternatedirection = Main.pref.getBoolean("draw.rawgps.alternatedirection");     
    391403        // don't draw arrows nearer to each other than this 
    392         int colorTracksTune = Main.pref.getInteger("draw.rawgps.colorTracksTune", 45); // allows to tweak line coloring for different speed levels. 
     404        int delta = Main.pref.getInteger("draw.rawgps.min-arrow-distance", 0);         
     405        // allows to tweak line coloring for different speed levels. 
     406        int colorTracksTune = Main.pref.getInteger("draw.rawgps.colorTracksTune", 45);  
    393407        /**************************************************************** 
    394408         ********** STEP 2a - CHECK CACHE VALIDITY ********************** 
     
    420434                            continue; 
    421435                        } 
     436                        trkPnt.customColoring = neutralColor; 
    422437                        if (oldWp != null) { 
    423438                            double dist = trkPnt.latlon.greatCircleDistance(oldWp.latlon); 
    424                             double dtime = trkPnt.time - oldWp.time; 
    425                             double vel = dist/dtime; 
    426                             double velColor = vel/colorTracksTune*255; 
    427  
    428                             if (!colored) { 
    429                                 trkPnt.speedLineColor = neutralColor; 
    430                             } else if (dtime <= 0 || vel < 0 || velColor > 255) { // attn: bad case first 
    431                                 trkPnt.speedLineColor = colors[255]; 
    432                             } else { 
    433                                 trkPnt.speedLineColor = colors[(int) (velColor)]; 
     439 
     440                            switch(colored) { 
     441                                case velocity: 
     442                                    double dtime = trkPnt.time - oldWp.time; 
     443                                    double vel = dist/dtime; 
     444                                    double velColor = vel/colorTracksTune*255; 
     445                                    // Bad case first 
     446                                    if (dtime <= 0 || vel < 0 || velColor > 255) 
     447                                        trkPnt.customColoring = colors[255]; 
     448                                    else 
     449                                        trkPnt.customColoring = colors[(int) (velColor)]; 
     450                                    break; 
     451                                 
     452                                case dilution: 
     453                                    if(trkPnt.attr.get("hdop") != null) { 
     454                                        float hdop = ((Float)trkPnt.attr.get("hdop")).floatValue(); 
     455                                        int hdoplvl = Math.round(hdop * 25); 
     456                                        // High hdop is bad, but high values in colors are green. 
     457                                        // Therefore inverse the logic 
     458                                        int hdopcolor = 255 - (hdoplvl > 255 ? 255 : hdoplvl); 
     459                                        trkPnt.customColoring = colors[hdopcolor]; 
     460                                    } 
     461                                    break;                                 
    434462                            } 
     463 
    435464                            if (maxLineLength == -1 || dist <= maxLineLength) { 
    436465                                trkPnt.drawLine = true; 
     
    440469                            } 
    441470                        } else { // make sure we reset outdated data 
    442                             trkPnt.speedLineColor = colors[255]; 
    443471                            trkPnt.drawLine = false; 
    444472                        } 
     
    464492                            // skip points that are on the same screenposition 
    465493                            if (old != null && ((old.x != screen.x) || (old.y != screen.y))) { 
    466                                 g.setColor(trkPnt.speedLineColor); 
     494                                g.setColor(trkPnt.customColoring); 
    467495                                g.drawLine(old.x, old.y, screen.x, screen.y); 
    468496                            } 
     
    489517                            // skip points that are on the same screenposition 
    490518                            if (old != null && (oldA == null || screen.x < oldA.x-delta || screen.x > oldA.x+delta || screen.y < oldA.y-delta || screen.y > oldA.y+delta)) { 
    491                                 g.setColor(trkPnt.speedLineColor); 
     519                                g.setColor(trkPnt.customColoring); 
    492520                                double t = Math.atan2(screen.y-old.y, screen.x-old.x) + Math.PI; 
    493521                                g.drawLine(screen.x,screen.y, (int)(screen.x + 10*Math.cos(t-PHI)), (int)(screen.y 
     
    519547                            // skip points that are on the same screenposition 
    520548                            if (old != null && (oldA == null || screen.x < oldA.x-delta || screen.x > oldA.x+delta || screen.y < oldA.y-delta || screen.y > oldA.y+delta)) { 
    521                                 g.setColor(trkPnt.speedLineColor); 
     549                                g.setColor(trkPnt.customColoring); 
    522550                                g.drawLine(screen.x, screen.y, screen.x + dir[trkPnt.dir][0], screen.y + dir[trkPnt.dir][1]); 
    523551                                g.drawLine(screen.x, screen.y, screen.x + dir[trkPnt.dir][2], screen.y + dir[trkPnt.dir][3]); 
     
    542570                            continue; 
    543571                        Point screen = mv.getPoint(trkPnt.eastNorth); 
    544                             g.fillRect(screen.x-1, screen.y-1, 3, 3); 
     572                        g.setColor(trkPnt.customColoring); 
     573                        g.fillRect(screen.x-1, screen.y-1, 3, 3); 
    545574                    } // end for trkpnt 
    546575                } // end for segment 
     
    578607                            continue; 
    579608                        Point screen = mv.getPoint(trkPnt.eastNorth); 
     609                        g.setColor(trkPnt.customColoring); 
    580610                        g.drawRect(screen.x, screen.y, 0, 0); 
    581611                    } // end for trkpnt 
  • trunk/src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java

    r1289 r1425  
    1010 
    1111import javax.swing.BorderFactory; 
     12import javax.swing.ButtonGroup; 
    1213import javax.swing.JCheckBox; 
    1314import javax.swing.JComboBox; 
    1415import javax.swing.JLabel; 
     16import javax.swing.JRadioButton; 
    1517import javax.swing.JTextField; 
    1618import javax.swing.JScrollPane; 
    1719import javax.swing.JPanel; 
    1820import javax.swing.Box; 
     21import javax.swing.event.ChangeEvent; 
     22import javax.swing.event.ChangeListener; 
    1923 
    2024import org.openstreetmap.josm.Main; 
     
    2731    private JCheckBox forceRawGpsLines = new JCheckBox(tr("Force lines if no segments imported.")); 
    2832    private JCheckBox largeGpsPoints = new JCheckBox(tr("Draw large GPS points.")); 
    29     private JCheckBox colorTracks = new JCheckBox(tr("Color tracks by velocity.")); 
    30     private JComboBox colorTracksTune = new JComboBox(new String[] {tr("Car"), tr("Bicycle"), tr("Foot")}); 
     33    private ButtonGroup colorGroup; 
     34    private JRadioButton colorTypeVelocity = new JRadioButton(tr("Velocity (red = slow, green = fast)")); 
     35    private JRadioButton colorTypeDilution = new JRadioButton(tr("Dilution of Position (red = high, green = low, if available)")); 
     36    private JRadioButton colorTypeNone = new JRadioButton(tr("Single Color (can be customized for named layers)")); 
     37    private JComboBox colorTypeVelocityTune = new JComboBox(new String[] {tr("Car"), tr("Bicycle"), tr("Foot")}); 
    3138    private JCheckBox directionHint = new JCheckBox(tr("Draw Direction Arrows")); 
    3239    private JCheckBox drawGpsArrows = new JCheckBox(tr("Draw Direction Arrows")); 
     
    4956        drawRawGpsLines.addActionListener(new ActionListener(){ 
    5057            public void actionPerformed(ActionEvent e) { 
    51                             forceRawGpsLines.setEnabled(drawRawGpsLines.isSelected()); 
    52                             drawRawGpsMaxLineLength.setEnabled(drawRawGpsLines.isSelected()); 
    53                             drawGpsArrows.setEnabled(drawRawGpsLines.isSelected()); 
    54                             drawGpsArrowsFast.setEnabled(drawGpsArrows.isSelected() && drawGpsArrows.isEnabled()); 
    55                             drawGpsArrowsMinDist.setEnabled(drawGpsArrows.isSelected() && drawGpsArrows.isEnabled()); 
    56                             colorTracks.setEnabled(drawRawGpsLines.isSelected()); 
    57                             colorTracksTune.setEnabled(colorTracks.isSelected() && drawRawGpsLines.isSelected()); 
     58                forceRawGpsLines.setEnabled(drawRawGpsLines.isSelected()); 
     59                drawRawGpsMaxLineLength.setEnabled(drawRawGpsLines.isSelected()); 
     60                drawGpsArrows.setEnabled(drawRawGpsLines.isSelected()); 
     61                drawGpsArrowsFast.setEnabled(drawGpsArrows.isSelected() && drawGpsArrows.isEnabled()); 
     62                drawGpsArrowsMinDist.setEnabled(drawGpsArrows.isSelected() && drawGpsArrows.isEnabled()); 
    5863            } 
    5964        }); 
     
    100105        panel.add(drawGpsArrowsMinDist, GBC.eol().fill(GBC.HORIZONTAL).insets(5,0,0,5)); 
    101106 
    102         // colorTracks 
    103         colorTracks.addActionListener(new ActionListener(){ 
    104             public void actionPerformed(ActionEvent e) { 
    105                             colorTracksTune.setEnabled(colorTracks.isSelected() && drawRawGpsLines.isSelected()); 
    106             } 
    107         }); 
    108         colorTracks.setSelected(Main.pref.getBoolean("draw.rawgps.colors")); 
    109         colorTracks.setToolTipText(tr("Choose the hue for the track color by the velocity at that point.")); 
    110         colorTracks.setEnabled(drawRawGpsLines.isSelected()); 
    111         panel.add(colorTracks, GBC.std().insets(40,0,0,0)); 
    112          
    113         // color Tracks by Velocity Tune 
    114         int ccts = Main.pref.getInteger("draw.rawgps.colorTracksTune", 45); 
    115         colorTracksTune.setSelectedIndex(ccts==10 ? 2 : (ccts==20 ? 1 : 0)); 
    116         colorTracksTune.setToolTipText(tr("Allows to tune the track coloring for different average speeds.")); 
    117         colorTracksTune.setEnabled(colorTracks.isSelected() && colorTracks.isEnabled()); 
    118         panel.add(colorTracksTune, GBC.eop().insets(5,0,0,5)); 
    119          
    120107        // largeGpsPoints 
    121108        largeGpsPoints.setSelected(Main.pref.getBoolean("draw.rawgps.large")); 
    122109        largeGpsPoints.setToolTipText(tr("Draw larger dots for the GPS points.")); 
    123110        panel.add(largeGpsPoints, GBC.eop().insets(20,0,0,0)); 
     111 
     112        // colorTracks 
     113        colorGroup = new ButtonGroup(); 
     114        colorGroup.add(colorTypeNone); 
     115        colorGroup.add(colorTypeVelocity); 
     116        colorGroup.add(colorTypeDilution); 
     117 
     118        colorTypeVelocity.addChangeListener(new ChangeListener(){ 
     119            public void stateChanged(ChangeEvent e) { 
     120                colorTypeVelocityTune.setEnabled(colorTypeVelocity.isSelected()); 
     121            } 
     122        }); 
     123 
     124        switch(Main.pref.getInteger("draw.rawgps.colors", 0)) { 
     125            case 0: 
     126                colorTypeNone.setSelected(true); 
     127                break; 
     128            case 1: 
     129                colorTypeVelocity.setSelected(true); 
     130                break; 
     131            case 2: 
     132                colorTypeDilution.setSelected(true); 
     133                break; 
     134        } 
     135 
     136        colorTypeNone.setToolTipText(tr("All points and track segments will have the same color. Can be customized in Layer Manager.")); 
     137        colorTypeVelocity.setToolTipText(tr("Colors points and track segments by velocity.")); 
     138        colorTypeDilution.setToolTipText(tr("Colors points and track segments by dilution of position (HDOP). Your capture device needs to logs that information.")); 
     139 
     140        // color Tracks by Velocity Tune 
     141        int ccts = Main.pref.getInteger("draw.rawgps.colorTracksTune", 45); 
     142        colorTypeVelocityTune.setSelectedIndex(ccts==10 ? 2 : (ccts==20 ? 1 : 0)); 
     143        colorTypeVelocityTune.setToolTipText(tr("Allows to tune the track coloring for different average speeds.")); 
     144        colorTypeVelocityTune.setEnabled(colorTypeVelocity.isSelected() && colorTypeVelocity.isEnabled()); 
     145 
     146        panel.add(Box.createVerticalGlue(), GBC.eol().insets(0, 20, 0, 0)); 
     147 
     148        panel.add(new JLabel(tr("Track and Point Coloring")), GBC.eol().insets(20,0,0,0)); 
     149        panel.add(colorTypeNone, GBC.eol().insets(40,0,0,0)); 
     150        panel.add(colorTypeVelocity, GBC.std().insets(40,0,0,0)); 
     151        panel.add(colorTypeVelocityTune, GBC.eop().insets(5,0,0,5)); 
     152        panel.add(colorTypeDilution, GBC.eol().insets(40,0,0,0)); 
    124153 
    125154        panel.add(Box.createVerticalGlue(), GBC.eol().fill(GBC.BOTH)); 
     
    198227        Main.pref.put("draw.rawgps.alternatedirection", drawGpsArrowsFast.isSelected()); 
    199228        Main.pref.put("draw.rawgps.min-arrow-distance", drawGpsArrowsMinDist.getText()); 
    200         Main.pref.put("draw.rawgps.colors", colorTracks.isSelected()); 
    201         int ccti=colorTracksTune.getSelectedIndex(); 
     229        if(colorTypeVelocity.isSelected()) 
     230            Main.pref.putInteger("draw.rawgps.colors", 1); 
     231        else if(colorTypeDilution.isSelected()) 
     232            Main.pref.putInteger("draw.rawgps.colors", 2); 
     233        else 
     234            Main.pref.putInteger("draw.rawgps.colors", 0); 
     235        int ccti=colorTypeVelocityTune.getSelectedIndex(); 
    202236        Main.pref.putInteger("draw.rawgps.colorTracksTune", ccti==2 ? 10 : (ccti==1 ? 20 : 45)); 
    203237        Main.pref.put("draw.rawgps.large", largeGpsPoints.isSelected()); 
  • trunk/src/org/openstreetmap/josm/io/GpxReader.java

    r1169 r1425  
    224224                break; 
    225225            case wpt: 
    226                 if (qName.equals("ele") || qName.equals("magvar") 
    227                         || qName.equals("geoidheight") || qName.equals("name") 
    228                         || qName.equals("sym") || qName.equals("type")) { 
     226                if (   qName.equals("ele") || qName.equals("magvar") 
     227                    || qName.equals("name") || qName.equals("geoidheight") 
     228                    || qName.equals("type") || qName.equals("sym")) { 
    229229                    currentWayPoint.attr.put(qName, accumulator.toString()); 
     230                } else if(qName.equals("hdop") /*|| qName.equals("vdop") || 
     231                        qName.equals("pdop")*/) { 
     232                    try { 
     233                        currentWayPoint.attr.put(qName, Float.parseFloat(accumulator.toString())); 
     234                    } catch(Exception e) { 
     235                        currentWayPoint.attr.put(qName, new Float(0)); 
     236                    } 
    230237                } else if (qName.equals("time")) { 
    231238                    currentWayPoint.attr.put(qName, accumulator.toString()); 
  • trunk/src/org/openstreetmap/josm/io/NmeaReader.java

    r1415 r1425  
    309309                // h-dilution 
    310310                accu=e[GPGGA.HDOP.position]; 
    311                 if(!accu.equals("")) { 
    312                     Double.parseDouble(accu); 
    313                     currentwp.attr.put("hdop", accu); 
    314                 } 
     311                if(!accu.equals("")) 
     312                    currentwp.attr.put("hdop", Float.parseFloat(accu)); 
    315313                // fix 
    316314                accu=e[GPGGA.QUALITY.position]; 
     
    356354                // vdop 
    357355                accu=e[GPGSA.VDOP.position]; 
    358                 if(!accu.equals("")) { 
    359                     Double.parseDouble(accu); 
    360                     currentwp.attr.put("vdop", accu); 
    361                 } 
     356                if(!accu.equals("")) 
     357                    currentwp.attr.put("vdop", Float.parseFloat(accu)); 
    362358                // hdop 
    363359                accu=e[GPGSA.HDOP.position]; 
    364                 if(!accu.equals("")) { 
    365                     Double.parseDouble(accu); 
    366                     currentwp.attr.put("hdop", accu); 
    367                 } 
     360                if(!accu.equals("")) 
     361                    currentwp.attr.put("hdop", Float.parseFloat(accu)); 
    368362                // pdop 
    369363                accu=e[GPGSA.PDOP.position]; 
    370                 if(!accu.equals("")) { 
    371                     Double.parseDouble(accu); 
    372                     currentwp.attr.put("pdop", accu); 
    373                 } 
     364                if(!accu.equals("")) 
     365                    currentwp.attr.put("pdop", Float.parseFloat(accu)); 
    374366            } 
    375367            else if(e[0].equals("$GPRMC")) { 
  • trunk/src/org/openstreetmap/josm/io/OsmReader.java

    r1415 r1425  
    478478      * @param ref The dataset that is search in for references first. If 
    479479      *      the Reference is not found here, Main.ds is searched and a copy of the 
    480       *  elemet found there is returned. 
     480      *  element found there is returned. 
    481481      */ 
    482482     public static DataSet parseDataSet(InputStream source, DataSet ref, PleaseWaitDialog pleaseWaitDlg) throws SAXException, IOException { 
Note: See TracChangeset for help on using the changeset viewer.