Add common words to geocoding utilities

This commit is contained in:
Victor Shcherb 2017-04-12 14:29:47 +02:00
parent 9e75276019
commit 9099ee8ec1
2 changed files with 530 additions and 38 deletions

View file

@ -0,0 +1,512 @@
package net.osmand.binary;
import java.util.LinkedHashMap;
import java.util.Map;
public class CommonWords {
private static Map<String, Integer> commonWordsDictionary = new LinkedHashMap<>();
private static void addCommon(String string) {
commonWordsDictionary.put(string, commonWordsDictionary.size());
}
public static int getCommon(String name) {
if(true) {
// not ready for old versions yet
return -1;
}
Integer i = commonWordsDictionary.get(name);
return i == null ? -1 : i.intValue();
}
public static int getCommonGeocoding(String name) {
Integer i = commonWordsDictionary.get(name);
return i == null ? -1 : i.intValue();
}
static {
addCommon("la");
addCommon("via");
addCommon("rua");
addCommon("de");
addCommon("du");
addCommon("des");
addCommon("del");
addCommon("am");
addCommon("da");
addCommon("a");
addCommon("der");
addCommon("do");
addCommon("los");
addCommon("di");
addCommon("im");
addCommon("el");
addCommon("e");
addCommon("an");
addCommon("g.");
addCommon("rd");
addCommon("dos");
addCommon("dei");
addCommon("b");
addCommon("st");
addCommon("the");
addCommon("las");
addCommon("f");
addCommon("u");
addCommon("jl.");
addCommon("j");
addCommon("sk");
addCommon("w");
addCommon("a.");
addCommon("of");
addCommon("k");
addCommon("r");
addCommon("h");
addCommon("mc");
addCommon("sw");
addCommon("g");
addCommon("v");
addCommon("m");
addCommon("c.");
addCommon("r.");
addCommon("ct");
addCommon("e.");
addCommon("dr.");
addCommon("j.");
addCommon("in");
addCommon("al");
addCommon("út");
addCommon("per");
addCommon("ne");
addCommon("p");
addCommon("et");
addCommon("s.");
addCommon("f.");
addCommon("t");
addCommon("fe");
addCommon("à");
addCommon("i");
addCommon("c");
addCommon("le");
addCommon("s");
addCommon("av.");
addCommon("den");
addCommon("dr");
addCommon("y");
addCommon("un");
addCommon("van");
addCommon("road");
addCommon("street");
addCommon("drive");
addCommon("avenue");
addCommon("rue");
addCommon("lane");
addCommon("улица");
addCommon("спуск");
addCommon("straße");
addCommon("chemin");
addCommon("way");
addCommon("court");
addCommon("calle");
addCommon("place");
addCommon("avenida");
addCommon("boulevard");
addCommon("county");
addCommon("route");
addCommon("trail");
addCommon("circle");
addCommon("close");
addCommon("highway");
addCommon("strada");
addCommon("impasse");
addCommon("utca");
addCommon("creek");
addCommon("carrer");
addCommon("вулиця");
addCommon("allée");
addCommon("weg");
addCommon("площадь");
addCommon("тупик");
addCommon("terrace");
addCommon("jalan");
addCommon("parkway");
addCommon("переулок");
addCommon("carretera");
addCommon("valley");
addCommon("camino");
addCommon("viale");
addCommon("loop");
addCommon("bridge");
addCommon("embankment");
addCommon("township");
addCommon("town");
addCommon("village");
addCommon("piazza");
addCommon("della");
addCommon("plaza");
addCommon("pasaje");
addCommon("expressway");
addCommon("ruta");
addCommon("square");
addCommon("freeway");
addCommon("line");
addCommon("track");
addCommon("zum");
addCommon("rodovia");
addCommon("sokak");
addCommon("sur");
addCommon("path");
addCommon("das");
addCommon("yolu");
addCommon("проспект");
addCommon("auf");
addCommon("alley");
addCommon("são");
addCommon("les");
addCommon("delle");
addCommon("paseo");
addCommon("alte");
addCommon("autostrada");
addCommon("iela");
addCommon("autovía");
addCommon("d");
addCommon("ulica");
addCommon("na");
addCommon("проезд");
addCommon("n");
addCommon("ул.");
addCommon("voie");
addCommon("ring");
addCommon("ruelle");
addCommon("vicolo");
addCommon("avinguda");
addCommon("шоссе");
addCommon("zur");
addCommon("corso");
addCommon("autopista");
addCommon("провулок");
addCommon("broadway");
addCommon("to");
addCommon("passage");
addCommon("sentier");
addCommon("aleja");
addCommon("dem");
addCommon("valle");
addCommon("cruz");
addCommon("bypass");
addCommon("rúa");
addCommon("crest");
addCommon("ave");
addCommon("expressway)");
addCommon("autoroute");
addCommon("crossing");
addCommon("camí");
addCommon("bend");
addCommon("end");
addCommon("caddesi");
addCommon("bis");
addCommon("ქუჩა");
addCommon("kalea");
addCommon("pass");
addCommon("ponte");
addCommon("cruce");
addCommon("se");
addCommon("au");
addCommon("allee");
addCommon("autobahn");
addCommon("väg");
addCommon("sentiero");
addCommon("plaça");
addCommon("o");
addCommon("vej");
addCommon("aux");
addCommon("spur");
addCommon("ringstraße");
addCommon("prospect");
addCommon("m.");
addCommon("chaussee");
addCommon("row");
addCommon("link");
addCommon("travesía");
addCommon("degli");
addCommon("piazzale");
addCommon("vei");
addCommon("waldstraße");
addCommon("promenade");
addCommon("puente");
addCommon("rond-point");
addCommon("vía");
addCommon("pod");
addCommon("triq");
addCommon("hwy");
addCommon("οδός");
addCommon("dels");
addCommon("and");
addCommon("pré");
addCommon("plac");
addCommon("fairway");
// addCommon("farm-to-market");
addCommon("набережная");
addCommon("chaussée");
addCommon("náměstí");
addCommon("tér");
addCommon("roundabout");
addCommon("lakeshore");
addCommon("lakeside");
addCommon("alle");
addCommon("gasse");
addCommon("str.");
// addCommon("p.");
addCommon("ville");
addCommon("beco");
addCommon("platz");
// addCommon("porto");
addCommon("sideroad");
addCommon("pista");
addCommon("аллея");
addCommon("бульвар");
addCommon("город");
addCommon("городок");
addCommon("деревня");
addCommon("дер.");
addCommon("пос.");
addCommon("дорога");
addCommon("дорожка");
addCommon("кольцо");
addCommon("мост");
addCommon("остров");
addCommon("островок");
addCommon("поселок");
addCommon("посёлок");
addCommon("путепровод");
addCommon("слобода");
addCommon("станция");
addCommon("тоннель");
addCommon("тракт");
addCommon("island");
addCommon("islet");
addCommon("tunnel");
addCommon("stadt");
addCommon("brücke");
addCommon("damm");
addCommon("insel");
addCommon("dorf");
addCommon("bereich");
addCommon("überführung");
addCommon("bulevar");
addCommon("ciudad");
addCommon("pueblo");
addCommon("anillo");
addCommon("muelle");
addCommon("isla");
addCommon("islote");
addCommon("carril");
addCommon("viaje");
addCommon("città");
addCommon("paese");
addCommon("villaggio");
addCommon("banchina");
addCommon("isola");
addCommon("isolotto");
addCommon("corsia");
addCommon("viaggio");
addCommon("canale");
addCommon("pont");
addCommon("quai");
addCommon("île");
addCommon("îlot");
addCommon("voyage");
addCommon("descente");
addCommon("straat");
addCommon("stad");
addCommon("dorp");
addCommon("brug");
addCommon("kade");
addCommon("eiland");
addCommon("eilandje");
addCommon("laan");
addCommon("plein");
addCommon("reizen");
addCommon("afkomst");
addCommon("kanaal");
addCommon("doodlopende");
addCommon("stradă");
addCommon("rutier");
addCommon("alee");
addCommon("municipiu");
addCommon("oras");
addCommon("drumuri");
addCommon("poduri");
addCommon("cheu");
addCommon("insula");
addCommon("ostrov");
addCommon("sat");
addCommon("călătorie");
addCommon("coborâre");
addCommon("statie");
addCommon("tunel");
addCommon("fundătură");
addCommon("ulice");
addCommon("silnice");
addCommon("bulvár");
addCommon("město");
addCommon("obec");
addCommon("most");
addCommon("nábřeží");
addCommon("ostrova");
addCommon("ostrůvek");
addCommon("lane");
addCommon("vesnice");
addCommon("jezdit");
addCommon("sestup");
addCommon("nádraží");
addCommon("kanál");
addCommon("ulička");
addCommon("gata");
addCommon("by");
addCommon("bro");
addCommon("kaj");
addCommon("ö");
addCommon("holme");
addCommon("fyrkant");
addCommon("resa");
addCommon("härkomst");
addCommon("kanal");
addCommon("återvändsgränd");
addCommon("cesty");
addCommon("ostrovček");
addCommon("námestie");
addCommon("dediny");
addCommon("jazdiť");
addCommon("zostup");
addCommon("stanice");
addCommon("cesta");
addCommon("pot");
addCommon("mesto");
addCommon("kraj");
addCommon("vas");
addCommon("pomol");
addCommon("otok");
addCommon("otoček");
addCommon("trg");
addCommon("potovanje");
addCommon("spust");
addCommon("postaja");
addCommon("predor");
addCommon("вуліца");
addCommon("шаша");
addCommon("алея");
addCommon("горад");
addCommon("мястэчка");
addCommon("вёска");
addCommon("дарога");
addCommon("набярэжная");
addCommon("востраў");
addCommon("астравок");
addCommon("завулак");
addCommon("плошча");
addCommon("пасёлак");
addCommon("праезд");
addCommon("праспект");
addCommon("станцыя");
addCommon("тунэль");
addCommon("тупік");
addCommon("افي.");
addCommon("إلى");
addCommon("تسوية");
addCommon("جادة");
addCommon("جزيرة");
addCommon("جسر");
addCommon("زقاق");
addCommon("شارع");
addCommon("طريق");
addCommon("قرية");
addCommon("مأزق");
addCommon("محطة");
addCommon("مدينة");
addCommon("مرور");
addCommon("مسار");
addCommon("ممر");
addCommon("منطقة");
addCommon("نفق");
addCommon("път");
addCommon("булевард");
addCommon("град");
addCommon("село");
addCommon("кей");
addCommon("островче");
addCommon("платно");
addCommon("квадрат");
addCommon("пътуване");
addCommon("произход");
addCommon("гара");
addCommon("тунел");
addCommon("канал");
addCommon("körút");
addCommon("híd");
addCommon("rakpart");
addCommon("állomás");
addCommon("alagút");
addCommon("đường");
addCommon("đại");
addCommon("làng");
addCommon("cầu");
addCommon("đảo");
addCommon("phố");
addCommon("gốc");
addCommon("kênh");
addCommon("δρόμο");
addCommon("λεωφόρος");
addCommon("πόλη");
addCommon("κωμόπολη");
addCommon("χωριό");
addCommon("δρόμος");
addCommon("γέφυρα");
addCommon("αποβάθρα");
addCommon("νησί");
addCommon("νησίδα");
addCommon("λωρίδα");
addCommon("πλατεία");
addCommon("χωριό");
addCommon("ταξίδια");
addCommon("ø");
addCommon("bane");
}
}

View file

@ -49,28 +49,6 @@ public class GeocodingUtilities {
public static final float THRESHOLD_MULTIPLIER_SKIP_BUILDINGS_AFTER = 1.5f; public static final float THRESHOLD_MULTIPLIER_SKIP_BUILDINGS_AFTER = 1.5f;
public static final float DISTANCE_BUILDING_PROXIMITY = 100; public static final float DISTANCE_BUILDING_PROXIMITY = 100;
public static final String[] SUFFIXES = new String[]{
"av.", "avenue", "просп.", "пер.", "пр.", "заул.", "проспект", "переул.", "бул.", "бульвар", "тракт"};
public static final String[] DEFAULT_SUFFIXES = new String[]{
"str.", "street", "улица", "ул.", "вулица", "вул.", "вулиця"};
private static Set<String> SET_DEF_SUFFIXES = null;
private static Set<String> SET_SUFFIXES = null;
public static Set<String> getDefSuffixesSet() {
if (SET_DEF_SUFFIXES == null) {
SET_DEF_SUFFIXES = new TreeSet<String>();
SET_DEF_SUFFIXES.addAll(Arrays.asList(DEFAULT_SUFFIXES));
}
return SET_DEF_SUFFIXES;
}
public static Set<String> getSuffixesSet() {
if (SET_SUFFIXES == null) {
SET_SUFFIXES = new TreeSet<String>();
SET_SUFFIXES.addAll(Arrays.asList(SUFFIXES));
}
return SET_SUFFIXES;
}
public static final Comparator<GeocodingResult> DISTANCE_COMPARATOR = new Comparator<GeocodingResult>() { public static final Comparator<GeocodingResult> DISTANCE_COMPARATOR = new Comparator<GeocodingResult>() {
@ -201,15 +179,15 @@ public class GeocodingUtilities {
return lst; return lst;
} }
public List<String> prepareStreetName(String s) { public List<String> prepareStreetName(String s, boolean addCommonWords) {
List<String> ls = new ArrayList<String>(); List<String> ls = new ArrayList<String>();
int beginning = 0; int beginning = 0;
for (int i = 1; i < s.length(); i++) { for (int i = 1; i < s.length(); i++) {
if (s.charAt(i) == ' ') { if (s.charAt(i) == ' ') {
addWord(ls, s.substring(beginning, i)); addWord(ls, s.substring(beginning, i), addCommonWords);
beginning = i; beginning = i;
} else if (s.charAt(i) == '(') { } else if (s.charAt(i) == '(') {
addWord(ls, s.substring(beginning, i)); addWord(ls, s.substring(beginning, i), addCommonWords);
while (i < s.length()) { while (i < s.length()) {
char c = s.charAt(i); char c = s.charAt(i);
i++; i++;
@ -222,15 +200,18 @@ public class GeocodingUtilities {
} }
if (beginning < s.length()) { if (beginning < s.length()) {
String lastWord = s.substring(beginning, s.length()); String lastWord = s.substring(beginning, s.length());
addWord(ls, lastWord); addWord(ls, lastWord, addCommonWords);
} }
Collections.sort(ls, Collator.getInstance()); Collections.sort(ls, Collator.getInstance());
return ls; return ls;
} }
private void addWord(List<String> ls, String word) { private void addWord(List<String> ls, String word, boolean addCommonWords) {
String w = word.trim().toLowerCase(); String w = word.trim().toLowerCase();
if (!Algorithms.isEmpty(w) && !getDefSuffixesSet().contains(w)) { if (!Algorithms.isEmpty(w)) {
if(!addCommonWords && CommonWords.getCommonGeocoding(word) != -1) {
return;
}
ls.add(w); ls.add(w);
} }
} }
@ -239,25 +220,24 @@ public class GeocodingUtilities {
double knownMinBuildingDistance, final ResultMatcher<GeocodingResult> result) throws IOException { double knownMinBuildingDistance, final ResultMatcher<GeocodingResult> result) throws IOException {
// test address index search // test address index search
final List<GeocodingResult> streetsList = new ArrayList<GeocodingResult>(); final List<GeocodingResult> streetsList = new ArrayList<GeocodingResult>();
final List<String> streetNamePacked = prepareStreetName(road.streetName); final List<String> streetNamesUsed = prepareStreetName(road.streetName, true);
if (streetNamePacked.size() > 0) { final List<String> streetNamesPacked = streetNamesUsed.size() == 0 ?
log.info("Search street by name " + road.streetName + " " + streetNamePacked); prepareStreetName(road.streetName, false) : streetNamesUsed;
if (streetNamesPacked.size() > 0) {
log.info("Search street by name " + road.streetName + " " + streetNamesPacked);
String mainWord = ""; String mainWord = "";
for (int i = 0; i < streetNamePacked.size(); i++) { for (int i = 0; i < streetNamesPacked.size(); i++) {
String s = streetNamePacked.get(i); String s = streetNamesPacked.get(i);
if (!getSuffixesSet().contains(s) && s.length() > mainWord.length()) { if (s.length() > mainWord.length()) {
mainWord = s; mainWord = s;
} }
} }
if (Algorithms.isEmpty(mainWord)) {
mainWord = streetNamePacked.get(0);
}
SearchRequest<MapObject> req = BinaryMapIndexReader.buildAddressByNameRequest( SearchRequest<MapObject> req = BinaryMapIndexReader.buildAddressByNameRequest(
new ResultMatcher<MapObject>() { new ResultMatcher<MapObject>() {
@Override @Override
public boolean publish(MapObject object) { public boolean publish(MapObject object) {
if (object instanceof Street if (object instanceof Street
&& prepareStreetName(object.getName()).equals(streetNamePacked)) { && prepareStreetName(object.getName(), true).equals(streetNamesUsed)) {
double d = MapUtils.getDistance(object.getLocation(), road.searchPoint.getLatitude(), double d = MapUtils.getDistance(object.getLocation(), road.searchPoint.getLatitude(),
road.searchPoint.getLongitude()); road.searchPoint.getLongitude());
// double check to suport old format // double check to suport old format