Add name:* to address / poi revisit
This commit is contained in:
parent
91cd00aeeb
commit
6b844ce76e
24 changed files with 316 additions and 262 deletions
|
@ -67,15 +67,15 @@ public class BinaryInspector {
|
||||||
if(args.length == 1 && "test".equals(args[0])) {
|
if(args.length == 1 && "test".equals(args[0])) {
|
||||||
in.inspector(new String[]{
|
in.inspector(new String[]{
|
||||||
"-vpoi",
|
"-vpoi",
|
||||||
// "-vmap",// "-vmapobjects",
|
"-vmap", "-vmapobjects",
|
||||||
// "-vrouting",
|
// "-vrouting",
|
||||||
// "-vaddress", "-vcities","-vstreetgroups",
|
"-vaddress", "-vcities","-vstreetgroups",
|
||||||
// "-vstreets", "-vbuildings", "-vintersections",
|
"-vstreets", "-vbuildings", "-vintersections",
|
||||||
"-zoom=16",
|
"-zoom=16",
|
||||||
// "-bbox=1.74,51.17,1.75,51.16",
|
// "-bbox=1.74,51.17,1.75,51.16",
|
||||||
// "-vstats",
|
// "-vstats",
|
||||||
// "/Users/victorshcherb/osmand/maps/srtm/Netherlands_europe_2.srtm.obf"
|
"/Users/victorshcherb/osmand/osm-gen/Map.obf"
|
||||||
// "/Users/victorshcherb/osmand/maps/World_basemap_2.obf"
|
|
||||||
|
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
@ -566,6 +566,7 @@ public class BinaryInspector {
|
||||||
BinaryMapAddressReaderAdapter.VILLAGES_TYPE,
|
BinaryMapAddressReaderAdapter.VILLAGES_TYPE,
|
||||||
BinaryMapAddressReaderAdapter.POSTCODES_TYPE
|
BinaryMapAddressReaderAdapter.POSTCODES_TYPE
|
||||||
};
|
};
|
||||||
|
String lang = "ru";
|
||||||
|
|
||||||
for (int j = 0; j < cityType.length; j++) {
|
for (int j = 0; j < cityType.length; j++) {
|
||||||
int type = cityType[j];
|
int type = cityType[j];
|
||||||
|
@ -587,7 +588,7 @@ public class BinaryInspector {
|
||||||
int size = index.preloadStreets(c, null);
|
int size = index.preloadStreets(c, null);
|
||||||
List<Street> streets = new ArrayList<Street>(c.getStreets());
|
List<Street> streets = new ArrayList<Street>(c.getStreets());
|
||||||
print(MessageFormat.format("\t\t''{0}'' [{1,number,#}], {2,number,#} street(s) size {3,number,#} bytes",
|
print(MessageFormat.format("\t\t''{0}'' [{1,number,#}], {2,number,#} street(s) size {3,number,#} bytes",
|
||||||
new Object[]{c.getEnName(), c.getId(), streets.size(), size}));
|
new Object[]{c.getName(lang), c.getId(), streets.size(), size}));
|
||||||
if(!verbose.vstreets)
|
if(!verbose.vstreets)
|
||||||
{
|
{
|
||||||
println("");
|
println("");
|
||||||
|
@ -605,20 +606,20 @@ public class BinaryInspector {
|
||||||
final List<Street> intersections = t.getIntersectedStreets();
|
final List<Street> intersections = t.getIntersectedStreets();
|
||||||
|
|
||||||
println(MessageFormat.format("\t\t\t''{0}'' [{1,number,#}], {2,number,#} building(s), {3,number,#} intersections(s)",
|
println(MessageFormat.format("\t\t\t''{0}'' [{1,number,#}], {2,number,#} building(s), {3,number,#} intersections(s)",
|
||||||
new Object[]{t.getEnName(), t.getId(), buildings.size(), intersections.size()}));
|
new Object[]{t.getName(lang), t.getId(), buildings.size(), intersections.size()}));
|
||||||
|
|
||||||
if (buildings != null && !buildings.isEmpty() && verbose.vbuildings) {
|
if (buildings != null && !buildings.isEmpty() && verbose.vbuildings) {
|
||||||
println("\t\t\t\tBuildings:");
|
println("\t\t\t\tBuildings:");
|
||||||
for (Building b : buildings) {
|
for (Building b : buildings) {
|
||||||
println(MessageFormat.format("\t\t\t\t{0} [{1,number,#}]",
|
println(MessageFormat.format("\t\t\t\t{0} [{1,number,#}]",
|
||||||
new Object[]{b.getName(true), b.getId()}));
|
new Object[]{b.getName(lang), b.getId()}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (intersections != null && !intersections.isEmpty() && verbose.vintersections) {
|
if (intersections != null && !intersections.isEmpty() && verbose.vintersections) {
|
||||||
print("\t\t\t\tIntersects with:");
|
print("\t\t\t\tIntersects with:");
|
||||||
for (Street s : intersections) {
|
for (Street s : intersections) {
|
||||||
println("\t\t\t\t\t" + s.getEnName());
|
println("\t\t\t\t\t" + s.getName(lang));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ import gnu.trove.list.array.TIntArrayList;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import net.osmand.CollatorStringMatcher;
|
import net.osmand.CollatorStringMatcher;
|
||||||
|
@ -42,6 +43,7 @@ public class BinaryMapAddressReaderAdapter {
|
||||||
public static class AddressRegion extends BinaryIndexPart {
|
public static class AddressRegion extends BinaryIndexPart {
|
||||||
String enName;
|
String enName;
|
||||||
int indexNameOffset = -1;
|
int indexNameOffset = -1;
|
||||||
|
List<String> attributeTagsTable = new ArrayList<String>();
|
||||||
List<CitiesBlock> cities = new ArrayList<BinaryMapAddressReaderAdapter.CitiesBlock>();
|
List<CitiesBlock> cities = new ArrayList<BinaryMapAddressReaderAdapter.CitiesBlock>();
|
||||||
|
|
||||||
LatLon calculatedCenter = null;
|
LatLon calculatedCenter = null;
|
||||||
|
@ -96,6 +98,12 @@ public class BinaryMapAddressReaderAdapter {
|
||||||
case OsmandOdb.OsmAndAddressIndex.NAME_EN_FIELD_NUMBER :
|
case OsmandOdb.OsmAndAddressIndex.NAME_EN_FIELD_NUMBER :
|
||||||
region.enName = codedIS.readString();
|
region.enName = codedIS.readString();
|
||||||
break;
|
break;
|
||||||
|
case OsmandOdb.OsmAndAddressIndex.ATTRIBUTETAGSTABLE_FIELD_NUMBER :
|
||||||
|
int length2 = codedIS.readRawVarint32();
|
||||||
|
int oldLimit = codedIS.pushLimit(length2);
|
||||||
|
region.attributeTagsTable = map.readStringTable();
|
||||||
|
codedIS.popLimit(oldLimit);
|
||||||
|
break;
|
||||||
case OsmandOdb.OsmAndAddressIndex.CITIES_FIELD_NUMBER :
|
case OsmandOdb.OsmAndAddressIndex.CITIES_FIELD_NUMBER :
|
||||||
CitiesBlock block = new CitiesBlock();
|
CitiesBlock block = new CitiesBlock();
|
||||||
region.cities.add(block);
|
region.cities.add(block);
|
||||||
|
@ -131,7 +139,9 @@ public class BinaryMapAddressReaderAdapter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void readCities(List<City> cities, SearchRequest<City> resultMatcher, StringMatcher matcher, boolean useEn) throws IOException {
|
|
||||||
|
protected void readCities(List<City> cities, SearchRequest<City> resultMatcher, StringMatcher matcher,
|
||||||
|
List<String> additionalTagsTable) throws IOException {
|
||||||
while(true){
|
while(true){
|
||||||
int t = codedIS.readTag();
|
int t = codedIS.readTag();
|
||||||
int tag = WireFormat.getTagFieldNumber(t);
|
int tag = WireFormat.getTagFieldNumber(t);
|
||||||
|
@ -142,7 +152,7 @@ public class BinaryMapAddressReaderAdapter {
|
||||||
int fp = codedIS.getTotalBytesRead();
|
int fp = codedIS.getTotalBytesRead();
|
||||||
int length = codedIS.readRawVarint32();
|
int length = codedIS.readRawVarint32();
|
||||||
int oldLimit = codedIS.pushLimit(length);
|
int oldLimit = codedIS.pushLimit(length);
|
||||||
City c = readCityHeader(matcher, fp, useEn);
|
City c = readCityHeader(matcher, fp, additionalTagsTable);
|
||||||
if(c != null){
|
if(c != null){
|
||||||
if (resultMatcher == null || resultMatcher.publish(c)) {
|
if (resultMatcher == null || resultMatcher.publish(c)) {
|
||||||
cities.add(c);
|
cities.add(c);
|
||||||
|
@ -194,16 +204,30 @@ public class BinaryMapAddressReaderAdapter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected City readCityHeader(StringMatcher nameMatcher, int filePointer, boolean useEn) throws IOException{
|
protected City readCityHeader(StringMatcher matcher, int filePointer, List<String> additionalTagsTable) throws IOException{
|
||||||
int x = 0;
|
int x = 0;
|
||||||
int y = 0;
|
int y = 0;
|
||||||
City c = null;
|
City c = null;
|
||||||
boolean englishNameMatched = false;
|
LinkedList<String> additionalTags = null;
|
||||||
while(true){
|
while(true){
|
||||||
int t = codedIS.readTag();
|
int t = codedIS.readTag();
|
||||||
int tag = WireFormat.getTagFieldNumber(t);
|
int tag = WireFormat.getTagFieldNumber(t);
|
||||||
switch (tag) {
|
switch (tag) {
|
||||||
case 0:
|
case 0:
|
||||||
|
if(matcher != null) {
|
||||||
|
boolean matches = matcher.matches(c.getName());
|
||||||
|
if(!matches) {
|
||||||
|
for(String n : c.getAllNames()) {
|
||||||
|
matches = matcher.matches(n);
|
||||||
|
if(matches) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!matches ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
return c;
|
return c;
|
||||||
case OsmandOdb.CityIndex.CITY_TYPE_FIELD_NUMBER :
|
case OsmandOdb.CityIndex.CITY_TYPE_FIELD_NUMBER :
|
||||||
int type = codedIS.readUInt32();
|
int type = codedIS.readUInt32();
|
||||||
|
@ -211,30 +235,31 @@ public class BinaryMapAddressReaderAdapter {
|
||||||
break;
|
break;
|
||||||
case OsmandOdb.CityIndex.ID_FIELD_NUMBER :
|
case OsmandOdb.CityIndex.ID_FIELD_NUMBER :
|
||||||
c.setId(codedIS.readUInt64());
|
c.setId(codedIS.readUInt64());
|
||||||
if(nameMatcher != null && useEn && !englishNameMatched){
|
break;
|
||||||
codedIS.skipRawBytes(codedIS.getBytesUntilLimit());
|
case OsmandOdb.CityIndex.ATTRIBUTETAGIDS_FIELD_NUMBER :
|
||||||
return null;
|
int tgid = codedIS.readUInt32();
|
||||||
|
if(additionalTags == null) {
|
||||||
|
additionalTags = new LinkedList<String>();
|
||||||
|
if(additionalTagsTable != null && tgid < additionalTagsTable.size()) {
|
||||||
|
additionalTags.add(additionalTagsTable.get(tgid));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case OsmandOdb.CityIndex.ATTRIBUTEVALUES_FIELD_NUMBER:
|
||||||
|
String nm = codedIS.readString();
|
||||||
|
if(additionalTags != null && additionalTags.size() > 0) {
|
||||||
|
String tg = additionalTags.pollFirst();
|
||||||
|
if(tg.startsWith("name:")) {
|
||||||
|
c.setName(tg.substring("name:".length()), nm);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case OsmandOdb.CityIndex.NAME_EN_FIELD_NUMBER :
|
case OsmandOdb.CityIndex.NAME_EN_FIELD_NUMBER :
|
||||||
String enName = codedIS.readString();
|
String enName = codedIS.readString();
|
||||||
if (nameMatcher != null && enName.length() > 0 && nameMatcher.matches(enName)) {
|
|
||||||
englishNameMatched = true;
|
|
||||||
}
|
|
||||||
c.setEnName(enName);
|
c.setEnName(enName);
|
||||||
break;
|
break;
|
||||||
case OsmandOdb.CityIndex.NAME_FIELD_NUMBER :
|
case OsmandOdb.CityIndex.NAME_FIELD_NUMBER :
|
||||||
String name = codedIS.readString();
|
String name = codedIS.readString();
|
||||||
if(nameMatcher != null){
|
|
||||||
if(!useEn){
|
|
||||||
if(!nameMatcher.matches(name)) {
|
|
||||||
codedIS.skipRawBytes(codedIS.getBytesUntilLimit());
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
} else if(nameMatcher.matches(Junidecode.unidecode(name))){
|
|
||||||
englishNameMatched = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(c == null) {
|
if(c == null) {
|
||||||
c = City.createPostcode(name);
|
c = City.createPostcode(name);
|
||||||
}
|
}
|
||||||
|
@ -246,9 +271,6 @@ public class BinaryMapAddressReaderAdapter {
|
||||||
case OsmandOdb.CityIndex.Y_FIELD_NUMBER :
|
case OsmandOdb.CityIndex.Y_FIELD_NUMBER :
|
||||||
y = codedIS.readUInt32();
|
y = codedIS.readUInt32();
|
||||||
c.setLocation(MapUtils.get31LatitudeY(y), MapUtils.get31LongitudeX(x));
|
c.setLocation(MapUtils.get31LatitudeY(y), MapUtils.get31LongitudeX(x));
|
||||||
if(c.getEnName().length() == 0){
|
|
||||||
c.setEnName(Junidecode.unidecode(c.getName()));
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case OsmandOdb.CityIndex.SHIFTTOCITYBLOCKINDEX_FIELD_NUMBER :
|
case OsmandOdb.CityIndex.SHIFTTOCITYBLOCKINDEX_FIELD_NUMBER :
|
||||||
int offset = readInt();
|
int offset = readInt();
|
||||||
|
@ -274,9 +296,6 @@ public class BinaryMapAddressReaderAdapter {
|
||||||
if(loadLocation){
|
if(loadLocation){
|
||||||
s.setLocation(MapUtils.getLatitudeFromTile(24, y), MapUtils.getLongitudeFromTile(24, x));
|
s.setLocation(MapUtils.getLatitudeFromTile(24, y), MapUtils.getLongitudeFromTile(24, x));
|
||||||
}
|
}
|
||||||
if(s.getEnName().length() == 0){
|
|
||||||
s.setEnName(Junidecode.unidecode(s.getName()));
|
|
||||||
}
|
|
||||||
return s;
|
return s;
|
||||||
case OsmandOdb.StreetIndex.ID_FIELD_NUMBER :
|
case OsmandOdb.StreetIndex.ID_FIELD_NUMBER :
|
||||||
s.setId(codedIS.readUInt64());
|
s.setId(codedIS.readUInt64());
|
||||||
|
@ -347,9 +366,6 @@ public class BinaryMapAddressReaderAdapter {
|
||||||
switch (tag) {
|
switch (tag) {
|
||||||
case 0:
|
case 0:
|
||||||
s.setLocation(MapUtils.getLatitudeFromTile(24, y), MapUtils.getLongitudeFromTile(24, x));
|
s.setLocation(MapUtils.getLatitudeFromTile(24, y), MapUtils.getLongitudeFromTile(24, x));
|
||||||
if(s.getEnName().length() == 0){
|
|
||||||
s.setEnName(Junidecode.unidecode(s.getName()));
|
|
||||||
}
|
|
||||||
return s;
|
return s;
|
||||||
case OsmandOdb.BuildingIndex.ID_FIELD_NUMBER :
|
case OsmandOdb.BuildingIndex.ID_FIELD_NUMBER :
|
||||||
s.setId(codedIS.readUInt64());
|
s.setId(codedIS.readUInt64());
|
||||||
|
@ -389,9 +405,6 @@ public class BinaryMapAddressReaderAdapter {
|
||||||
if(x2 != 0 && y2 != 0) {
|
if(x2 != 0 && y2 != 0) {
|
||||||
b.setLatLon2(new LatLon(MapUtils.getLatitudeFromTile(24, y2), MapUtils.getLongitudeFromTile(24, x2)));
|
b.setLatLon2(new LatLon(MapUtils.getLatitudeFromTile(24, y2), MapUtils.getLongitudeFromTile(24, x2)));
|
||||||
}
|
}
|
||||||
if(b.getEnName().length() == 0){
|
|
||||||
b.setEnName(Junidecode.unidecode(b.getName()));
|
|
||||||
}
|
|
||||||
return b;
|
return b;
|
||||||
case OsmandOdb.BuildingIndex.ID_FIELD_NUMBER :
|
case OsmandOdb.BuildingIndex.ID_FIELD_NUMBER :
|
||||||
b.setId(codedIS.readUInt64());
|
b.setId(codedIS.readUInt64());
|
||||||
|
@ -508,7 +521,7 @@ public class BinaryMapAddressReaderAdapter {
|
||||||
codedIS.seek(list.get(j + 1));
|
codedIS.seek(list.get(j + 1));
|
||||||
int len = codedIS.readRawVarint32();
|
int len = codedIS.readRawVarint32();
|
||||||
int old = codedIS.pushLimit(len);
|
int old = codedIS.pushLimit(len);
|
||||||
obj = readCityHeader(null, list.get(j + 1), false);
|
obj = readCityHeader(null, list.get(j + 1), null);
|
||||||
codedIS.popLimit(old);
|
codedIS.popLimit(old);
|
||||||
}
|
}
|
||||||
if (obj != null) {
|
if (obj != null) {
|
||||||
|
@ -519,8 +532,16 @@ public class BinaryMapAddressReaderAdapter {
|
||||||
Street s = new Street(obj);
|
Street s = new Street(obj);
|
||||||
readStreet(s, null, false, MapUtils.get31TileNumberX(l.getLongitude()) >> 7,
|
readStreet(s, null, false, MapUtils.get31TileNumberX(l.getLongitude()) >> 7,
|
||||||
MapUtils.get31TileNumberY(l.getLatitude()) >> 7, obj.isPostcode() ? obj.getName() : null);
|
MapUtils.get31TileNumberY(l.getLatitude()) >> 7, obj.isPostcode() ? obj.getName() : null);
|
||||||
|
boolean matches = matcher.matches(s.getName());
|
||||||
if (matcher.matches(s.getName())) {
|
if(!matches) {
|
||||||
|
for(String n : s.getAllNames()) {
|
||||||
|
matches = matcher.matches(n);
|
||||||
|
if(matches) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (matches) {
|
||||||
req.publish(s);
|
req.publish(s);
|
||||||
}
|
}
|
||||||
codedIS.popLimit(old);
|
codedIS.popLimit(old);
|
||||||
|
@ -532,7 +553,7 @@ public class BinaryMapAddressReaderAdapter {
|
||||||
codedIS.seek(list.get(j));
|
codedIS.seek(list.get(j));
|
||||||
int len = codedIS.readRawVarint32();
|
int len = codedIS.readRawVarint32();
|
||||||
int old = codedIS.pushLimit(len);
|
int old = codedIS.pushLimit(len);
|
||||||
City obj = readCityHeader(matcher, list.get(j), false);
|
City obj = readCityHeader(matcher, list.get(j), null);
|
||||||
if (obj != null) {
|
if (obj != null) {
|
||||||
req.publish(obj);
|
req.publish(obj);
|
||||||
}
|
}
|
||||||
|
|
|
@ -554,9 +554,9 @@ public class BinaryMapIndexReader {
|
||||||
|
|
||||||
public List<City> getCities(String region, SearchRequest<City> resultMatcher,
|
public List<City> getCities(String region, SearchRequest<City> resultMatcher,
|
||||||
int cityType) throws IOException {
|
int cityType) throws IOException {
|
||||||
return getCities(region, resultMatcher, null, false, cityType);
|
return getCities(region, resultMatcher, null, null, cityType);
|
||||||
}
|
}
|
||||||
public List<City> getCities(String region, SearchRequest<City> resultMatcher, StringMatcher matcher, boolean useEn,
|
public List<City> getCities(String region, SearchRequest<City> resultMatcher, StringMatcher matcher, String lang,
|
||||||
int cityType) throws IOException {
|
int cityType) throws IOException {
|
||||||
List<City> cities = new ArrayList<City>();
|
List<City> cities = new ArrayList<City>();
|
||||||
AddressRegion r = getRegionByName(region);
|
AddressRegion r = getRegionByName(region);
|
||||||
|
@ -567,7 +567,7 @@ public class BinaryMapIndexReader {
|
||||||
if(block.type == cityType) {
|
if(block.type == cityType) {
|
||||||
codedIS.seek(block.filePointer);
|
codedIS.seek(block.filePointer);
|
||||||
int old = codedIS.pushLimit(block.length);
|
int old = codedIS.pushLimit(block.length);
|
||||||
addressAdapter.readCities(cities, resultMatcher, matcher, useEn);
|
addressAdapter.readCities(cities, resultMatcher, matcher, r.attributeTagsTable);
|
||||||
codedIS.popLimit(old);
|
codedIS.popLimit(old);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -576,16 +576,16 @@ public class BinaryMapIndexReader {
|
||||||
|
|
||||||
public List<City> getCities(AddressRegion region, SearchRequest<City> resultMatcher,
|
public List<City> getCities(AddressRegion region, SearchRequest<City> resultMatcher,
|
||||||
int cityType) throws IOException {
|
int cityType) throws IOException {
|
||||||
return getCities(region, resultMatcher, null, false, cityType);
|
return getCities(region, resultMatcher, null, cityType);
|
||||||
}
|
}
|
||||||
public List<City> getCities(AddressRegion region, SearchRequest<City> resultMatcher, StringMatcher matcher, boolean useEn,
|
public List<City> getCities(AddressRegion region, SearchRequest<City> resultMatcher, StringMatcher matcher,
|
||||||
int cityType) throws IOException {
|
int cityType) throws IOException {
|
||||||
List<City> cities = new ArrayList<City>();
|
List<City> cities = new ArrayList<City>();
|
||||||
for(CitiesBlock block : region.cities) {
|
for(CitiesBlock block : region.cities) {
|
||||||
if(block.type == cityType) {
|
if(block.type == cityType) {
|
||||||
codedIS.seek(block.filePointer);
|
codedIS.seek(block.filePointer);
|
||||||
int old = codedIS.pushLimit(block.length);
|
int old = codedIS.pushLimit(block.length);
|
||||||
addressAdapter.readCities(cities, resultMatcher, matcher, useEn);
|
addressAdapter.readCities(cities, resultMatcher, matcher, region.attributeTagsTable);
|
||||||
codedIS.popLimit(old);
|
codedIS.popLimit(old);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2272,7 +2272,7 @@ public class BinaryMapIndexReader {
|
||||||
reader.preloadBuildings(s, buildAddressRequest((ResultMatcher<Building>) null));
|
reader.preloadBuildings(s, buildAddressRequest((ResultMatcher<Building>) null));
|
||||||
buildings += s.getBuildings().size();
|
buildings += s.getBuildings().size();
|
||||||
}
|
}
|
||||||
println(c.getName() + " " + c.getLocation() + " " + c.getStreets().size() + " " + buildings + " " + c.getEnName());
|
println(c.getName() + " " + c.getLocation() + " " + c.getStreets().size() + " " + buildings + " " + c.getEnName(true));
|
||||||
}
|
}
|
||||||
// int[] count = new int[1];
|
// int[] count = new int[1];
|
||||||
List<City> villages = reader.getCities(reg, buildAddressRequest((ResultMatcher<City>) null), BinaryMapAddressReaderAdapter.VILLAGES_TYPE);
|
List<City> villages = reader.getCities(reg, buildAddressRequest((ResultMatcher<City>) null), BinaryMapAddressReaderAdapter.VILLAGES_TYPE);
|
||||||
|
|
|
@ -5,10 +5,7 @@ import gnu.trove.list.array.TIntArrayList;
|
||||||
import gnu.trove.map.hash.TIntLongHashMap;
|
import gnu.trove.map.hash.TIntLongHashMap;
|
||||||
import gnu.trove.set.hash.TLongHashSet;
|
import gnu.trove.set.hash.TLongHashSet;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.ByteArrayInputStream;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
@ -16,7 +13,6 @@ import java.util.Iterator;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.zip.GZIPInputStream;
|
|
||||||
|
|
||||||
import net.osmand.Collator;
|
import net.osmand.Collator;
|
||||||
import net.osmand.CollatorStringMatcher;
|
import net.osmand.CollatorStringMatcher;
|
||||||
|
@ -548,13 +544,13 @@ public class BinaryMapPoiReaderAdapter {
|
||||||
Amenity am = readPoiPoint(0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE, x, y, zoom, req, region, false);
|
Amenity am = readPoiPoint(0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE, x, y, zoom, req, region, false);
|
||||||
codedIS.popLimit(oldLim);
|
codedIS.popLimit(oldLim);
|
||||||
if (am != null) {
|
if (am != null) {
|
||||||
boolean matches = matcher.matches(am.getName(false).toLowerCase()) || matcher.matches(am.getName(true).toLowerCase());
|
boolean matches = matcher.matches(am.getName().toLowerCase()) ||
|
||||||
|
matcher.matches(am.getEnName(true).toLowerCase());
|
||||||
if (!matches) {
|
if (!matches) {
|
||||||
Iterator<Entry<String, String>> it = am.getAdditionalInfo().entrySet().iterator();
|
for(String s : am.getAllNames()) {
|
||||||
while (!matches && it.hasNext()) {
|
matches = matcher.matches(s.toLowerCase());
|
||||||
Entry<String, String> n = it.next();
|
if(matches) {
|
||||||
if (n.getKey().startsWith("name:")) {
|
break;
|
||||||
matches = matcher.matches(n.getValue().toLowerCase());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -663,9 +659,6 @@ public class BinaryMapPoiReaderAdapter {
|
||||||
}
|
}
|
||||||
switch (tag) {
|
switch (tag) {
|
||||||
case 0:
|
case 0:
|
||||||
if(Algorithms.isEmpty(am.getEnName())){
|
|
||||||
am.setEnName(Junidecode.unidecode(am.getName()));
|
|
||||||
}
|
|
||||||
req.numberOfAcceptedObjects++;
|
req.numberOfAcceptedObjects++;
|
||||||
if (req.radius > 0) {
|
if (req.radius > 0) {
|
||||||
LatLon loc = am.getLocation();
|
LatLon loc = am.getLocation();
|
||||||
|
|
|
@ -346,10 +346,10 @@ public class BinaryMapTransportReaderAdapter {
|
||||||
if(dataObject.getName().length() > 0){
|
if(dataObject.getName().length() > 0){
|
||||||
dataObject.setName(stringTable.get(dataObject.getName().charAt(0)));
|
dataObject.setName(stringTable.get(dataObject.getName().charAt(0)));
|
||||||
}
|
}
|
||||||
if(dataObject.getEnName().length() > 0){
|
if(dataObject.getEnName(false).length() > 0){
|
||||||
dataObject.setEnName(stringTable.get(dataObject.getEnName().charAt(0)));
|
dataObject.setEnName(stringTable.get(dataObject.getEnName(false).charAt(0)));
|
||||||
}
|
}
|
||||||
if(dataObject.getName().length() > 0 && dataObject.getEnName().length() == 0){
|
if(dataObject.getName().length() > 0 && dataObject.getName("en").length() == 0){
|
||||||
dataObject.setEnName(Junidecode.unidecode(dataObject.getName()));
|
dataObject.setEnName(Junidecode.unidecode(dataObject.getName()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -371,11 +371,8 @@ public class BinaryMapTransportReaderAdapter {
|
||||||
if (s.getName().length() > 0) {
|
if (s.getName().length() > 0) {
|
||||||
s.setName(stringTable.get(s.getName().charAt(0)));
|
s.setName(stringTable.get(s.getName().charAt(0)));
|
||||||
}
|
}
|
||||||
if (s.getEnName().length() > 0) {
|
if (s.getEnName(false).length() > 0) {
|
||||||
s.setEnName(stringTable.get(s.getEnName().charAt(0)));
|
s.setEnName(stringTable.get(s.getEnName(false).charAt(0)));
|
||||||
}
|
|
||||||
if (s.getEnName().length() == 0) {
|
|
||||||
s.setEnName(Junidecode.unidecode(s.getName()));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -445,7 +442,7 @@ public class BinaryMapTransportReaderAdapter {
|
||||||
switch (tag) {
|
switch (tag) {
|
||||||
case 0:
|
case 0:
|
||||||
dataObject.setReferencesToRoutes(req.cacheTypes.toArray());
|
dataObject.setReferencesToRoutes(req.cacheTypes.toArray());
|
||||||
if(dataObject.getEnName().length() == 0){
|
if(dataObject.getName("en").length() == 0){
|
||||||
dataObject.setEnName(Junidecode.unidecode(dataObject.getName()));
|
dataObject.setEnName(Junidecode.unidecode(dataObject.getName()));
|
||||||
}
|
}
|
||||||
return dataObject;
|
return dataObject;
|
||||||
|
|
|
@ -7,9 +7,12 @@ import java.io.InputStreamReader;
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.zip.GZIPInputStream;
|
import java.util.zip.GZIPInputStream;
|
||||||
|
|
||||||
import net.osmand.Location;
|
import net.osmand.Location;
|
||||||
|
@ -107,8 +110,15 @@ public class Amenity extends MapObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setAdditionalInfo(Map<String, String> additionalInfo) {
|
public void setAdditionalInfo(Map<String, String> additionalInfo) {
|
||||||
this.additionalInfo = additionalInfo;
|
this.additionalInfo = null;
|
||||||
openingHours = additionalInfo.get(OPENING_HOURS);
|
openingHours = null;
|
||||||
|
if(additionalInfo != null) {
|
||||||
|
Iterator<Entry<String, String>> it = additionalInfo.entrySet().iterator();
|
||||||
|
while(it.hasNext()) {
|
||||||
|
Entry<String, String> e = it.next();
|
||||||
|
setAdditionalInfo(e.getKey(), e.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRoutePoint(AmenityRoutePoint routePoint) {
|
public void setRoutePoint(AmenityRoutePoint routePoint) {
|
||||||
|
@ -120,14 +130,16 @@ public class Amenity extends MapObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setAdditionalInfo(String tag, String value) {
|
public void setAdditionalInfo(String tag, String value) {
|
||||||
if(this.additionalInfo == null){
|
|
||||||
this.additionalInfo = new LinkedHashMap<String, String>();
|
|
||||||
}
|
|
||||||
if("name".equals(tag)) {
|
if("name".equals(tag)) {
|
||||||
setName(value);
|
setName(value);
|
||||||
} else if("name:en".equals(tag)) {
|
} else if("name:en".equals(tag)) {
|
||||||
setEnName(value);
|
setEnName(value);
|
||||||
|
} else if(tag.startsWith("name:")) {
|
||||||
|
setName(tag.substring("name:".length()), value);
|
||||||
} else {
|
} else {
|
||||||
|
if(this.additionalInfo == null){
|
||||||
|
this.additionalInfo = new LinkedHashMap<String, String>();
|
||||||
|
}
|
||||||
this.additionalInfo.put(tag, value);
|
this.additionalInfo.put(tag, value);
|
||||||
if (OPENING_HOURS.equals(tag)) {
|
if (OPENING_HOURS.equals(tag)) {
|
||||||
this.openingHours = value;
|
this.openingHours = value;
|
||||||
|
@ -187,29 +199,6 @@ public class Amenity extends MapObject {
|
||||||
return lng;
|
return lng;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getName(String lang) {
|
|
||||||
if (lang != null) {
|
|
||||||
String translateName;
|
|
||||||
if (lang.equals("en")) {
|
|
||||||
translateName = getEnName();
|
|
||||||
} else {
|
|
||||||
translateName = getAdditionalInfo("name:" + lang);
|
|
||||||
}
|
|
||||||
if (!Algorithms.isEmpty(translateName)) {
|
|
||||||
return translateName;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!Algorithms.isEmpty(getName())) {
|
|
||||||
return getName();
|
|
||||||
}
|
|
||||||
for (String nm : getAdditionalInfo().keySet()) {
|
|
||||||
if (nm.startsWith("name:")) {
|
|
||||||
return getAdditionalInfo(nm);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<String> getNames(String tag, String defTag) {
|
public List<String> getNames(String tag, String defTag) {
|
||||||
List<String> l = new ArrayList<String>();
|
List<String> l = new ArrayList<String>();
|
||||||
for (String nm : getAdditionalInfo().keySet()) {
|
for (String nm : getAdditionalInfo().keySet()) {
|
||||||
|
|
|
@ -72,12 +72,12 @@ public class Building extends MapObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getName(boolean en) {
|
public String getName(String lang) {
|
||||||
String fname = super.getName(en);
|
String fname = super.getName(lang);
|
||||||
if(interpolationInterval !=0){
|
if (interpolationInterval != 0) {
|
||||||
return fname+"-"+name2 +" (+"+interpolationInterval+") ";
|
return fname + "-" + name2 + " (+" + interpolationInterval + ") ";
|
||||||
} else if(interpolationType != null) {
|
} else if (interpolationType != null) {
|
||||||
return fname+"-"+name2 +" ("+interpolationType.toString().toLowerCase()+") ";
|
return fname + "-" + name2 + " (" + interpolationType.toString().toLowerCase() + ") ";
|
||||||
}
|
}
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package net.osmand.data;
|
package net.osmand.data;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
|
|
||||||
|
@ -41,9 +43,7 @@ public class City extends MapObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
private CityType type = null;
|
private CityType type = null;
|
||||||
// Be attentive ! Working with street names ignoring case
|
private List<Street> listOfStreets = new ArrayList<Street>();
|
||||||
private Map<String, Street> streets = new TreeMap<String, Street>(OsmAndCollator.primaryCollator());
|
|
||||||
private String isin = null;
|
|
||||||
private String postcode = null;
|
private String postcode = null;
|
||||||
private City closestCity = null;
|
private City closestCity = null;
|
||||||
|
|
||||||
|
@ -73,18 +73,6 @@ public class City extends MapObject {
|
||||||
return type == null;
|
return type == null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isEmptyWithStreets() {
|
|
||||||
return streets.isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public Street unregisterStreet(String name) {
|
|
||||||
return streets.remove(name.toLowerCase());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void removeAllStreets() {
|
|
||||||
streets.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getPostcode() {
|
public String getPostcode() {
|
||||||
return postcode;
|
return postcode;
|
||||||
|
@ -102,24 +90,13 @@ public class City extends MapObject {
|
||||||
this.closestCity = closestCity;
|
this.closestCity = closestCity;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Street registerStreet(Street street, boolean en) {
|
|
||||||
String name = en ? street.getEnName() : street.getName();
|
public void registerStreet(Street street) {
|
||||||
name = name.toLowerCase();
|
listOfStreets.add(street);
|
||||||
if (!Algorithms.isEmpty(name)) {
|
|
||||||
if (!streets.containsKey(name)) {
|
|
||||||
return streets.put(name, street);
|
|
||||||
} else {
|
|
||||||
// try to merge streets
|
|
||||||
Street prev = streets.get(name);
|
|
||||||
prev.mergeWith(street);
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Street registerStreet(Street street) {
|
public void unregisterStreet(Street candidate) {
|
||||||
return registerStreet(street, false);
|
listOfStreets.remove(candidate);
|
||||||
}
|
}
|
||||||
|
|
||||||
public CityType getType() {
|
public CityType getType() {
|
||||||
|
@ -127,12 +104,10 @@ public class City extends MapObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Collection<Street> getStreets() {
|
public Collection<Street> getStreets() {
|
||||||
return streets.values();
|
return listOfStreets;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Street getStreet(String name) {
|
|
||||||
return streets.get(name.toLowerCase());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
|
@ -142,8 +117,25 @@ public class City extends MapObject {
|
||||||
return "City [" + type + "] " + getName(); //$NON-NLS-1$ //$NON-NLS-2$
|
return "City [" + type + "] " + getName(); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Street getStreetByName(String name) {
|
||||||
|
for(Street s : listOfStreets) {
|
||||||
|
if(s.getName().equalsIgnoreCase(name)) {
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// GENERATION
|
||||||
|
// Be attentive ! Working with street names ignoring case
|
||||||
|
private String isin = null;
|
||||||
|
|
||||||
|
|
||||||
public void setIsin(String isin) {
|
public void setIsin(String isin) {
|
||||||
this.isin = isin;
|
this.isin = isin;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,15 +2,25 @@ package net.osmand.data;
|
||||||
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
import net.osmand.Collator;
|
import net.osmand.Collator;
|
||||||
import net.osmand.OsmAndCollator;
|
import net.osmand.OsmAndCollator;
|
||||||
|
import net.osmand.util.Algorithms;
|
||||||
|
import net.sf.junidecode.Junidecode;
|
||||||
|
|
||||||
|
|
||||||
public abstract class MapObject implements Comparable<MapObject>, Serializable {
|
public abstract class MapObject implements Comparable<MapObject>, Serializable {
|
||||||
protected String name = null;
|
protected String name = null;
|
||||||
protected String enName = null;
|
protected String enName = null;
|
||||||
|
protected Map<String, String> names = null;
|
||||||
protected LatLon location = null;
|
protected LatLon location = null;
|
||||||
protected int fileOffset = 0;
|
protected int fileOffset = 0;
|
||||||
protected Long id = null;
|
protected Long id = null;
|
||||||
|
@ -26,14 +36,6 @@ public abstract class MapObject implements Comparable<MapObject>, Serializable {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getName(boolean en){
|
|
||||||
if(en){
|
|
||||||
return getEnName();
|
|
||||||
} else {
|
|
||||||
return getName();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
if (this.name != null) {
|
if (this.name != null) {
|
||||||
return this.name;
|
return this.name;
|
||||||
|
@ -45,9 +47,77 @@ public abstract class MapObject implements Comparable<MapObject>, Serializable {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getEnName() {
|
public void setName(String lang, String name) {
|
||||||
if(this.enName != null){
|
if(names == null) {
|
||||||
|
names = new HashMap<String, String>();
|
||||||
|
|
||||||
|
}
|
||||||
|
names.put(lang, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getAllNames() {
|
||||||
|
List<String> l = new ArrayList<String>();
|
||||||
|
if(!Algorithms.isEmpty(enName)) {
|
||||||
|
l.add(enName);
|
||||||
|
}
|
||||||
|
if(names != null) {
|
||||||
|
l.addAll(names.values());
|
||||||
|
}
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void copyNames(MapObject s) {
|
||||||
|
if(Algorithms.isEmpty(name)) {
|
||||||
|
name = s.name;
|
||||||
|
}
|
||||||
|
if(Algorithms.isEmpty(enName)) {
|
||||||
|
enName = s.enName;
|
||||||
|
}
|
||||||
|
if(names == null) {
|
||||||
|
if(s.names != null) {
|
||||||
|
names = new HashMap<String, String>(s.names);
|
||||||
|
}
|
||||||
|
} else if(s.names != null){
|
||||||
|
Iterator<Entry<String, String>> it = s.names.entrySet().iterator();
|
||||||
|
while(it.hasNext()) {
|
||||||
|
Entry<String, String> e = it.next();
|
||||||
|
if(Algorithms.isEmpty(names.get(e.getKey()))) {
|
||||||
|
names.put(e.getKey(), e.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName(String lang) {
|
||||||
|
return getName(lang, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName(String lang, boolean transliterate) {
|
||||||
|
if (lang != null) {
|
||||||
|
if (lang.equals("en")) {
|
||||||
|
// ignore transliterate option here for backward compatibility
|
||||||
|
return getEnName(true);
|
||||||
|
} else {
|
||||||
|
// get name
|
||||||
|
if(names != null) {
|
||||||
|
String nm = names.get(lang);
|
||||||
|
if(!Algorithms.isEmpty(lang)) {
|
||||||
|
return nm;
|
||||||
|
}
|
||||||
|
if(transliterate) {
|
||||||
|
return Junidecode.unidecode(getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEnName(boolean transliterate) {
|
||||||
|
if(!Algorithms.isEmpty(enName)){
|
||||||
return this.enName;
|
return this.enName;
|
||||||
|
} else if(!Algorithms.isEmpty(getName()) && transliterate){
|
||||||
|
return Junidecode.unidecode(getName());
|
||||||
}
|
}
|
||||||
return ""; //$NON-NLS-1$
|
return ""; //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
|
@ -108,19 +178,15 @@ public abstract class MapObject implements Comparable<MapObject>, Serializable {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class MapObjectComparator implements Comparator<MapObject>{
|
public static class MapObjectComparator implements Comparator<MapObject>{
|
||||||
private final boolean en;
|
private final String l;
|
||||||
Collator collator = OsmAndCollator.primaryCollator();
|
Collator collator = OsmAndCollator.primaryCollator();
|
||||||
public MapObjectComparator(boolean en){
|
public MapObjectComparator(String lang){
|
||||||
this.en = en;
|
this.l = lang;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int compare(MapObject o1, MapObject o2) {
|
public int compare(MapObject o1, MapObject o2) {
|
||||||
if(en){
|
return collator.compare(o1.getName(l), o2.getName(l));
|
||||||
return collator.compare(o1.getEnName(), o2.getEnName());
|
|
||||||
} else {
|
|
||||||
return collator.compare(o1.getName(), o2.getName());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -49,29 +49,7 @@ public class Street extends MapObject {
|
||||||
return buildings;
|
return buildings;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setName(String name) {
|
|
||||||
if (name.equals(getName())) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (city != null && city.getStreet(getName()) == this) {
|
|
||||||
city.unregisterStreet(getName());
|
|
||||||
super.setName(name);
|
|
||||||
Street s = city.registerStreet(this);
|
|
||||||
} else {
|
|
||||||
super.setName(name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getNameWithoutCityPart(boolean en) {
|
|
||||||
String nm = getName(en);
|
|
||||||
int t = nm.lastIndexOf('(');
|
|
||||||
if(t > 0) {
|
|
||||||
return nm.substring(0, t);
|
|
||||||
}
|
|
||||||
return nm;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public City getCity() {
|
public City getCity() {
|
||||||
return city;
|
return city;
|
||||||
|
@ -95,8 +73,22 @@ public class Street extends MapObject {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// GENERATION
|
||||||
|
|
||||||
|
|
||||||
public void mergeWith(Street street) {
|
public void mergeWith(Street street) {
|
||||||
buildings.addAll(street.getBuildings());
|
buildings.addAll(street.getBuildings());
|
||||||
|
copyNames(street);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getNameWithoutCityPart(String lang) {
|
||||||
|
String nm = getName(lang);
|
||||||
|
int t = nm.lastIndexOf('(');
|
||||||
|
if (t > 0) {
|
||||||
|
return nm.substring(0, t);
|
||||||
|
}
|
||||||
|
return nm;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,11 +23,16 @@ public class EntityParser {
|
||||||
if (mo.getName().length() == 0) {
|
if (mo.getName().length() == 0) {
|
||||||
mo.setName(e.getTag(OSMTagKey.NAME));
|
mo.setName(e.getTag(OSMTagKey.NAME));
|
||||||
}
|
}
|
||||||
if (mo.getEnName().length() == 0) {
|
if (mo.getEnName(false).length() == 0) {
|
||||||
mo.setEnName(e.getTag(OSMTagKey.NAME_EN));
|
mo.setEnName(e.getTag(OSMTagKey.NAME_EN));
|
||||||
if (mo.getName().length() == 0) {
|
|
||||||
mo.setName(mo.getEnName());
|
|
||||||
}
|
}
|
||||||
|
for(String ts : e.getTags().keySet()) {
|
||||||
|
if(ts.startsWith(OSMTagKey.NAME + ":") && !ts.equals(OSMTagKey.NAME_EN)) {
|
||||||
|
mo.setName(ts.substring((OSMTagKey.NAME + ":").length()), e.getTag(ts));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (mo.getName().length() == 0) {
|
||||||
|
mo.setName(mo.getEnName(false));
|
||||||
}
|
}
|
||||||
if (mo.getLocation() == null) {
|
if (mo.getLocation() == null) {
|
||||||
LatLon l = null;
|
LatLon l = null;
|
||||||
|
|
|
@ -921,11 +921,11 @@
|
||||||
<string name="pref_raster_map">Настройки онлайн карт</string>
|
<string name="pref_raster_map">Настройки онлайн карт</string>
|
||||||
<string name="pref_vector_map">Настройки локальных карт</string>
|
<string name="pref_vector_map">Настройки локальных карт</string>
|
||||||
<string name="delete_confirmation_msg">Удалить %1$s?</string>
|
<string name="delete_confirmation_msg">Удалить %1$s?</string>
|
||||||
<string name="city_type_suburb">Пригород (suburb)</string>
|
<string name="city_type_suburb">Пригород</string>
|
||||||
<string name="city_type_hamlet">Деревня (hamlet)</string>
|
<string name="city_type_hamlet">Деревня</string>
|
||||||
<string name="city_type_village">Село (village)</string>
|
<string name="city_type_village">Село</string>
|
||||||
<string name="city_type_town">Город (town)</string>
|
<string name="city_type_town">Город</string>
|
||||||
<string name="city_type_city">Город (city)</string>
|
<string name="city_type_city">Крупный город</string>
|
||||||
<string name="animate_route_off">Закончить моделирование</string>
|
<string name="animate_route_off">Закончить моделирование</string>
|
||||||
<string name="animate_route">Начать моделирование</string>
|
<string name="animate_route">Начать моделирование</string>
|
||||||
<string name="file_can_not_be_renamed">Файл не может быть переименован.</string>
|
<string name="file_can_not_be_renamed">Файл не может быть переименован.</string>
|
||||||
|
|
|
@ -525,10 +525,6 @@ public class SearchAddressFragment extends Fragment {
|
||||||
street = null;
|
street = null;
|
||||||
building = null;
|
building = null;
|
||||||
region = osmandSettings.getLastSearchedRegion();
|
region = osmandSettings.getLastSearchedRegion();
|
||||||
RegionAddressRepository reg = getApplication().getResourceManager().getRegionRepository(region);
|
|
||||||
if(reg != null && reg.useEnglishNames() != osmandSettings.usingEnglishNames()){
|
|
||||||
reg.setUseEnglishNames(osmandSettings.usingEnglishNames());
|
|
||||||
}
|
|
||||||
loadData();
|
loadData();
|
||||||
updateUI();
|
updateUI();
|
||||||
|
|
||||||
|
|
|
@ -98,10 +98,10 @@ public class SearchBuildingByNameActivity extends SearchByNameAbstractActivity<B
|
||||||
if(obj.getInterpolationInterval() > 0 || obj.getInterpolationType() != null){
|
if(obj.getInterpolationInterval() > 0 || obj.getInterpolationType() != null){
|
||||||
String hno = getCurrentFilter();
|
String hno = getCurrentFilter();
|
||||||
if(hno.length() > 0 && obj.belongsToInterpolation(hno)) {
|
if(hno.length() > 0 && obj.belongsToInterpolation(hno)) {
|
||||||
return hno + " [" + obj.getName(region.useEnglishNames())+"]";
|
return hno + " [" + obj.getName(region.getLang())+"]";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return obj.getName(region.useEnglishNames());
|
return obj.getName(region.getLang());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -164,6 +164,10 @@ public abstract class SearchByNameAbstractActivity<T> extends OsmandListActivity
|
||||||
searchText.setText("");
|
searchText.setText("");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getLangPreferredName(MapObject mo) {
|
||||||
|
return mo.getName(settings.MAP_PREFERRED_LOCALE.get());
|
||||||
|
}
|
||||||
|
|
||||||
protected void addFooterViews() {
|
protected void addFooterViews() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -64,9 +64,8 @@ public class SearchCityByNameActivity extends SearchByNameAbstractActivity<City>
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Comparator<? super City> createComparator() {
|
protected Comparator<? super City> createComparator() {
|
||||||
final boolean en = getMyApplication().getSettings().usingEnglishNames();
|
|
||||||
final StringMatcherMode startsWith = CollatorStringMatcher.StringMatcherMode.CHECK_ONLY_STARTS_WITH;
|
final StringMatcherMode startsWith = CollatorStringMatcher.StringMatcherMode.CHECK_ONLY_STARTS_WITH;
|
||||||
return new CityComparator(startsWith, en);
|
return new CityComparator(startsWith, getMyApplication().getSettings().MAP_PREFERRED_LOCALE.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -157,33 +156,34 @@ public class SearchCityByNameActivity extends SearchByNameAbstractActivity<City>
|
||||||
public String getText(City obj) {
|
public String getText(City obj) {
|
||||||
LatLon l = obj.getLocation();
|
LatLon l = obj.getLocation();
|
||||||
if (getCurrentFilter().length() > 2 ) {
|
if (getCurrentFilter().length() > 2 ) {
|
||||||
String name = obj.getName(region.useEnglishNames());
|
String name = obj.getName(region.getLang());
|
||||||
if (obj.getType() != null) {
|
|
||||||
name += " [" + OsmAndFormatter.toPublicString(obj.getType(), getMyApplication()) + "]";
|
|
||||||
}
|
|
||||||
if(obj.getClosestCity() != null) {
|
if(obj.getClosestCity() != null) {
|
||||||
name += " - " + obj.getClosestCity().getName(region.useEnglishNames()) ;
|
name += " - " + obj.getClosestCity().getName(region.getLang()) ;
|
||||||
LatLon loc = obj.getClosestCity().getLocation();
|
LatLon loc = obj.getClosestCity().getLocation();
|
||||||
if(loc != null && l != null) {
|
if(loc != null && l != null) {
|
||||||
name += " " + OsmAndFormatter.getFormattedDistance((int) MapUtils.getDistance(l, loc), getMyApplication());
|
name += " " + OsmAndFormatter.getFormattedDistance((int) MapUtils.getDistance(l, loc), getMyApplication());
|
||||||
}
|
}
|
||||||
return name;
|
return name;
|
||||||
|
} else {
|
||||||
|
if (obj.getType() != null) {
|
||||||
|
name += " - " + OsmAndFormatter.toPublicString(obj.getType(), getMyApplication());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return name;
|
return name;
|
||||||
} else {
|
} else {
|
||||||
return obj.getName(region.useEnglishNames());
|
return obj.getName(region.getLang());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getShortText(City obj) {
|
public String getShortText(City obj) {
|
||||||
return obj.getName(region.useEnglishNames());
|
return obj.getName(region.getLang());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void itemSelected(City obj) {
|
public void itemSelected(City obj) {
|
||||||
settings.setLastSearchedCity(obj.getId(), obj.getName(region.useEnglishNames()), obj.getLocation());
|
settings.setLastSearchedCity(obj.getId(), obj.getName(region.getLang()), obj.getLocation());
|
||||||
if (region.getCityById(obj.getId(), obj.getName(region.useEnglishNames())) == null) {
|
if (region.getCityById(obj.getId(), obj.getName(region.getLang())) == null) {
|
||||||
region.addCityToPreloadedList((City) obj);
|
region.addCityToPreloadedList((City) obj);
|
||||||
}
|
}
|
||||||
quitActivity(SearchStreetByNameActivity.class);
|
quitActivity(SearchStreetByNameActivity.class);
|
||||||
|
@ -197,13 +197,13 @@ public class SearchCityByNameActivity extends SearchByNameAbstractActivity<City>
|
||||||
private final class CityComparator implements Comparator<City> {
|
private final class CityComparator implements Comparator<City> {
|
||||||
private final StringMatcherMode startsWith;
|
private final StringMatcherMode startsWith;
|
||||||
private final net.osmand.Collator cs;
|
private final net.osmand.Collator cs;
|
||||||
private final boolean en;
|
private final String lang ;
|
||||||
|
|
||||||
private CityComparator(StringMatcherMode startsWith,
|
private CityComparator(StringMatcherMode startsWith,
|
||||||
boolean en) {
|
String lang ) {
|
||||||
this.startsWith = startsWith;
|
this.startsWith = startsWith;
|
||||||
this.cs = OsmAndCollator.primaryCollator();
|
this.cs = OsmAndCollator.primaryCollator();
|
||||||
this.en = en;
|
this.lang = lang;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -214,8 +214,8 @@ public class SearchCityByNameActivity extends SearchByNameAbstractActivity<City>
|
||||||
if (compare != 0) {
|
if (compare != 0) {
|
||||||
return compare;
|
return compare;
|
||||||
}
|
}
|
||||||
boolean st1 = CollatorStringMatcher.cmatches(cs, lhs.getName(en), part, startsWith);
|
boolean st1 = CollatorStringMatcher.cmatches(cs, lhs.getName(lang), part, startsWith);
|
||||||
boolean st2 = CollatorStringMatcher.cmatches(cs, rhs.getName(en), part, startsWith);
|
boolean st2 = CollatorStringMatcher.cmatches(cs, rhs.getName(lang), part, startsWith);
|
||||||
if(st1 != st2) {
|
if(st1 != st2) {
|
||||||
return st1 ? 1 : -1;
|
return st1 ? 1 : -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@ public class SearchStreet2ByNameActivity extends SearchByNameAbstractActivity<St
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Comparator<? super Street> createComparator() {
|
protected Comparator<? super Street> createComparator() {
|
||||||
return new MapObjectComparator(getMyApplication().getSettings().usingEnglishNames());
|
return new MapObjectComparator(getMyApplication().getSettings().MAP_PREFERRED_LOCALE.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -71,12 +71,12 @@ public class SearchStreet2ByNameActivity extends SearchByNameAbstractActivity<St
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getText(Street obj) {
|
public String getText(Street obj) {
|
||||||
return obj.getName(region.useEnglishNames());
|
return obj.getName(region.getLang());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void itemSelected(Street obj) {
|
public void itemSelected(Street obj) {
|
||||||
settings.setLastSearchedIntersectedStreet(obj.getName(region.useEnglishNames()), obj.getLocation());
|
settings.setLastSearchedIntersectedStreet(obj.getName(region.getLang()), obj.getLocation());
|
||||||
quitActivity(null);
|
quitActivity(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,7 @@ public class SearchStreetByNameActivity extends SearchByNameAbstractActivity<Str
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Comparator<? super Street> createComparator() {
|
protected Comparator<? super Street> createComparator() {
|
||||||
return new MapObjectComparator(getMyApplication().getSettings().usingEnglishNames()) {
|
return new MapObjectComparator(getMyApplication().getSettings().MAP_PREFERRED_LOCALE.get()) {
|
||||||
@Override
|
@Override
|
||||||
public int compare(MapObject o1, MapObject o2) {
|
public int compare(MapObject o1, MapObject o2) {
|
||||||
if(searchWithCity >= 0 && city != null) {
|
if(searchWithCity >= 0 && city != null) {
|
||||||
|
@ -176,7 +176,7 @@ public class SearchStreetByNameActivity extends SearchByNameAbstractActivity<Str
|
||||||
if (namesFilter.isCancelled) {
|
if (namesFilter.isCancelled) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (emptyQuery || CollatorStringMatcher.cmatches(collator, obj.getNameWithoutCityPart(region.useEnglishNames()),
|
if (emptyQuery || CollatorStringMatcher.cmatches(collator, obj.getNameWithoutCityPart(settings.MAP_PREFERRED_LOCALE.get()),
|
||||||
query, StringMatcherMode.CHECK_ONLY_STARTS_WITH)) {
|
query, StringMatcherMode.CHECK_ONLY_STARTS_WITH)) {
|
||||||
Message msg = uiHandler.obtainMessage(MESSAGE_ADD_ENTITY, obj);
|
Message msg = uiHandler.obtainMessage(MESSAGE_ADD_ENTITY, obj);
|
||||||
msg.sendToTarget();
|
msg.sendToTarget();
|
||||||
|
@ -187,7 +187,8 @@ public class SearchStreetByNameActivity extends SearchByNameAbstractActivity<Str
|
||||||
if (namesFilter.isCancelled) {
|
if (namesFilter.isCancelled) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (CollatorStringMatcher.cmatches(collator, obj.getNameWithoutCityPart(region.useEnglishNames()), query, StringMatcherMode.CHECK_STARTS_FROM_SPACE_NOT_BEGINNING)) {
|
if (CollatorStringMatcher.cmatches(collator, obj.getNameWithoutCityPart(settings.MAP_PREFERRED_LOCALE.get()),
|
||||||
|
query, StringMatcherMode.CHECK_STARTS_FROM_SPACE_NOT_BEGINNING)) {
|
||||||
Message msg = uiHandler.obtainMessage(MESSAGE_ADD_ENTITY, obj);
|
Message msg = uiHandler.obtainMessage(MESSAGE_ADD_ENTITY, obj);
|
||||||
msg.sendToTarget();
|
msg.sendToTarget();
|
||||||
}
|
}
|
||||||
|
@ -198,10 +199,10 @@ public class SearchStreetByNameActivity extends SearchByNameAbstractActivity<Str
|
||||||
@Override
|
@Override
|
||||||
public String getText(Street obj) {
|
public String getText(Street obj) {
|
||||||
if(searchWithCity >= 0 || city == null) {
|
if(searchWithCity >= 0 || city == null) {
|
||||||
String nameWithCity = obj.getName(region.useEnglishNames()) + " - " + obj.getCity().getName(region.useEnglishNames());
|
String nameWithCity = getLangPreferredName(obj) + " - " + getLangPreferredName(obj.getCity());
|
||||||
return nameWithCity ;
|
return nameWithCity ;
|
||||||
}
|
}
|
||||||
return obj.getName(region.useEnglishNames());
|
return getLangPreferredName(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -217,10 +218,10 @@ public class SearchStreetByNameActivity extends SearchByNameAbstractActivity<Str
|
||||||
@Override
|
@Override
|
||||||
public void itemSelected(Street obj) {
|
public void itemSelected(Street obj) {
|
||||||
if(!Algorithms.objectEquals(settings.getLastSearchedCity(), obj.getCity().getId())) {
|
if(!Algorithms.objectEquals(settings.getLastSearchedCity(), obj.getCity().getId())) {
|
||||||
settings.setLastSearchedCity(obj.getCity().getId(), obj.getCity().getName(region.useEnglishNames()), obj.getLocation());
|
settings.setLastSearchedCity(obj.getCity().getId(), getLangPreferredName(obj.getCity()), obj.getLocation());
|
||||||
region.addCityToPreloadedList(obj.getCity());
|
region.addCityToPreloadedList(obj.getCity());
|
||||||
}
|
}
|
||||||
settings.setLastSearchedStreet(obj.getName(region.useEnglishNames()), obj.getLocation());
|
settings.setLastSearchedStreet(getLangPreferredName(obj), obj.getLocation());
|
||||||
// if(obj.getBuildings().size() == 0){
|
// if(obj.getBuildings().size() == 0){
|
||||||
// quitActivity(null);
|
// quitActivity(null);
|
||||||
// } else {
|
// } else {
|
||||||
|
|
|
@ -19,6 +19,8 @@ public interface RegionAddressRepository {
|
||||||
|
|
||||||
public String getFileName() ;
|
public String getFileName() ;
|
||||||
|
|
||||||
|
public String getLang();
|
||||||
|
|
||||||
|
|
||||||
public LatLon getEstimatedRegionCenter();
|
public LatLon getEstimatedRegionCenter();
|
||||||
|
|
||||||
|
@ -28,11 +30,6 @@ public interface RegionAddressRepository {
|
||||||
// called to close resources
|
// called to close resources
|
||||||
public void close();
|
public void close();
|
||||||
|
|
||||||
public boolean useEnglishNames();
|
|
||||||
|
|
||||||
public void setUseEnglishNames(boolean useEnglishNames);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void preloadCities(ResultMatcher<City> resultMatcher);
|
public void preloadCities(ResultMatcher<City> resultMatcher);
|
||||||
|
|
||||||
|
@ -62,12 +59,12 @@ public interface RegionAddressRepository {
|
||||||
|
|
||||||
public static class MapObjectNameDistanceComparator implements Comparator<MapObject> {
|
public static class MapObjectNameDistanceComparator implements Comparator<MapObject> {
|
||||||
|
|
||||||
private final boolean useEnName;
|
|
||||||
private Collator collator = Collator.getInstance();
|
private Collator collator = Collator.getInstance();
|
||||||
private final LatLon location;
|
private final LatLon location;
|
||||||
|
private final String lang;
|
||||||
|
|
||||||
public MapObjectNameDistanceComparator(boolean useEnName, LatLon location){
|
public MapObjectNameDistanceComparator(String lang, LatLon location){
|
||||||
this.useEnName = useEnName;
|
this.lang = lang;
|
||||||
this.location = location;
|
this.location = location;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,7 +73,7 @@ public interface RegionAddressRepository {
|
||||||
if(object1 == null || object2 == null){
|
if(object1 == null || object2 == null){
|
||||||
return object2 == object1 ? 0 : (object1 == null ? -1 : 1);
|
return object2 == object1 ? 0 : (object1 == null ? -1 : 1);
|
||||||
} else {
|
} else {
|
||||||
int c = collator.compare(object1.getName(useEnName), object2.getName(useEnName));
|
int c = collator.compare(object1.getName(lang), object2.getName(lang));
|
||||||
if(c == 0 && location != null){
|
if(c == 0 && location != null){
|
||||||
LatLon l1 = object1.getLocation();
|
LatLon l1 = object1.getLocation();
|
||||||
LatLon l2 = object2.getLocation();
|
LatLon l2 = object2.getLocation();
|
||||||
|
|
|
@ -25,6 +25,8 @@ import net.osmand.data.MapObject;
|
||||||
import net.osmand.data.QuadRect;
|
import net.osmand.data.QuadRect;
|
||||||
import net.osmand.data.QuadTree;
|
import net.osmand.data.QuadTree;
|
||||||
import net.osmand.data.Street;
|
import net.osmand.data.Street;
|
||||||
|
import net.osmand.plus.OsmandApplication;
|
||||||
|
import net.osmand.plus.OsmandSettings.OsmandPreference;
|
||||||
import net.osmand.util.MapUtils;
|
import net.osmand.util.MapUtils;
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
|
@ -41,11 +43,14 @@ public class RegionAddressRepositoryBinary implements RegionAddressRepository {
|
||||||
private QuadTree<City> citiesQtree = new QuadTree<City>(new QuadRect(0, 0, 1 << (ZOOM_QTREE + 1),
|
private QuadTree<City> citiesQtree = new QuadTree<City>(new QuadRect(0, 0, 1 << (ZOOM_QTREE + 1),
|
||||||
1 << (ZOOM_QTREE + 1)), 8, 0.55f);
|
1 << (ZOOM_QTREE + 1)), 8, 0.55f);
|
||||||
private final Map<String, City> postCodes;
|
private final Map<String, City> postCodes;
|
||||||
private boolean useEnglishNames = false;
|
|
||||||
private final Collator collator;
|
private final Collator collator;
|
||||||
private String fileName;
|
private String fileName;
|
||||||
|
private ResourceManager mgr;
|
||||||
|
private OsmandPreference<String> langSetting;
|
||||||
|
|
||||||
public RegionAddressRepositoryBinary(BinaryMapIndexReader file, String name, String fileName) {
|
public RegionAddressRepositoryBinary(ResourceManager mgr, BinaryMapIndexReader file, String name, String fileName) {
|
||||||
|
this.mgr = mgr;
|
||||||
|
langSetting = mgr.getContext().getSettings().MAP_PREFERRED_LOCALE;
|
||||||
this.file = file;
|
this.file = file;
|
||||||
this.region = name;
|
this.region = name;
|
||||||
this.fileName = fileName;
|
this.fileName = fileName;
|
||||||
|
@ -179,12 +184,13 @@ public class RegionAddressRepositoryBinary implements RegionAddressRepository {
|
||||||
return citiesToFill;
|
return citiesToFill;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
|
String lang = getLang();
|
||||||
// essentially index is created that cities towns are first in cities map
|
// essentially index is created that cities towns are first in cities map
|
||||||
if (/*name.length() >= 2 && Algorithms.containsDigit(name) && */searchVillages) {
|
if (/*name.length() >= 2 && Algorithms.containsDigit(name) && */searchVillages) {
|
||||||
// also try to identify postcodes
|
// also try to identify postcodes
|
||||||
String uName = name.toUpperCase();
|
String uName = name.toUpperCase();
|
||||||
List<City> foundCities = file.getCities(region, BinaryMapIndexReader.buildAddressRequest(resultMatcher),
|
List<City> foundCities = file.getCities(region, BinaryMapIndexReader.buildAddressRequest(resultMatcher),
|
||||||
new CollatorStringMatcher(uName, StringMatcherMode.CHECK_CONTAINS), false,
|
new CollatorStringMatcher(uName, StringMatcherMode.CHECK_CONTAINS), lang,
|
||||||
BinaryMapAddressReaderAdapter.POSTCODES_TYPE);
|
BinaryMapAddressReaderAdapter.POSTCODES_TYPE);
|
||||||
for (City code : foundCities) {
|
for (City code : foundCities) {
|
||||||
citiesToFill.add(code);
|
citiesToFill.add(code);
|
||||||
|
@ -196,7 +202,7 @@ public class RegionAddressRepositoryBinary implements RegionAddressRepository {
|
||||||
}
|
}
|
||||||
name = name.toLowerCase();
|
name = name.toLowerCase();
|
||||||
for (City c : cities.values()) {
|
for (City c : cities.values()) {
|
||||||
String cName = c.getName(useEnglishNames); // lower case not needed, collator ensures that
|
String cName = c.getName(lang); // lower case not needed, collator ensures that
|
||||||
if (CollatorStringMatcher.cmatches(collator, cName, name, StringMatcherMode.CHECK_STARTS_FROM_SPACE)) {
|
if (CollatorStringMatcher.cmatches(collator, cName, name, StringMatcherMode.CHECK_STARTS_FROM_SPACE)) {
|
||||||
if (resultMatcher.publish(c)) {
|
if (resultMatcher.publish(c)) {
|
||||||
citiesToFill.add(c);
|
citiesToFill.add(c);
|
||||||
|
@ -225,8 +231,7 @@ public class RegionAddressRepositoryBinary implements RegionAddressRepository {
|
||||||
public boolean isCancelled() {
|
public boolean isCancelled() {
|
||||||
return resultMatcher.isCancelled();
|
return resultMatcher.isCancelled();
|
||||||
}
|
}
|
||||||
}),
|
}), new CollatorStringMatcher(name,StringMatcherMode.CHECK_STARTS_FROM_SPACE), lang,
|
||||||
new CollatorStringMatcher(name,StringMatcherMode.CHECK_STARTS_FROM_SPACE), useEnglishNames,
|
|
||||||
BinaryMapAddressReaderAdapter.VILLAGES_TYPE);
|
BinaryMapAddressReaderAdapter.VILLAGES_TYPE);
|
||||||
|
|
||||||
for (City c : foundCities) {
|
for (City c : foundCities) {
|
||||||
|
@ -243,6 +248,11 @@ public class RegionAddressRepositoryBinary implements RegionAddressRepository {
|
||||||
return citiesToFill;
|
return citiesToFill;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getLang() {
|
||||||
|
return langSetting.get();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Street> getStreetsIntersectStreets(Street st) {
|
public List<Street> getStreetsIntersectStreets(Street st) {
|
||||||
preloadBuildings(st, null);
|
preloadBuildings(st, null);
|
||||||
|
@ -253,8 +263,9 @@ public class RegionAddressRepositoryBinary implements RegionAddressRepository {
|
||||||
@Override
|
@Override
|
||||||
public Building getBuildingByName(Street street, String name) {
|
public Building getBuildingByName(Street street, String name) {
|
||||||
preloadBuildings(street, null);
|
preloadBuildings(street, null);
|
||||||
|
String lang = getLang();
|
||||||
for (Building b : street.getBuildings()) {
|
for (Building b : street.getBuildings()) {
|
||||||
String bName = b.getName(useEnglishNames);
|
String bName = b.getName(lang);
|
||||||
if (bName.equals(name)) {
|
if (bName.equals(name)) {
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
@ -277,11 +288,6 @@ public class RegionAddressRepositoryBinary implements RegionAddressRepository {
|
||||||
return getName() + " repository";
|
return getName() + " repository";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean useEnglishNames() {
|
|
||||||
return useEnglishNames;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public City getCityById(final long id, String name) {
|
public City getCityById(final long id, String name) {
|
||||||
if (id == -1) {
|
if (id == -1) {
|
||||||
|
@ -330,22 +336,16 @@ public class RegionAddressRepositoryBinary implements RegionAddressRepository {
|
||||||
name = name.toLowerCase();
|
name = name.toLowerCase();
|
||||||
preloadStreets(o, null);
|
preloadStreets(o, null);
|
||||||
Collection<Street> streets = o.getStreets() ;
|
Collection<Street> streets = o.getStreets() ;
|
||||||
|
String lang = getLang();
|
||||||
for (Street s : streets) {
|
for (Street s : streets) {
|
||||||
String sName = useEnglishNames ? s.getEnName() : s.getName(); //lower case not needed, collator ensures that
|
String sName = s.getName(lang).toLowerCase();
|
||||||
if (collator.equals(sName,name)) {
|
if (collator.equals(sName, name)) {
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setUseEnglishNames(boolean useEnglishNames) {
|
|
||||||
this.useEnglishNames = useEnglishNames;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void clearCache() {
|
public void clearCache() {
|
||||||
cities = new LinkedHashMap<Long, City>();
|
cities = new LinkedHashMap<Long, City>();
|
||||||
|
|
|
@ -644,7 +644,7 @@ public class ResourceManager {
|
||||||
for (String rName : index.getRegionNames()) {
|
for (String rName : index.getRegionNames()) {
|
||||||
// skip duplicate names (don't make collision between getName() and name in the map)
|
// skip duplicate names (don't make collision between getName() and name in the map)
|
||||||
// it can be dangerous to use one file to different indexes if it is multithreaded
|
// it can be dangerous to use one file to different indexes if it is multithreaded
|
||||||
RegionAddressRepositoryBinary rarb = new RegionAddressRepositoryBinary(index, rName, f.getName());
|
RegionAddressRepositoryBinary rarb = new RegionAddressRepositoryBinary(this, index, rName, f.getName());
|
||||||
addressMap.put(rName, rarb);
|
addressMap.put(rName, rarb);
|
||||||
}
|
}
|
||||||
if (index.hasTransportData()) {
|
if (index.hasTransportData()) {
|
||||||
|
|
|
@ -101,7 +101,7 @@ public class TransportIndexRepositoryBinary implements TransportIndexRepository
|
||||||
List<TransportRoute> routes = file.getTransportRouteDescriptions(stop);
|
List<TransportRoute> routes = file.getTransportRouteDescriptions(stop);
|
||||||
if(routes != null){
|
if(routes != null){
|
||||||
for(TransportRoute route : routes){
|
for(TransportRoute route : routes){
|
||||||
res.add(f.format(new String[] { route.getRef() + "", route.getType() + "", route.getName() + "", route.getEnName() + "" })); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
|
res.add(f.format(new String[] { route.getRef() + "", route.getType() + "", route.getName() + "", route.getEnName(true) + "" })); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
|
|
@ -139,7 +139,7 @@ public class TransportInfoLayer extends OsmandMapLayer {
|
||||||
int x = (int) tileBox.getPixXFromLatLon(location.getLatitude(), location.getLongitude());
|
int x = (int) tileBox.getPixXFromLatLon(location.getLatitude(), location.getLongitude());
|
||||||
int y = (int) tileBox.getPixYFromLatLon(location.getLatitude(), location.getLongitude());
|
int y = (int) tileBox.getPixYFromLatLon(location.getLatitude(), location.getLongitude());
|
||||||
if (Math.abs(x - ex) < getRadius(tileBox) * 3 /2 && Math.abs(y - ey) < getRadius(tileBox) * 3 /2) {
|
if (Math.abs(x - ex) < getRadius(tileBox) * 3 /2 && Math.abs(y - ey) < getRadius(tileBox) * 3 /2) {
|
||||||
AccessibleToast.makeText(view.getContext(), st.getName(view.getSettings().usingEnglishNames()) + " : " + //$NON-NLS-1$
|
AccessibleToast.makeText(view.getContext(), st.getName(view.getSettings().MAP_PREFERRED_LOCALE.get()) + " : " + //$NON-NLS-1$
|
||||||
route.getType() + " " + route.getRef() //$NON-NLS-1$
|
route.getType() + " " + route.getRef() //$NON-NLS-1$
|
||||||
, Toast.LENGTH_LONG).show();
|
, Toast.LENGTH_LONG).show();
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -97,7 +97,7 @@ public class TransportStopsLayer extends OsmandMapLayer implements ContextMenuLa
|
||||||
private String getStopDescription(TransportStop n, boolean useName) {
|
private String getStopDescription(TransportStop n, boolean useName) {
|
||||||
StringBuilder text = new StringBuilder(250);
|
StringBuilder text = new StringBuilder(250);
|
||||||
text.append(view.getContext().getString(R.string.transport_Stop))
|
text.append(view.getContext().getString(R.string.transport_Stop))
|
||||||
.append(" : ").append(n.getName(view.getSettings().usingEnglishNames())); //$NON-NLS-1$
|
.append(" : ").append(n.getName(view.getSettings().MAP_PREFERRED_LOCALE.get())); //$NON-NLS-1$
|
||||||
text.append("\n").append(view.getContext().getString(R.string.transport_Routes)).append(" : "); //$NON-NLS-1$ //$NON-NLS-2$
|
text.append("\n").append(view.getContext().getString(R.string.transport_Routes)).append(" : "); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
List<TransportIndexRepository> reps = view.getApplication().getResourceManager().searchTransportRepositories(
|
List<TransportIndexRepository> reps = view.getApplication().getResourceManager().searchTransportRepositories(
|
||||||
n.getLocation().getLatitude(), n.getLocation().getLongitude());
|
n.getLocation().getLatitude(), n.getLocation().getLongitude());
|
||||||
|
@ -185,7 +185,7 @@ public class TransportStopsLayer extends OsmandMapLayer implements ContextMenuLa
|
||||||
|
|
||||||
private void showDescriptionDialog(TransportStop a) {
|
private void showDescriptionDialog(TransportStop a) {
|
||||||
Builder bs = new AlertDialog.Builder(view.getContext());
|
Builder bs = new AlertDialog.Builder(view.getContext());
|
||||||
bs.setTitle(a.getName(view.getSettings().usingEnglishNames()));
|
bs.setTitle(a.getName(view.getSettings().MAP_PREFERRED_LOCALE.get()));
|
||||||
bs.setMessage(getStopDescription(a, true));
|
bs.setMessage(getStopDescription(a, true));
|
||||||
bs.show();
|
bs.show();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue