Search in sources :

Example 6 with Sort

use of uk.me.parabola.imgfmt.app.srt.Sort in project mkgmap by openstreetmap.

the class TYPFile method writeLabels.

private void writeLabels(ImgFileWriter in) {
    if (data.getIcons().isEmpty())
        return;
    SectionWriter writer = header.getLabels().makeSectionWriter(in);
    List<SortKey<TypIconSet>> keys = new ArrayList<SortKey<TypIconSet>>();
    Sort sort = data.getSort();
    for (TypIconSet icon : data.getIcons()) {
        String label = icon.getLabel();
        if (label != null) {
            SortKey<TypIconSet> key = sort.createSortKey(icon, label);
            keys.add(key);
        }
    }
    Collections.sort(keys);
    // Offset 0 is reserved to mean no label.
    writer.put((byte) 0);
    for (SortKey<TypIconSet> key : keys) {
        int off = writer.position();
        TypIconSet icon = key.getObject();
        int type = icon.getTypeForFile();
        String label = icon.getLabel();
        if (label != null) {
            CharBuffer cb = CharBuffer.wrap(label);
            CharsetEncoder encoder = data.getEncoder();
            try {
                ByteBuffer buffer = encoder.encode(cb);
                writer.put(buffer);
                // If we succeeded then note offsets for indexes
                strToType.put(off, type);
                typeToStr.put(type, off);
            } catch (CharacterCodingException ignore) {
                String name = encoder.charset().name();
                throw new TypLabelException(name);
            }
            writer.put((byte) 0);
        }
    }
    Utils.closeFile(writer);
}
Also used : SectionWriter(uk.me.parabola.imgfmt.app.SectionWriter) ArrayList(java.util.ArrayList) CharBuffer(java.nio.CharBuffer) SortKey(uk.me.parabola.imgfmt.app.srt.SortKey) CharacterCodingException(java.nio.charset.CharacterCodingException) CharsetEncoder(java.nio.charset.CharsetEncoder) ByteBuffer(java.nio.ByteBuffer) Sort(uk.me.parabola.imgfmt.app.srt.Sort)

Example 7 with Sort

use of uk.me.parabola.imgfmt.app.srt.Sort in project mkgmap by openstreetmap.

the class Mdr5 method calcMdr20SortPos.

/**
 * Calculate a position when sorting by name, region, and country- This is used for MDR20.
 */
private void calcMdr20SortPos() {
    List<SortKey<Mdr5Record>> sortKeys = new ArrayList<>(allCities.size());
    Sort sort = getConfig().getSort();
    for (Mdr5Record m : allCities) {
        if (m.getName() == null)
            continue;
        // Sort by city name, region name, and country name .
        SortKey<Mdr5Record> sortKey = sort.createSortKey(m, m.getName());
        SortKey<Mdr5Record> regionKey = sort.createSortKey(null, m.getRegionName());
        SortKey<Mdr5Record> countryKey = sort.createSortKey(null, m.getCountryName());
        sortKey = new MultiSortKey<>(sortKey, regionKey, countryKey);
        sortKeys.add(sortKey);
    }
    Collections.sort(sortKeys);
    SortKey<Mdr5Record> lastKey = null;
    int pos = 0;
    for (SortKey<Mdr5Record> key : sortKeys) {
        Mdr5Record c = key.getObject();
        if (lastKey == null || key.compareTo(lastKey) != 0)
            pos++;
        c.setMdr20SortPos(pos);
        lastKey = key;
    }
}
Also used : ArrayList(java.util.ArrayList) Sort(uk.me.parabola.imgfmt.app.srt.Sort) SortKey(uk.me.parabola.imgfmt.app.srt.SortKey) MultiSortKey(uk.me.parabola.imgfmt.app.srt.MultiSortKey)

Example 8 with Sort

use of uk.me.parabola.imgfmt.app.srt.Sort in project mkgmap by openstreetmap.

the class Mdr5 method calcMdr21SortPos.

/**
 * Calculate a position when sorting by region- This is used for MDR21.
 */
private void calcMdr21SortPos() {
    List<SortKey<Mdr5Record>> sortKeys = new ArrayList<>(allCities.size());
    Sort sort = getConfig().getSort();
    for (Mdr5Record m : allCities) {
        if (m.getRegionName() == null)
            continue;
        // Sort by region name.
        sortKeys.add(sort.createSortKey(m, m.getRegionName()));
    }
    Collections.sort(sortKeys);
    SortKey<Mdr5Record> lastKey = null;
    int pos = 0;
    for (SortKey<Mdr5Record> key : sortKeys) {
        Mdr5Record c = key.getObject();
        if (lastKey == null || key.compareTo(lastKey) != 0)
            pos++;
        c.setMdr21SortPos(pos);
        lastKey = key;
    }
}
Also used : ArrayList(java.util.ArrayList) Sort(uk.me.parabola.imgfmt.app.srt.Sort) SortKey(uk.me.parabola.imgfmt.app.srt.SortKey) MultiSortKey(uk.me.parabola.imgfmt.app.srt.MultiSortKey)

Example 9 with Sort

use of uk.me.parabola.imgfmt.app.srt.Sort in project mkgmap by openstreetmap.

the class Mdr5 method preWriteImpl.

/**
 * Called after all cities to sort and number them.
 */
public void preWriteImpl() {
    localCitySize = Utils.numberToPointerSize(maxCityIndex + 1);
    List<SortKey<Mdr5Record>> sortKeys = new ArrayList<>(allCities.size());
    Sort sort = getConfig().getSort();
    for (Mdr5Record m : allCities) {
        if (m.getName() == null)
            continue;
        // Sort by city name, region name, country name and map index.
        SortKey<Mdr5Record> sortKey = sort.createSortKey(m, m.getName());
        SortKey<Mdr5Record> regionKey = sort.createSortKey(null, m.getRegionName());
        SortKey<Mdr5Record> countryKey = sort.createSortKey(null, m.getCountryName(), m.getMapIndex());
        sortKey = new MultiSortKey<>(sortKey, regionKey, countryKey);
        sortKeys.add(sortKey);
    }
    Collections.sort(sortKeys);
    Collator collator = getConfig().getSort().getCollator();
    int count = 0;
    Mdr5Record lastCity = null;
    // We need a common area to save the mdr20 values, since there can be multiple
    // city records with the same global city index
    int[] mdr20s = new int[sortKeys.size() + 1];
    int mdr20count = 0;
    for (SortKey<Mdr5Record> key : sortKeys) {
        Mdr5Record c = key.getObject();
        c.setMdr20set(mdr20s);
        if (!c.isSameByName(collator, lastCity))
            mdr20count++;
        c.setMdr20Index(mdr20count);
        if (c.isSameByMapAndName(collator, lastCity)) {
            c.setGlobalCityIndex(count);
        } else {
            count++;
            c.setGlobalCityIndex(count);
            cities.add(c);
            lastCity = c;
        }
    }
    // calculate positions for the different road indexes
    calcMdr20SortPos();
    calcMdr21SortPos();
    calcMdr22SortPos();
}
Also used : ArrayList(java.util.ArrayList) Sort(uk.me.parabola.imgfmt.app.srt.Sort) SortKey(uk.me.parabola.imgfmt.app.srt.SortKey) MultiSortKey(uk.me.parabola.imgfmt.app.srt.MultiSortKey) Collator(java.text.Collator)

Example 10 with Sort

use of uk.me.parabola.imgfmt.app.srt.Sort in project mkgmap by openstreetmap.

the class Mdr5 method calcMdr22SortPos.

/**
 * Calculate a position when sorting by country- This is used for MDR22.
 */
private void calcMdr22SortPos() {
    List<SortKey<Mdr5Record>> sortKeys = new ArrayList<>(allCities.size());
    Sort sort = getConfig().getSort();
    for (Mdr5Record m : allCities) {
        if (m.getCountryName() == null)
            continue;
        // Sort by country name .
        SortKey<Mdr5Record> countryKey = sort.createSortKey(m, m.getCountryName());
        sortKeys.add(countryKey);
    }
    Collections.sort(sortKeys);
    SortKey<Mdr5Record> lastKey = null;
    int pos = 0;
    for (SortKey<Mdr5Record> key : sortKeys) {
        Mdr5Record c = key.getObject();
        if (lastKey == null || key.compareTo(lastKey) != 0)
            pos++;
        c.setMdr22SortPos(pos);
        lastKey = key;
    }
}
Also used : ArrayList(java.util.ArrayList) Sort(uk.me.parabola.imgfmt.app.srt.Sort) SortKey(uk.me.parabola.imgfmt.app.srt.SortKey) MultiSortKey(uk.me.parabola.imgfmt.app.srt.MultiSortKey)

Aggregations

Sort (uk.me.parabola.imgfmt.app.srt.Sort)26 SortKey (uk.me.parabola.imgfmt.app.srt.SortKey)12 ArrayList (java.util.ArrayList)9 ExitException (uk.me.parabola.imgfmt.ExitException)4 MultiSortKey (uk.me.parabola.imgfmt.app.srt.MultiSortKey)4 IOException (java.io.IOException)3 Map (java.util.Map)3 FileExistsException (uk.me.parabola.imgfmt.FileExistsException)3 SRTFile (uk.me.parabola.imgfmt.app.srt.SRTFile)3 ImgChannel (uk.me.parabola.imgfmt.fs.ImgChannel)3 CharacterCodingException (java.nio.charset.CharacterCodingException)2 Collator (java.text.Collator)2 FileNotWritableException (uk.me.parabola.imgfmt.FileNotWritableException)2 FileSystemParam (uk.me.parabola.imgfmt.FileSystemParam)2 FileImgChannel (uk.me.parabola.imgfmt.sys.FileImgChannel)2 File (java.io.File)1 FileInputStream (java.io.FileInputStream)1 InputStream (java.io.InputStream)1 InputStreamReader (java.io.InputStreamReader)1 UnsupportedEncodingException (java.io.UnsupportedEncodingException)1