Ticket #2124: agpifoj range support.patch

File agpifoj range support.patch, 4.9 KB (added by xeen, 17 years ago)

Uploading WIP so this doesn't get lost

  • src/org/openstreetmap/josm/plugins/agpifoj/CorrelateGpxWithImages.java

     
    571571            String deltaText = tfOffset.getText().trim();
    572572            if (deltaText.length() > 0) {
    573573                try {
     574                    if(deltaText.startsWith("+"))
     575                        deltaText = deltaText.substring(1);
    574576                    delta = Long.parseLong(deltaText);
    575577                } catch(NumberFormatException nfe) {
    576578                    JOptionPane.showMessageDialog(Main.parent, tr("Error while parsing offset.\nExpected format: {0}", "number"),
     
    691693    }
    692694
    693695    private int matchPoints(ArrayList<ImageEntry> dateImgLst, WayPoint prevWp, long prevDateWp, WayPoint curWp, long curDateWp) {
     696        int interval = prevDateWp > 0 ? ((int)Math.abs(curDateWp - prevDateWp)) : 1000;
    694697        int ret = 0;
    695         int i = getLastIndexOfListBefore(dateImgLst, curDateWp);
    696         if (i >= 0 && i < dateImgLst.size() && dateImgLst.get(i).time.getTime() > prevDateWp) {
     698        int i = getLastIndexOfListBefore(dateImgLst, curDateWp, interval);
     699        if (i >= 0 && i < dateImgLst.size() && dateImgLst.get(i).time.getTime()+interval > prevDateWp) {
    697700            Double speed = null;
    698701            Double prevElevation = null;
    699702            Double curElevation = null;
     
    702705                speed = new Double((1000 * distance) / (curDateWp - prevDateWp));
    703706                try {
    704707                    prevElevation = new Double((String) prevWp.attr.get("ele"));
    705                 } catch(Exception e) {
    706                 }
     708                } catch(Exception e) {}
    707709            }
    708710            try {
    709711                curElevation = new Double((String) curWp.attr.get("ele"));
    710             } catch (Exception e) {
    711             }
     712            } catch (Exception e) {}
    712713
    713714            while(i >= 0
    714                     && dateImgLst.get(i).time.getTime() == curDateWp) {
     715                    && inRadius(dateImgLst.get(i).time.getTime(), curDateWp, interval)) {
    715716                dateImgLst.get(i).pos = curWp.eastNorth;
    716717                dateImgLst.get(i).coor = Main.proj.eastNorth2latlon(dateImgLst.get(i).pos);
    717718                dateImgLst.get(i).speed = speed;
     
    740741        return ret;
    741742    }
    742743
    743     private int getLastIndexOfListBefore(ArrayList<ImageEntry> dateImgLst, long searchedDate) {
     744    private int getLastIndexOfListBefore(ArrayList<ImageEntry> dateImgLst, long searchedDate, int interval) {
    744745        int lstSize = dateImgLst.size();
    745746        if (lstSize == 0 || searchedDate < dateImgLst.get(0).time.getTime()) {
    746747            return -1;
    747         } else if (searchedDate > dateImgLst.get(lstSize - 1).time.getTime()) {
     748        } else if (searchedDate-interval > dateImgLst.get(lstSize - 1).time.getTime()) {
    748749            return lstSize;
    749         } else if (searchedDate == dateImgLst.get(lstSize - 1).time.getTime()) {
     750        } else if (inRadius(searchedDate, dateImgLst.get(lstSize - 1).time.getTime(), interval)) {
    750751            return lstSize - 1;
    751         } else if (searchedDate == dateImgLst.get(0).time.getTime()) {
     752        } else if (inRadius(searchedDate , dateImgLst.get(0).time.getTime(), interval)) {
    752753            int curIndex = 0;
    753754            while (curIndex + 1 < lstSize
    754                     && dateImgLst.get(curIndex + 1).time.getTime() == searchedDate) {
     755                    && inRadius(dateImgLst.get(curIndex + 1).time.getTime(), searchedDate, interval)) {
    755756                curIndex++;
    756757            }
    757758            return curIndex;
     
    763764        while (endIndex - startIndex > 1) {
    764765            curIndex = (endIndex + startIndex) / 2;
    765766            long curDate = dateImgLst.get(curIndex).time.getTime();
    766             if (curDate < searchedDate) {
     767            if (curDate-interval < searchedDate) {
    767768                startIndex = curIndex;
    768             } else if (curDate > searchedDate) {
     769            } else if (curDate+interval > searchedDate) {
    769770                endIndex = curIndex;
    770771            } else {
    771772                // Check that there is no image _after_ that one that have exactly the same date.
    772773                while (curIndex + 1 < lstSize
    773                         && dateImgLst.get(curIndex + 1).time.getTime() == searchedDate) {
     774                        && inRadius(dateImgLst.get(curIndex + 1).time.getTime(), searchedDate, interval)) {
    774775                    curIndex++;
    775776                }
    776777                return curIndex;
     
    886887                     * 6372795; // Earth radius, in meters
    887888        return ret;
    888889    }
     890   
     891    private boolean inRadius(long time1, long time2, int interval) {
     892        return Math.abs(time1 - time2) < interval;
     893    }
    889894}