Changeset 4250 in josm


Ignore:
Timestamp:
Jul 15, 2011 9:52:06 PM (22 months ago)
Author:
stoecker
Message:

add dynamic colorselection for GPX tracks based on the real data range

Location:
trunk/src/org/openstreetmap/josm/gui
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java

    r4230 r4250  
    9292    private int computeCacheMaxLineLengthUsed; 
    9393    private Color computeCacheColorUsed; 
     94    private boolean computeCacheColorDynamic; 
    9495    private colorModes computeCacheColored; 
    9596    private int computeCacheColorTracksTune; 
     
    421422        // allows to tweak line coloring for different speed levels. 
    422423        int colorTracksTune = Main.pref.getInteger("draw.rawgps.colorTracksTune", "layer "+getName(), 45); 
     424        boolean colorModeDynamic = Main.pref.getBoolean("draw.rawgps.colors.dynamic", "layer "+getName(), false); 
     425        int hdopfactor = Main.pref.getInteger("hdop.factor", 25); 
    423426 
    424427        if(lineWidth != 0) 
     
    431434         ****************************************************************/ 
    432435        if ((computeCacheMaxLineLengthUsed != maxLineLength) || (!neutralColor.equals(computeCacheColorUsed)) 
    433                 || (computeCacheColored != colored) || (computeCacheColorTracksTune != colorTracksTune)) { 
    434             // System.out.println("(re-)computing gpx line styles, reason: CCIS=" + 
    435             // computeCacheInSync + " CCMLLU=" + (computeCacheMaxLineLengthUsed != maxLineLength) + 
    436             // " CCCU=" + (!neutralColor.equals(computeCacheColorUsed)) + " CCC=" + 
    437             // (computeCacheColored != colored)); 
     436                || (computeCacheColored != colored) || (computeCacheColorTracksTune != colorTracksTune) 
     437                || (computeCacheColorDynamic != colorModeDynamic)) { 
    438438            computeCacheMaxLineLengthUsed = maxLineLength; 
    439439            computeCacheInSync = false; 
     
    441441            computeCacheColored = colored; 
    442442            computeCacheColorTracksTune = colorTracksTune; 
     443            computeCacheColorDynamic = colorModeDynamic; 
    443444        } 
    444445 
     
    447448         ****************************************************************/ 
    448449        if (!computeCacheInSync) { // don't compute if the cache is good 
     450            Float minval = null; 
     451            Float maxval = null; 
    449452            WayPoint oldWp = null; 
     453            if (colorModeDynamic) { 
     454                if (colored == colorModes.velocity) { 
     455                    for (GpxTrack trk : data.tracks) { 
     456                        for (GpxTrackSegment segment : trk.getSegments()) { 
     457                            if(!forceLines) oldWp = null; 
     458                            for (WayPoint trkPnt : segment.getWayPoints()) { 
     459                                LatLon c = trkPnt.getCoor(); 
     460                                if (Double.isNaN(c.lat()) || Double.isNaN(c.lon())) { 
     461                                    continue; 
     462                                } 
     463                                if (oldWp != null && trkPnt.time > oldWp.time) { 
     464                                    Float vel = new Float(c.greatCircleDistance(oldWp.getCoor()) / (trkPnt.time - oldWp.time)); 
     465                                    if(maxval == null || vel > maxval) maxval = vel; 
     466                                    if(minval == null || vel < minval) minval = vel; 
     467                                } 
     468                                oldWp = trkPnt; 
     469                            } 
     470                        } 
     471                    } 
     472                } else if (colored == colorModes.dilution) { 
     473                    for (GpxTrack trk : data.tracks) { 
     474                        for (GpxTrackSegment segment : trk.getSegments()) { 
     475                            for (WayPoint trkPnt : segment.getWayPoints()) { 
     476                                Object val = trkPnt.attr.get("hdop"); 
     477                                if (val != null) { 
     478                                    Float hdop = (Float) val; 
     479                                    if(maxval == null || hdop > maxval) maxval = hdop; 
     480                                    if(minval == null || hdop < minval) minval = hdop; 
     481                                } 
     482                            } 
     483                        } 
     484                    } 
     485                } 
     486                oldWp = null; 
     487            } 
    450488            for (GpxTrack trk : data.tracks) { 
    451489                for (GpxTrackSegment segment : trk.getSegments()) { 
     
    459497                        } 
    460498                        trkPnt.customColoring = neutralColor; 
     499                        if(colored == colorModes.dilution && trkPnt.attr.get("hdop") != null) { 
     500                            float hdop = ((Float) trkPnt.attr.get("hdop")).floatValue(); 
     501                            int hdoplvl = Math.round(colorModeDynamic ? ((hdop-minval)*255/(maxval-minval)) 
     502                            : (hdop <= 0 ? 0 : hdop * hdopfactor)); 
     503                            // High hdop is bad, but high values in colors are green. 
     504                            // Therefore inverse the logic 
     505                            int hdopcolor = 255 - (hdoplvl > 255 ? 255 : hdoplvl); 
     506                            trkPnt.customColoring = colors[hdopcolor]; 
     507                        } 
    461508                        if (oldWp != null) { 
    462509                            double dist = c.greatCircleDistance(oldWp.getCoor()); 
     
    465512                            case velocity: 
    466513                                double dtime = trkPnt.time - oldWp.time; 
    467                                 double vel = dist / dtime; 
    468                                 double velColor = vel / colorTracksTune * 255; 
    469                                 // Bad case first 
    470                                 if (dtime <= 0 || vel < 0 || velColor > 255) { 
     514                                if(dtime > 0) { 
     515                                    float vel = (float) (dist / dtime); 
     516                                    int velColor = Math.round(colorModeDynamic ? ((vel-minval)*255/(maxval-minval)) 
     517                                    : (vel <= 0 ? 0 : vel / colorTracksTune * 255)); 
     518                                    trkPnt.customColoring = colors[velColor > 255 ? 255 : velColor]; 
     519                                } else { 
    471520                                    trkPnt.customColoring = colors[255]; 
    472                                 } else { 
    473                                     trkPnt.customColoring = colors[(int) (velColor)]; 
    474521                                } 
    475522                                break; 
    476  
    477523                            case direction: 
    478524                                double dirColor = oldWp.getCoor().heading(trkPnt.getCoor()) / (2.0 * Math.PI) * 256; 
     
    482528                                } else { 
    483529                                    trkPnt.customColoring = colors_cyclic[(int) (dirColor)]; 
    484                                 } 
    485                                 break; 
    486                             case dilution: 
    487                                 if (trkPnt.attr.get("hdop") != null) { 
    488                                     float hdop = ((Float) trkPnt.attr.get("hdop")).floatValue(); 
    489                                     if (hdop < 0) { 
    490                                         hdop = 0; 
    491                                     } 
    492                                     int hdoplvl = Math.round(hdop * Main.pref.getInteger("hdop.factor", 25)); 
    493                                     // High hdop is bad, but high values in colors are green. 
    494                                     // Therefore inverse the logic 
    495                                     int hdopcolor = 255 - (hdoplvl > 255 ? 255 : hdoplvl); 
    496                                     trkPnt.customColoring = colors[hdopcolor]; 
    497530                                } 
    498531                                break; 
  • trunk/src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java

    r4235 r4250  
    6262    private JCheckBox makeAutoMarkers = new JCheckBox(tr("Create markers when reading GPX.")); 
    6363    private JCheckBox outlineOnly = new JCheckBox(tr("Draw only outlines of areas")); 
     64    private JCheckBox colorDynamic = new JCheckBox(tr("Dynamic color range based on data limits")); 
    6465    private JComboBox waypointLabel = new JComboBox(new String[] {tr("Auto"), /* gpx data field name */ trc("gpx_field", "Name"), 
    6566            /* gpx data field name */ trc("gpx_field", "Desc(ription)"), tr("Both"), tr("None")}); 
     
    177178            public void stateChanged(ChangeEvent e) { 
    178179                colorTypeVelocityTune.setEnabled(colorTypeVelocity.isSelected()); 
     180                colorDynamic.setEnabled(colorTypeVelocity.isSelected() || colorTypeDilution.isSelected()); 
     181            } 
     182        }); 
     183        colorTypeDilution.addChangeListener(new ChangeListener(){ 
     184            public void stateChanged(ChangeEvent e) { 
     185                colorDynamic.setEnabled(colorTypeVelocity.isSelected() || colorTypeDilution.isSelected()); 
    179186            } 
    180187        }); 
     
    214221        panel.add(colorTypeDirection, GBC.eol().insets(40,0,0,0)); 
    215222        panel.add(colorTypeDilution, GBC.eol().insets(40,0,0,0)); 
     223        colorDynamic.setToolTipText(tr("Draw direction arrows for lines, connecting GPS points.")); 
     224        colorDynamic.setSelected(Main.pref.getBoolean("draw.rawgps.colors.dynamic", false)); 
     225        colorDynamic.setEnabled(colorTypeVelocity.isSelected() || colorTypeDilution.isSelected()); 
     226        panel.add(colorDynamic, GBC.eop().insets(40,0,0,0)); 
    216227 
    217228        // waypointLabel 
     
    302313        Main.pref.put("draw.rawgps.alternatedirection", drawGpsArrowsFast.isSelected()); 
    303314        Main.pref.put("draw.rawgps.min-arrow-distance", drawGpsArrowsMinDist.getText()); 
     315        Main.pref.put("draw.rawgps.colors.dynamic", colorDynamic.isSelected()); 
    304316        if(colorTypeVelocity.isSelected()) { 
    305317            Main.pref.putInteger("draw.rawgps.colors", 1); 
Note: See TracChangeset for help on using the changeset viewer.