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);
}
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;
}
}
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;
}
}
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();
}
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;
}
}
Aggregations