Ignore:
Timestamp:
03.02.2010 09:48:51 (2 years ago)
Author:
bastiK
Message:

cleanup for geoimage code (mainly getters and setters)

File:
1 edited

Legend:

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

    r2907 r2931  
    22// Copyright 2007 by Christian Gallioz (aka khris78) 
    33// Parts of code from Geotagged plugin (by Rob Neild) 
    4 // and the core JOSM source code (by Immanuel Scholz and others) 
    54 
    65package org.openstreetmap.josm.gui.layer.geoimage; 
     
    333332            imgList = new JList(new AbstractListModel() { 
    334333                public Object getElementAt(int i) { 
    335                     return yLayer.data.get(i).file.getName(); 
     334                    return yLayer.data.get(i).getFile().getName(); 
    336335                } 
    337336 
     
    345344                public void valueChanged(ListSelectionEvent arg0) { 
    346345                    int index = imgList.getSelectedIndex(); 
    347                     imgDisp.setImage(yLayer.data.get(index).file); 
    348                     Date date = yLayer.data.get(index).time; 
     346                    imgDisp.setImage(yLayer.data.get(index).getFile()); 
     347                    Date date = yLayer.data.get(index).getExifTime(); 
    349348                    if (date != null) { 
    350349                        lbExifTime.setText(new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(date)); 
     
    649648                    return tr("No gpx selected"); 
    650649 
    651                 lastNumMatched = matchGpxTrack(dateImgLst, selGpx.data, (long) (timezone * 3600) + delta); 
     650                final long offset_ms = ((long) (timezone * 3600) + delta) * 1000; // in milliseconds 
     651                lastNumMatched = matchGpxTrack(dateImgLst, selGpx.data, offset_ms); 
    652652 
    653653                return trn("<html>Matched <b>{0}</b> of <b>{1}</b> photo to GPX track.</html>", 
     
    746746                    Main.pref.put("geoimage.showThumbs", yLayer.useThumbs); 
    747747 
    748                     yLayer.useThumbs = cbShowThumbs.isSelected();//FIXME 
     748                    yLayer.useThumbs = cbShowThumbs.isSelected(); 
    749749                    yLayer.loadThumbs(); 
    750750 
     
    955955 
    956956            // Init variables 
    957             long firstExifDate = imgs.get(0).time.getTime()/1000; 
     957            long firstExifDate = imgs.get(0).getExifTime().getTime()/1000; 
    958958 
    959959            long firstGPXDate = -1; 
     
    10411041        ArrayList<ImageEntry> dateImgLst = new ArrayList<ImageEntry>(yLayer.data.size()); 
    10421042        for (ImageEntry e : yLayer.data) { 
    1043             if (e.time == null) { 
     1043            if (e.getExifTime() == null) { 
    10441044                continue; 
    10451045            } 
    10461046 
    1047             if (e.exifCoor != null) { 
     1047            if (e.getExifCoor() != null) { 
    10481048                if (!exif) { 
    10491049                    continue; 
     
    10511051            } 
    10521052 
    1053             if (e.isTagged() && e.exifCoor == null) { 
     1053            if (e.isTagged() && e.getExifCoor() == null) { 
    10541054                if (!tagged) { 
    10551055                    continue; 
     
    10621062        Collections.sort(dateImgLst, new Comparator<ImageEntry>() { 
    10631063            public int compare(ImageEntry arg0, ImageEntry arg1) { 
    1064                 return arg0.time.compareTo(arg1.time); 
     1064                return arg0.getExifTime().compareTo(arg1.getExifTime()); 
    10651065            } 
    10661066        }); 
     
    10821082    } 
    10831083 
    1084     private int matchGpxTrack(ArrayList<ImageEntry> dateImgLst, GpxData selectedGpx, long offset) { 
     1084    /** 
     1085     * Match a list of photos to a gpx track with a given offset. 
     1086     * All images need a exifTime attribute and the List must be sorted according to these times. 
     1087     */ 
     1088    private int matchGpxTrack(ArrayList<ImageEntry> images, GpxData selectedGpx, long offset) { 
    10851089        int ret = 0; 
    10861090 
     
    10901094            for (GpxTrackSegment segment : trk.getSegments()) { 
    10911095 
    1092                 long prevDateWp = 0; 
     1096                long prevWpTime = 0; 
    10931097                WayPoint prevWp = null; 
    10941098 
    10951099                for (WayPoint curWp : segment.getWayPoints()) { 
    10961100 
    1097                     String curDateWpStr = (String) curWp.attr.get("time"); 
    1098                     if (curDateWpStr != null) { 
     1101                    String curWpTimeStr = (String) curWp.attr.get("time"); 
     1102                    if (curWpTimeStr != null) { 
    10991103 
    11001104                        try { 
    1101                             long curDateWp = dateParser.parse(curDateWpStr).getTime()/1000 + offset; 
    1102                             ret += matchPoints(dateImgLst, prevWp, prevDateWp, curWp, curDateWp); 
     1105                            long curWpTime = dateParser.parse(curWpTimeStr).getTime() + offset; 
     1106                            ret += matchPoints(images, prevWp, prevWpTime, curWp, curWpTime, offset); 
    11031107 
    11041108                            prevWp = curWp; 
    1105                             prevDateWp = curDateWp; 
     1109                            prevWpTime = curWpTime; 
    11061110 
    11071111                        } catch(ParseException e) { 
    1108                             System.err.println("Error while parsing date \"" + curDateWpStr + '"'); 
     1112                            System.err.println("Error while parsing date \"" + curWpTimeStr + '"'); 
    11091113                            e.printStackTrace(); 
    11101114                            prevWp = null; 
    1111                             prevDateWp = 0; 
     1115                            prevWpTime = 0; 
    11121116                        } 
    11131117                    } else { 
    11141118                        prevWp = null; 
    1115                         prevDateWp = 0; 
     1119                        prevWpTime = 0; 
    11161120                    } 
    11171121                } 
     
    11211125    } 
    11221126 
    1123     private int matchPoints(ArrayList<ImageEntry> dateImgLst, WayPoint prevWp, long prevDateWp, 
    1124             WayPoint curWp, long curDateWp) { 
     1127    private int matchPoints(ArrayList<ImageEntry> images, WayPoint prevWp, long prevWpTime, 
     1128            WayPoint curWp, long curWpTime, long offset) { 
    11251129        // Time between the track point and the previous one, 5 sec if first point, i.e. photos take 
    11261130        // 5 sec before the first track point can be assumed to be take at the starting position 
    1127         long interval = prevDateWp > 0 ? ((int)Math.abs(curDateWp - prevDateWp)) : 5; 
     1131        long interval = prevWpTime > 0 ? ((long)Math.abs(curWpTime - prevWpTime)) : 5*1000; 
    11281132        int ret = 0; 
    11291133 
    11301134        // i is the index of the timewise last photo that has the same or earlier EXIF time 
    1131         int i = getLastIndexOfListBefore(dateImgLst, curDateWp); 
     1135        int i = getLastIndexOfListBefore(images, curWpTime); 
    11321136 
    11331137        // no photos match 
     
    11421146            double distance = prevWp.getCoor().greatCircleDistance(curWp.getCoor()); 
    11431147            // This is in km/h, 3.6 * m/s 
    1144             if (curDateWp > prevDateWp) { 
    1145                 speed = 3.6 * distance / (curDateWp - prevDateWp); 
     1148            if (curWpTime > prevWpTime) { 
     1149                speed = 3.6 * distance / (curWpTime - prevWpTime); 
    11461150            } 
    11471151            try { 
     
    11561160        // First trackpoint, then interval is set to five seconds, i.e. photos up to five seconds 
    11571161        // before the first point will be geotagged with the starting point 
    1158         if(prevDateWp == 0 || curDateWp <= prevDateWp) { 
    1159             while(i >= 0 && (dateImgLst.get(i).time.getTime()/1000) <= curDateWp 
    1160                     && (dateImgLst.get(i).time.getTime()/1000) >= (curDateWp - interval)) { 
    1161                 if(dateImgLst.get(i).tmp.getPos() == null) { 
    1162                     dateImgLst.get(i).tmp.setCoor(curWp.getCoor()); 
    1163                     dateImgLst.get(i).tmp.setSpeed(speed); 
    1164                     dateImgLst.get(i).tmp.setElevation(curElevation); 
     1162        if(prevWpTime == 0 || curWpTime <= prevWpTime) { 
     1163            while (true) { 
     1164                if (i < 0) 
     1165                    break; 
     1166                final ImageEntry curImg = images.get(i); 
     1167                if (curImg.getExifTime().getTime() > curWpTime 
     1168                    || curImg.getExifTime().getTime() < curWpTime - interval) 
     1169                        break; 
     1170                if(curImg.tmp.getPos() == null) { 
     1171                    curImg.tmp.setPos(curWp.getCoor()); 
     1172                    curImg.tmp.setSpeed(speed); 
     1173                    curImg.tmp.setElevation(curElevation); 
     1174                    curImg.tmp.setGpsTime(new Date(curImg.getExifTime().getTime() - offset)); 
    11651175                    ret++; 
    11661176                } 
     
    11721182        // This code gives a simple linear interpolation of the coordinates between current and 
    11731183        // previous track point assuming a constant speed in between 
    1174         long imgDate; 
    1175         while(i >= 0 && (imgDate = dateImgLst.get(i).time.getTime()/1000) >= prevDateWp) { 
    1176  
    1177             if(dateImgLst.get(i).tmp.getPos() == null) { 
     1184        while (true) { 
     1185            if (i < 0) 
     1186                break; 
     1187            ImageEntry curImg = images.get(i); 
     1188            long imgTime = curImg.getExifTime().getTime(); 
     1189            if (imgTime < prevWpTime) 
     1190                break; 
     1191 
     1192            if(curImg.tmp.getPos() == null) { 
    11781193                // The values of timeDiff are between 0 and 1, it is not seconds but a dimensionless 
    11791194                // variable 
    1180                 double timeDiff = (double)(imgDate - prevDateWp) / interval; 
    1181                 dateImgLst.get(i).tmp.setCoor(prevWp.getCoor().interpolate(curWp.getCoor(), timeDiff)); 
    1182                 dateImgLst.get(i).tmp.setSpeed(speed); 
    1183  
     1195                double timeDiff = (double)(imgTime - prevWpTime) / interval; 
     1196                curImg.tmp.setPos(prevWp.getCoor().interpolate(curWp.getCoor(), timeDiff)); 
     1197                curImg.tmp.setSpeed(speed); 
    11841198                if (curElevation != null && prevElevation != null) { 
    1185                     dateImgLst.get(i).setElevation(prevElevation + (curElevation - prevElevation) * timeDiff); 
    1186                 } 
     1199                    curImg.setElevation(prevElevation + (curElevation - prevElevation) * timeDiff); 
     1200                } 
     1201                curImg.tmp.setGpsTime(new Date(curImg.getExifTime().getTime() - offset)); 
    11871202 
    11881203                ret++; 
     
    11931208    } 
    11941209 
    1195     private int getLastIndexOfListBefore(ArrayList<ImageEntry> dateImgLst, long searchedDate) { 
    1196         int lstSize= dateImgLst.size(); 
     1210    private int getLastIndexOfListBefore(ArrayList<ImageEntry> images, long searchedTime) { 
     1211        int lstSize= images.size(); 
    11971212 
    11981213        // No photos or the first photo taken is later than the search period 
    1199         if(lstSize == 0 || searchedDate < dateImgLst.get(0).time.getTime()/1000) 
     1214        if(lstSize == 0 || searchedTime < images.get(0).getExifTime().getTime()) 
    12001215            return -1; 
    12011216 
    12021217        // The search period is later than the last photo 
    1203         if (searchedDate > dateImgLst.get(lstSize - 1).time.getTime() / 1000) 
     1218        if (searchedTime > images.get(lstSize - 1).getExifTime().getTime()) 
    12041219            return lstSize-1; 
    12051220 
     
    12101225        while (endIndex - startIndex > 1) { 
    12111226            curIndex= (endIndex + startIndex) / 2; 
    1212             if (searchedDate > dateImgLst.get(curIndex).time.getTime()/1000) { 
     1227            if (searchedTime > images.get(curIndex).getExifTime().getTime()) { 
    12131228                startIndex= curIndex; 
    12141229            } else { 
     
    12161231            } 
    12171232        } 
    1218         if (searchedDate < dateImgLst.get(endIndex).time.getTime()/1000) 
     1233        if (searchedTime < images.get(endIndex).getExifTime().getTime()) 
    12191234            return startIndex; 
    12201235 
    12211236        // This final loop is to check if photos with the exact same EXIF time follows 
    1222         while ((endIndex < (lstSize-1)) && (dateImgLst.get(endIndex).time.getTime() 
    1223                 == dateImgLst.get(endIndex + 1).time.getTime())) { 
     1237        while ((endIndex < (lstSize-1)) && (images.get(endIndex).getExifTime().getTime() 
     1238                == images.get(endIndex + 1).getExifTime().getTime())) { 
    12241239            endIndex++; 
    12251240        } 
Note: See TracChangeset for help on using the changeset viewer.