diff --git a/OsmAnd-java/src/main/java/net/osmand/CollatorStringMatcher.java b/OsmAnd-java/src/main/java/net/osmand/CollatorStringMatcher.java index 693be4bd82..bd1a208cfc 100644 --- a/OsmAnd-java/src/main/java/net/osmand/CollatorStringMatcher.java +++ b/OsmAnd-java/src/main/java/net/osmand/CollatorStringMatcher.java @@ -17,12 +17,17 @@ public class CollatorStringMatcher implements StringMatcher { private final String part; public static enum StringMatcherMode { + // tests only first word as base starts with part CHECK_ONLY_STARTS_WITH, + // tests all words (split by space) and one of word should start with a given part CHECK_STARTS_FROM_SPACE, + // tests all words except first (split by space) and one of word should start with a given part CHECK_STARTS_FROM_SPACE_NOT_BEGINNING, + // tests all words (split by space) and one of word should be equal to part CHECK_EQUALS_FROM_SPACE, + // simple collator contains in any part of the base CHECK_CONTAINS, - CHECK_ONLY_STARTS_WITH_TRIM, + // simple collator equals CHECK_EQUALS, } @@ -42,22 +47,20 @@ public class CollatorStringMatcher implements StringMatcher { } - public static boolean cmatches(Collator collator, String base, String part, StringMatcherMode mode){ + public static boolean cmatches(Collator collator, String fullName, String part, StringMatcherMode mode){ switch (mode) { case CHECK_CONTAINS: - return ccontains(collator, base, part); + return ccontains(collator, fullName, part); case CHECK_EQUALS_FROM_SPACE: - return cstartsWith(collator, base, part, true, true, true, false); + return cstartsWith(collator, fullName, part, true, true, true); case CHECK_STARTS_FROM_SPACE: - return cstartsWith(collator, base, part, true, true, false, false); + return cstartsWith(collator, fullName, part, true, true, false); case CHECK_STARTS_FROM_SPACE_NOT_BEGINNING: - return cstartsWith(collator, base, part, false, true, false, false); + return cstartsWith(collator, fullName, part, false, true, false); case CHECK_ONLY_STARTS_WITH: - return cstartsWith(collator, base, part, true, false, false, false); - case CHECK_ONLY_STARTS_WITH_TRIM: - return cstartsWith(collator, base, part, true, false, false, true); + return cstartsWith(collator, fullName, part, true, false, false); case CHECK_EQUALS: - return cstartsWith(collator, base, part, false, false, true, false); + return cstartsWith(collator, fullName, part, false, false, true); } return false; } @@ -116,21 +119,14 @@ public class CollatorStringMatcher implements StringMatcher { * Special check try to find as well in the middle of name * * @param collator - * @param searchInParam + * @param fullText * @param theStart - * @param trim - trim theStart to searchInParam length if searchInParam non empty * @return true if searchIn starts with token */ - public static boolean cstartsWith(Collator collator, String searchInParam, String theStart, - boolean checkBeginning, boolean checkSpaces, boolean equals, boolean trim) { - String searchIn = searchInParam.toLowerCase(Locale.getDefault()); - if (trim && searchIn.length() > 0) { - searchIn += " "; - } + public static boolean cstartsWith(Collator collator, String fullText, String theStart, + boolean checkBeginning, boolean checkSpaces, boolean equals) { + String searchIn = fullText.toLowerCase(Locale.getDefault()); int searchInLength = searchIn.length(); - if (trim && searchInLength > 0 && theStart.length() > searchInLength) { - theStart = theStart.substring(0, searchInLength); - } int startLength = theStart.length(); if (startLength == 0) { return true; diff --git a/OsmAnd-java/src/main/java/net/osmand/binary/CommonWords.java b/OsmAnd-java/src/main/java/net/osmand/binary/CommonWords.java index 55d7461573..5c4c24ee68 100644 --- a/OsmAnd-java/src/main/java/net/osmand/binary/CommonWords.java +++ b/OsmAnd-java/src/main/java/net/osmand/binary/CommonWords.java @@ -13,10 +13,6 @@ public class CommonWords { frequentlyUsedWordsDictionary.put(string, frequentlyUsedWordsDictionary.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(); } @@ -28,7 +24,15 @@ public class CommonWords { public static int getCommonSearch(String name) { Integer i = commonWordsDictionary.get(name); - return i == null ? getFrequentlyUsed(name) : i.intValue() + frequentlyUsedWordsDictionary.size(); + // higher means better for search + if (i == null) { + int fq = getFrequentlyUsed(name); + if (fq != -1) { + return commonWordsDictionary.size() + fq; + } + return -1; + } + return i.intValue(); } public static int getCommonGeocoding(String name) { @@ -839,6 +843,7 @@ public class CommonWords { addCommon("van"); addCommon("road"); addCommon("street"); + addCommon("sector"); addCommon("drive"); addCommon("avenue"); addCommon("rue"); diff --git a/OsmAnd-java/src/main/java/net/osmand/osm/PoiFilter.java b/OsmAnd-java/src/main/java/net/osmand/osm/PoiFilter.java index 4bbf2e2e4b..fbb5fddca7 100644 --- a/OsmAnd-java/src/main/java/net/osmand/osm/PoiFilter.java +++ b/OsmAnd-java/src/main/java/net/osmand/osm/PoiFilter.java @@ -7,38 +7,58 @@ import java.util.List; import java.util.Map; public class PoiFilter extends AbstractPoiType { - - private PoiCategory pc; + + private PoiCategory pc; private List poiTypes = new ArrayList(); private Map map = new LinkedHashMap(); - public PoiFilter(MapPoiTypes registry, PoiCategory pc, String keyName){ + public PoiFilter(MapPoiTypes registry, PoiCategory pc, String keyName) { super(keyName, registry); this.pc = pc; } - + public PoiCategory getPoiCategory() { return pc; } - + public PoiType getPoiTypeByKeyName(String kn) { return map.get(kn); } - + + + public void addExtraPoiTypes(Map poiTypesToAdd) { + List npoiTypes = null; + Map nmap = null; + for (PoiType poiType : poiTypesToAdd.values()) { + if (!map.containsKey(poiType.getKeyName())) { + if (npoiTypes == null) { + npoiTypes = new ArrayList(this.poiTypes); + nmap = new LinkedHashMap<>(map); + } + npoiTypes.add(poiType); + nmap.put(poiType.getKeyName(), poiType); + } + } + if (npoiTypes != null) { + poiTypes = npoiTypes; + map = nmap; + } + } + public void addPoiType(PoiType type) { if (!map.containsKey(type.getKeyName())) { poiTypes.add(type); map.put(type.getKeyName(), type); } else { PoiType prev = map.get(type.getKeyName()); - if(prev.isReference()) { + if (prev.isReference()) { poiTypes.remove(prev); poiTypes.add(type); map.put(type.getKeyName(), type); } } } - + public Map> putTypes(Map> acceptedTypes) { if (!acceptedTypes.containsKey(pc)) { acceptedTypes.put(pc, new LinkedHashSet()); @@ -65,9 +85,10 @@ public class PoiFilter extends AbstractPoiType { } } } - + public List getPoiTypes() { return poiTypes; } + } diff --git a/OsmAnd-java/src/main/java/net/osmand/osm/PoiType.java b/OsmAnd-java/src/main/java/net/osmand/osm/PoiType.java index 20a917964b..5651cf0e03 100644 --- a/OsmAnd-java/src/main/java/net/osmand/osm/PoiType.java +++ b/OsmAnd-java/src/main/java/net/osmand/osm/PoiType.java @@ -26,8 +26,8 @@ public class PoiType extends AbstractPoiType { private int order = 90; - public PoiType(MapPoiTypes poiTypes, PoiCategory category, PoiFilter filter, String name) { - super(name, poiTypes); + public PoiType(MapPoiTypes poiTypes, PoiCategory category, PoiFilter filter, String keyName) { + super(keyName, poiTypes); this.category = category; this.filter = filter; } diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java b/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java index 8849f122ec..9628dff602 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java @@ -1,5 +1,6 @@ package net.osmand.router; +import net.osmand.NativeLibrary; import net.osmand.PlatformUtil; import net.osmand.binary.BinaryMapIndexReader; import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule; @@ -1721,7 +1722,7 @@ public class RouteResultPreparation { } } Iterator it; - if(rr.getPreAttachedRoutes(pointInd) != null) { + if (rr.getPreAttachedRoutes(pointInd) != null) { final RouteSegmentResult[] list = rr.getPreAttachedRoutes(pointInd); it = new Iterator() { int i = 0; @@ -1740,7 +1741,7 @@ public class RouteResultPreparation { public void remove() { } }; - } else if (recalculation) { + } else if (recalculation || ctx.nativeLib == null) { RouteSegment rt = ctx.loadRouteSegment(road.getPoint31XTile(pointInd), road.getPoint31YTile(pointInd), ctx.config.memoryLimitation); it = rt == null ? null : rt.getIterator(); } else { diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RouteSegmentResult.java b/OsmAnd-java/src/main/java/net/osmand/router/RouteSegmentResult.java index cd8f0466f5..9b8e72435e 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RouteSegmentResult.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RouteSegmentResult.java @@ -403,7 +403,7 @@ public class RouteSegmentResult implements StringExternalizable } public void copyPreattachedRoutes(RouteSegmentResult toCopy, int shift) { - if(toCopy.preAttachedRoutes != null) { + if (toCopy.preAttachedRoutes != null) { int l = toCopy.preAttachedRoutes.length - shift; preAttachedRoutes = new RouteSegmentResult[l][]; System.arraycopy(toCopy.preAttachedRoutes, shift, preAttachedRoutes, 0, l); @@ -412,7 +412,7 @@ public class RouteSegmentResult implements StringExternalizable public RouteSegmentResult[] getPreAttachedRoutes(int routeInd) { int st = Math.abs(routeInd - startPointIndex); - if(preAttachedRoutes != null && st < preAttachedRoutes.length) { + if (preAttachedRoutes != null && st < preAttachedRoutes.length) { return preAttachedRoutes[st]; } return null; @@ -421,7 +421,7 @@ public class RouteSegmentResult implements StringExternalizable public List getAttachedRoutes(int routeInd) { int st = Math.abs(routeInd - startPointIndex); List list = attachedRoutes[st]; - if(list == null) { + if (list == null) { return Collections.emptyList(); } return list; diff --git a/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java b/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java index 058abc58fa..46b0ee4e82 100644 --- a/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java +++ b/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java @@ -1,7 +1,6 @@ package net.osmand.search; import net.osmand.Collator; -import net.osmand.OsmAndCollator; import net.osmand.PlatformUtil; import net.osmand.ResultMatcher; import net.osmand.binary.BinaryMapIndexReader; @@ -10,11 +9,13 @@ import net.osmand.data.City; import net.osmand.data.LatLon; import net.osmand.data.MapObject; import net.osmand.data.Street; +import net.osmand.osm.AbstractPoiType; import net.osmand.osm.MapPoiTypes; import net.osmand.search.core.CustomSearchPoiFilter; import net.osmand.search.core.ObjectType; import net.osmand.search.core.SearchCoreAPI; import net.osmand.search.core.SearchCoreFactory; +import net.osmand.search.core.SearchCoreFactory.SearchAmenityByTypeAPI; import net.osmand.search.core.SearchCoreFactory.SearchAmenityTypesAPI; import net.osmand.search.core.SearchCoreFactory.SearchBuildingAndIntersectionsByStreetAPI; import net.osmand.search.core.SearchCoreFactory.SearchStreetByCityAPI; @@ -72,7 +73,7 @@ public class SearchUICore { taskQueue = new LinkedBlockingQueue(); searchSettings = new SearchSettings(new ArrayList()); searchSettings = searchSettings.setLang(locale, transliterate); - phrase = new SearchPhrase(searchSettings, OsmAndCollator.primaryCollator()); + phrase = SearchPhrase.emptyPhrase(searchSettings); currentSearchResult = new SearchResultCollection(phrase); singleThreadedExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, taskQueue); } @@ -325,7 +326,7 @@ public class SearchUICore { apis.add(new SearchCoreFactory.SearchLocationAndUrlAPI()); SearchAmenityTypesAPI searchAmenityTypesAPI = new SearchAmenityTypesAPI(poiTypes); apis.add(searchAmenityTypesAPI); - apis.add(new SearchCoreFactory.SearchAmenityByTypeAPI(poiTypes, searchAmenityTypesAPI)); + apis.add(new SearchAmenityByTypeAPI(poiTypes, searchAmenityTypesAPI)); apis.add(new SearchCoreFactory.SearchAmenityByNameAPI()); SearchBuildingAndIntersectionsByStreetAPI streetsApi = new SearchCoreFactory.SearchBuildingAndIntersectionsByStreetAPI(); @@ -351,10 +352,10 @@ public class SearchUICore { } } - public void setFilterOrders(List filterOrders) { + public void setActivePoiFiltersByOrder(List filterOrders) { for (SearchCoreAPI capi : apis) { if (capi instanceof SearchAmenityTypesAPI) { - ((SearchAmenityTypesAPI) capi).setFilterOrders(filterOrders); + ((SearchAmenityTypesAPI) capi).setActivePoiFiltersByOrder(filterOrders); } } } @@ -404,7 +405,7 @@ public class SearchUICore { } private boolean filterOneResult(SearchResult object, SearchPhrase phrase) { - NameStringMatcher nameStringMatcher = phrase.getNameStringMatcher(); + NameStringMatcher nameStringMatcher = phrase.getFirstUnknownNameStringMatcher(); return nameStringMatcher.matches(object.localeName) || nameStringMatcher.matches(object.otherNames); } @@ -573,6 +574,24 @@ public class SearchUICore { return radius; } + public AbstractPoiType getUnselectedPoiType() { + for (SearchCoreAPI capi : apis) { + if (capi instanceof SearchAmenityByTypeAPI) { + return ((SearchAmenityByTypeAPI) capi).getUnselectedPoiType(); + } + } + return null; + } + + public String getCustomNameFilter() { + for (SearchCoreAPI capi : apis) { + if (capi instanceof SearchAmenityByTypeAPI) { + return ((SearchAmenityByTypeAPI) capi).getNameFilter(); + } + } + return null; + } + void searchInternal(final SearchPhrase phrase, SearchResultMatcher matcher) { preparePhrase(phrase); ArrayList lst = new ArrayList<>(apis); @@ -714,16 +733,16 @@ public class SearchUICore { @Override public boolean publish(SearchResult object) { - if (phrase != null && object.otherNames != null && !phrase.getNameStringMatcher().matches(object.localeName)) { + if (phrase != null && object.otherNames != null && !phrase.getFirstUnknownNameStringMatcher().matches(object.localeName)) { for (String s : object.otherNames) { - if (phrase.getNameStringMatcher().matches(s)) { + if (phrase.getFirstUnknownNameStringMatcher().matches(s)) { object.alternateName = s; break; } } if (Algorithms.isEmpty(object.alternateName) && object.object instanceof Amenity) { for (String value : ((Amenity) object.object).getAdditionalInfo().values()) { - if (phrase.getNameStringMatcher().matches(value)) { + if (phrase.getFirstUnknownNameStringMatcher().matches(value)) { object.alternateName = value; break; } @@ -759,14 +778,28 @@ public class SearchUICore { return exportedCities; } - public void exportObject(MapObject object) { + public void exportObject(SearchPhrase phrase, MapObject object) { + double maxDistance = phrase.getSettings().getExportSettings().getMaxDistance(); + if (maxDistance > 0) { + double distance = MapUtils.getDistance(phrase.getSettings().getOriginalLocation(), object.getLocation()); + if (distance > maxDistance) { + return; + } + } if (exportedObjects == null) { exportedObjects = new ArrayList<>(); } exportedObjects.add(object); } - public void exportCity(City city) { + public void exportCity(SearchPhrase phrase, City city) { + double maxDistance = phrase.getSettings().getExportSettings().getMaxDistance(); + if (maxDistance > 0) { + double distance = MapUtils.getDistance(phrase.getSettings().getOriginalLocation(), city.getLocation()); + if (distance > maxDistance) { + return; + } + } if (exportedCities == null) { exportedCities = new ArrayList<>(); } @@ -816,7 +849,7 @@ public class SearchUICore { SearchExportSettings exportSettings = phrase.getSettings().getExportSettings(); json.put("settings", phrase.getSettings().toJSON()); - json.put("phrase", phrase.getRawUnknownSearchPhrase()); + json.put("phrase", phrase.getFullSearchPhrase()); if (searchResult.searchResults != null && searchResult.searchResults.size() > 0) { JSONArray resultsArr = new JSONArray(); for (SearchResult r : searchResult.searchResults) { @@ -857,8 +890,9 @@ public class SearchUICore { private enum ResultCompareStep { TOP_VISIBLE, - FOUND_WORD_COUNT, - UNKNOWN_PHRASE_MATCH_WEIGHT, + FOUND_WORD_COUNT, // more is better (top) + UNKNOWN_PHRASE_MATCH_WEIGHT, // more is better (top) + COMPARE_AMENITY_TYPE_ADDITIONAL, SEARCH_DISTANCE_IF_NOT_BY_NAME, COMPARE_FIRST_NUMBER_IN_NAME, COMPARE_DISTANCE_TO_PARENT_SEARCH_RESULT, // makes sense only for inner subqueries @@ -909,6 +943,17 @@ public class SearchUICore { } break; } + case COMPARE_AMENITY_TYPE_ADDITIONAL: { + if(o1.object instanceof AbstractPoiType && o2.object instanceof AbstractPoiType ) { + boolean additional1 = ((AbstractPoiType) o1.object).isAdditional(); + boolean additional2 = ((AbstractPoiType) o2.object).isAdditional(); + if (additional1 != additional2) { + // -1 - means 1st is less than 2nd + return additional1 ? 1 : -1; + } + } + break; + } case COMPARE_DISTANCE_TO_PARENT_SEARCH_RESULT: double ps1 = o1.parentSearchResult == null ? 0 : o1.parentSearchResult.getSearchDistance(c.loc); double ps2 = o2.parentSearchResult == null ? 0 : o2.parentSearchResult.getSearchDistance(c.loc); @@ -964,14 +1009,12 @@ public class SearchUICore { } public static class SearchResultComparator implements Comparator { - private SearchPhrase sp; private Collator collator; private LatLon loc; private boolean sortByName; public SearchResultComparator(SearchPhrase sp) { - this.sp = sp; this.collator = sp.getCollator(); loc = sp.getLastTokenLocation(); sortByName = sp.isSortByName(); diff --git a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchCoreFactory.java b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchCoreFactory.java index 0d01c98391..90441f44cb 100644 --- a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchCoreFactory.java +++ b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchCoreFactory.java @@ -1,6 +1,7 @@ package net.osmand.search.core; +import net.osmand.CollatorStringMatcher; import net.osmand.CollatorStringMatcher.StringMatcherMode; import net.osmand.ResultMatcher; import net.osmand.binary.BinaryMapAddressReaderAdapter; @@ -20,7 +21,6 @@ import net.osmand.data.Street; import net.osmand.osm.AbstractPoiType; import net.osmand.osm.MapPoiTypes; import net.osmand.osm.PoiCategory; -import net.osmand.osm.PoiFilter; import net.osmand.osm.PoiType; import net.osmand.search.SearchUICore.SearchResultMatcher; import net.osmand.search.core.SearchPhrase.NameStringMatcher; @@ -48,8 +48,6 @@ import java.util.Map.Entry; import java.util.Set; import java.util.TreeSet; -import gnu.trove.list.array.TIntArrayList; - public class SearchCoreFactory { @@ -140,23 +138,67 @@ public class SearchCoreFactory { return 0; } - protected void subSearchApiOrPublish(SearchPhrase phrase, - SearchResultMatcher resultMatcher, SearchResult res, SearchBaseAPI api) + protected void subSearchApiOrPublish(SearchPhrase phrase, SearchResultMatcher resultMatcher, SearchResult res, SearchBaseAPI api) throws IOException { - phrase.countUnknownWordsMatch(res); -// int cnt = resultMatcher.getCount(); - List ws = phrase.getUnknownSearchWords(res.otherWordsMatch); - if (!res.firstUnknownWordMatches) { - ws.add(phrase.getUnknownSearchWord()); + phrase.countUnknownWordsMatchMainResult(res); + boolean firstUnknownWordMatches = res.firstUnknownWordMatches; + List leftUnknownSearchWords = new ArrayList(phrase.getUnknownSearchWords()); + if(res.otherWordsMatch != null) { + leftUnknownSearchWords.removeAll(res.otherWordsMatch); + } + SearchResult newParentSearchResult = null; + if (res.parentSearchResult == null && resultMatcher.getParentSearchResult() == null && + res.objectType == ObjectType.STREET && res.object instanceof Street && ((Street) res.object).getCity() != null) { + City ct = ((Street) res.object).getCity(); + SearchResult cityResult = new SearchResult(phrase); + cityResult.object = ct; + cityResult.objectType = ObjectType.CITY; + cityResult.localeName = ct.getName(phrase.getSettings().getLang(), phrase.getSettings().isTransliterate()); + cityResult.otherNames = ct.getAllNames(true); + cityResult.location = ct.getLocation(); + cityResult.localeRelatedObjectName = res.file.getRegionName(); + cityResult.file = res.file; + phrase.countUnknownWordsMatchMainResult(cityResult); + boolean match = false; + if (firstUnknownWordMatches) { + cityResult.firstUnknownWordMatches = false; // don't count same name twice + } else if (cityResult.firstUnknownWordMatches) { + firstUnknownWordMatches = true; + match = true; + } + if (cityResult.otherWordsMatch != null) { + Iterator iterator = cityResult.otherWordsMatch.iterator(); + while (iterator.hasNext()) { + String n = iterator.next(); + boolean wasPresent = leftUnknownSearchWords.remove(n); + if (!wasPresent) { + iterator.remove(); // don't count same name twice + } else { + match = true; + } + } + } + // include parent search result even if it is empty + if (match) { + newParentSearchResult = cityResult; + } + } + if (!firstUnknownWordMatches) { + leftUnknownSearchWords.add(0, phrase.getFirstUnknownSearchWord()); } // publish result to set parentSearchResult before search - resultMatcher.publish(res); - if (!ws.isEmpty() && api != null && api.isSearchAvailable(phrase)) { - SearchPhrase nphrase = phrase.selectWord(res, ws, - phrase.isLastUnknownSearchWordComplete()); - resultMatcher.setParentSearchResult(res); + if(newParentSearchResult != null) { + SearchResult prev = resultMatcher.setParentSearchResult(newParentSearchResult); + resultMatcher.publish(res); + resultMatcher.setParentSearchResult(prev); + } else { + resultMatcher.publish(res); + } + if (!leftUnknownSearchWords.isEmpty() && api != null && api.isSearchAvailable(phrase)) { + SearchPhrase nphrase = phrase.selectWord(res, leftUnknownSearchWords, phrase.isLastUnknownSearchWordComplete()); + SearchResult prev = resultMatcher.setParentSearchResult(res); api.search(nphrase, resultMatcher); - resultMatcher.setParentSearchResult(res.parentSearchResult); + resultMatcher.setParentSearchResult(prev); } } @@ -166,8 +208,6 @@ public class SearchCoreFactory { } } - - public static class SearchRegionByNameAPI extends SearchBaseAPI { public SearchRegionByNameAPI() { @@ -186,9 +226,9 @@ public class SearchCoreFactory { sr.objectType = ObjectType.REGION; sr.location = bmir.getRegionCenter(); sr.preferredZoom = 6; - if (phrase.getUnknownSearchWordLength() <= 1 && phrase.isNoSelectedType()) { + if (phrase.getFullSearchPhrase().length() <= 1 && phrase.isNoSelectedType()) { resultMatcher.publish(sr); - } else if (phrase.getNameStringMatcher().matches(sr.localeName)) { + } else if (phrase.getFirstUnknownNameStringMatcher().matches(sr.localeName)) { resultMatcher.publish(sr); } } @@ -210,19 +250,6 @@ public class SearchCoreFactory { } } - private static String stripBraces(String localeName) { - int i = localeName.indexOf('('); - String retName = localeName; - if (i > -1) { - retName = localeName.substring(0, i); - int j = localeName.indexOf(')', i); - if (j > -1) { - retName = retName.trim() + ' ' + localeName.substring(j); - } - } - return retName; - } - public static class SearchAddressByNameAPI extends SearchBaseAPI { private static final int DEFAULT_ADDRESS_BBOX_RADIUS = 100 * 1000; @@ -310,16 +337,13 @@ public class SearchCoreFactory { if (phrase.isNoSelectedType() && bbox != null && (phrase.isUnknownSearchWordPresent() || phrase.isEmptyQueryAllowed()) && phrase.isSearchTypeAllowed(ObjectType.CITY)) { - String word = phrase.getUnknownWordToSearch(); - NameStringMatcher nm = phrase.getNameStringMatcher(word, phrase.isUnknownSearchWordComplete()); - NameStringMatcher wordEqualsMatcher = phrase.getNameStringMatcher(word, true); - boolean firstUnknownWordMatches = word.equals(phrase.getUnknownSearchWord()); + NameStringMatcher nm = phrase.getMainUnknownNameStringMatcher(); resArray.clear(); resArray = townCitiesQR.queryInBox(bbox, resArray); int limit = 0; for (City c : resArray) { if (phrase.getSettings().isExportObjects()) { - resultMatcher.exportCity(c); + resultMatcher.exportCity(phrase, c); } SearchResult res = new SearchResult(phrase); res.object = c; @@ -335,8 +359,6 @@ public class SearchCoreFactory { if (phrase.isEmptyQueryAllowed() && phrase.isEmpty()) { resultMatcher.publish(res); } else if (nm.matches(res.localeName) || nm.matches(res.otherNames)) { - res.firstUnknownWordMatches = firstUnknownWordMatches; - res.unknownPhraseMatches = wordEqualsMatcher.matches(res.localeName); subSearchApiOrPublish(phrase, resultMatcher, res, cityApi); } if (limit++ > LIMIT * phrase.getRadiusLevel()) { @@ -348,7 +370,8 @@ public class SearchCoreFactory { private void searchByName(final SearchPhrase phrase, final SearchResultMatcher resultMatcher) throws IOException { - if (phrase.getRadiusLevel() > 1 || phrase.getUnknownSearchWordLength() > 3 || phrase.getUnknownSearchWords().size() > 0 || phrase.isSearchTypeAllowed(ObjectType.POSTCODE, true)) { + if (phrase.getRadiusLevel() > 1 || phrase.getUnknownWordToSearch().length() > 3 || + phrase.hasMoreThanOneUnknownSearchWord()|| phrase.isSearchTypeAllowed(ObjectType.POSTCODE, true)) { final boolean locSpecified = phrase.getLastTokenLocation() != null; LatLon loc = phrase.getLastTokenLocation(); final List immediateResults = new ArrayList<>(); @@ -365,7 +388,7 @@ public class SearchCoreFactory { @Override public boolean publish(MapObject object) { if (phrase.getSettings().isExportObjects()) { - resultMatcher.exportObject(object); + resultMatcher.exportObject(phrase, object); } if (isCancelled()) { return false; @@ -391,7 +414,7 @@ public class SearchCoreFactory { if (object.getName().startsWith("<")) { return false; } - if (!phrase.getNameStringMatcher().matches(stripBraces(sr.localeName))) { + if (!phrase.getFirstUnknownNameStringMatcher().matches(stripBraces(sr.localeName))) { sr.priorityDistance = 5; } sr.objectType = ObjectType.STREET; @@ -460,16 +483,13 @@ public class SearchCoreFactory { }; Iterator offlineIterator = phrase.getRadiusOfflineIndexes(DEFAULT_ADDRESS_BBOX_RADIUS * 5, SearchPhraseDataType.ADDRESS); - String wordToSearch = phrase.getUnknownWordToSearch(); - NameStringMatcher wordEqualsMatcher = phrase.getNameStringMatcher(wordToSearch, true); - boolean firstUnknownWordMatches = wordToSearch.equals(phrase.getUnknownSearchWord()); while (offlineIterator.hasNext() && wordToSearch.length() > 0) { BinaryMapIndexReader r = offlineIterator.next(); currentFile[0] = r; immediateResults.clear(); SearchRequest req = BinaryMapIndexReader.buildAddressByNameRequest(rm, wordToSearch.toLowerCase(), - phrase.isUnknownSearchWordComplete() ? StringMatcherMode.CHECK_EQUALS_FROM_SPACE + phrase.isMainUnknownSearchWordComplete() ? StringMatcherMode.CHECK_EQUALS_FROM_SPACE : StringMatcherMode.CHECK_STARTS_FROM_SPACE); if (locSpecified) { req.setBBoxRadius(loc.getLatitude(), loc.getLongitude(), @@ -477,13 +497,7 @@ public class SearchCoreFactory { } r.searchAddressDataByName(req); for (SearchResult res : immediateResults) { - res.firstUnknownWordMatches = firstUnknownWordMatches; - res.unknownPhraseMatches = wordEqualsMatcher.matches(res.localeName); if (res.objectType == ObjectType.STREET) { - City ct = ((Street) res.object).getCity(); - phrase.countUnknownWordsMatch(res, - ct.getName(phrase.getSettings().getLang(), phrase.getSettings().isTransliterate()), - ct.getAllNames(true)); subSearchApiOrPublish(phrase, resultMatcher, res, streetsApi); } else { subSearchApiOrPublish(phrase, resultMatcher, res, cityApi); @@ -510,35 +524,31 @@ public class SearchCoreFactory { if (!phrase.isUnknownSearchWordPresent()) { return false; } - boolean hasUnselectedType = phrase.isNoSelectedType() && phrase.isUnknownSearchWordPresent() - && phrase.isUnknownSearchWordComplete() && phrase.hasUnknownSearchWordPoiTypes(); + if (!phrase.isNoSelectedType()) { + // don't search by name when type is selected or poi type is part of name + return false; + } + // Take into account POI [bar] - 'Hospital 512' + // BEFORE: it was searching exact match of whole phrase.getUnknownSearchPhrase() [ Check feedback ] + final BinaryMapIndexReader[] currentFile = new BinaryMapIndexReader[1]; Iterator offlineIterator = phrase.getRadiusOfflineIndexes(BBOX_RADIUS, SearchPhraseDataType.POI); - String unknownSearchPhrase = phrase.getUnknownSearchPhrase().trim(); - String searchWord = hasUnselectedType ? unknownSearchPhrase : phrase.getUnknownWordToSearch(); - final NameStringMatcher nm = phrase.getNameStringMatcher(searchWord, phrase.isUnknownSearchWordComplete()); - final NameStringMatcher phraseMatcher; - if (!Algorithms.isEmpty(unknownSearchPhrase)) { - phraseMatcher = new NameStringMatcher(unknownSearchPhrase, StringMatcherMode.CHECK_EQUALS); - } else { - phraseMatcher = null; - } + String searchWord = phrase.getUnknownWordToSearch(); + final NameStringMatcher nm = phrase.getMainUnknownNameStringMatcher(); QuadRect bbox = phrase.getRadiusBBoxToSearch(BBOX_RADIUS_INSIDE); final Set ids = new HashSet(); - SearchRequest req = BinaryMapIndexReader.buildSearchPoiRequest( - (int)bbox.centerX(), (int)bbox.centerY(), - searchWord, - (int)bbox.left, (int)bbox.right, - (int)bbox.top, (int)bbox.bottom, - new ResultMatcher() { + SearchRequest req = BinaryMapIndexReader.buildSearchPoiRequest((int) bbox.centerX(), + (int) bbox.centerY(), searchWord, (int) bbox.left, (int) bbox.right, (int) bbox.top, + (int) bbox.bottom, new ResultMatcher() { int limit = 0; + @Override public boolean publish(Amenity object) { if (phrase.getSettings().isExportObjects()) { - resultMatcher.exportObject(object); + resultMatcher.exportObject(phrase, object); } - if (limit ++ > LIMIT) { + if (limit++ > LIMIT) { return false; } String poiID = object.getType().getKeyName() + "_" + object.getId(); @@ -547,19 +557,17 @@ public class SearchCoreFactory { } SearchResult sr = new SearchResult(phrase); sr.otherNames = object.getAllNames(true); - sr.localeName = object.getName(phrase.getSettings().getLang(), phrase.getSettings().isTransliterate()); - if (phrase.isUnknownSearchWordComplete()) { - if(!nm.matches(sr.localeName) && !nm.matches(sr.otherNames) && - !nm.matches(object.getAdditionalInfo().values())) { - return false; - } + sr.localeName = object.getName(phrase.getSettings().getLang(), + phrase.getSettings().isTransliterate()); + if (!nm.matches(sr.localeName) && !nm.matches(sr.otherNames) + && !nm.matches(object.getAdditionalInfo().values())) { + return false; } sr.object = object; sr.preferredZoom = 17; sr.file = currentFile[0]; sr.location = object.getLocation(); - if (object.getSubType().equals("city") || - object.getSubType().equals("country")) { + if (object.getSubType().equals("city") || object.getSubType().equals("country")) { sr.priorityDistance = SEARCH_AMENITY_BY_NAME_CITY_PRIORITY_DISTANCE; sr.preferredZoom = object.getSubType().equals("country") ? 7 : 13; } else if (object.getSubType().equals("town")) { @@ -568,10 +576,7 @@ public class SearchCoreFactory { sr.priorityDistance = 1; } sr.priority = SEARCH_AMENITY_BY_NAME_PRIORITY; - if (phraseMatcher != null) { - sr.unknownPhraseMatches = phraseMatcher.matches(sr.localeName); - } - phrase.countUnknownWordsMatch(sr); + phrase.countUnknownWordsMatchMainResult(sr); sr.objectType = ObjectType.POI; resultMatcher.publish(sr); ids.add(poiID); @@ -580,7 +585,7 @@ public class SearchCoreFactory { @Override public boolean isCancelled() { - return resultMatcher.isCancelled() && (limit < LIMIT) ; + return resultMatcher.isCancelled() && (limit < LIMIT); } }); @@ -633,9 +638,8 @@ public class SearchCoreFactory { private List topVisibleFilters; private List categories; private List customPoiFilters = new ArrayList<>(); - private TIntArrayList customPoiFiltersPriorites = new TIntArrayList(); + private Map activePoiFilters = new HashMap<>(); private MapPoiTypes types; - private List filterOrders = new ArrayList<>(); public SearchAmenityTypesAPI(MapPoiTypes types) { super(ObjectType.POI_TYPE); @@ -644,126 +648,170 @@ public class SearchCoreFactory { public void clearCustomFilters() { this.customPoiFilters.clear(); - this.customPoiFiltersPriorites.clear(); + this.activePoiFilters.clear(); } public void addCustomFilter(CustomSearchPoiFilter poiFilter, int priority) { this.customPoiFilters.add(poiFilter); - this.customPoiFiltersPriorites.add(priority); + if (priority > 0) { + this.activePoiFilters.put(poiFilter.getFilterId(), priority); + } } - public void setFilterOrders(List filterOrders) { - this.filterOrders = filterOrders; + public void setActivePoiFiltersByOrder(List filterOrder) { + for (int i = 0; i < filterOrder.size(); i++) { + this.activePoiFilters.put(filterOrder.get(i), i); + } } - - @Override - public boolean search(SearchPhrase phrase, SearchResultMatcher resultMatcher) throws IOException { - if (translatedNames.isEmpty()) { - translatedNames = types.getAllTranslatedNames(false); - topVisibleFilters = types.getTopVisibleFilters(); - categories = types.getCategories(false); - } - List results = new ArrayList(); - List searchWordTypes = new ArrayList(); - NameStringMatcher nm; - String unknownSearchPhrase = phrase.getUnknownSearchPhrase(); - boolean showTopFiltersOnly = !phrase.isUnknownSearchWordPresent(); - if (phrase.getUnknownSearchWord().length() < unknownSearchPhrase.length()) { - nm = new NameStringMatcher(unknownSearchPhrase, StringMatcherMode.CHECK_ONLY_STARTS_WITH_TRIM); - } else { - nm = new NameStringMatcher(unknownSearchPhrase, StringMatcherMode.CHECK_STARTS_FROM_SPACE); - } + + public Map> getPoiTypeResults(NameStringMatcher nm, boolean includeAdditionals) { + Map> results = new LinkedHashMap<>(); for (AbstractPoiType pf : topVisibleFilters) { - if (showTopFiltersOnly - || nm.matches(pf.getTranslation()) - || nm.matches(pf.getEnTranslation()) - || nm.matches(pf.getSynonyms())) { - results.add(pf); - searchWordTypes.add(pf); - } + checkPoiType(nm, pf, results); } - if (!showTopFiltersOnly) { - for (PoiCategory c : categories) { - if (!results.contains(c) - && (nm.matches(c.getTranslation()) - || nm.matches(c.getEnTranslation()) - || nm.matches(c.getSynonyms()))) { - results.add(c); - searchWordTypes.add(c); - } - } - Iterator> it = translatedNames.entrySet().iterator(); - while (it.hasNext()) { - Entry e = it.next(); - PoiType pt = e.getValue(); - if (pt.getCategory() != types.getOtherMapCategory()) { - if (!results.contains(pt) - && (nm.matches(pt.getEnTranslation()) - || nm.matches(pt.getTranslation()) - || nm.matches(pt.getSynonyms()))) { - results.add(pt); - searchWordTypes.add(pt); - } - List additionals = pt.getPoiAdditionals(); - if (additionals != null) { - for (PoiType a : additionals) { - if (!results.contains(a)) { - String enTranslation = a.getEnTranslation().toLowerCase(); - if (!"yes".equals(enTranslation) && !"no".equals(enTranslation) - && (nm.matches(enTranslation) || nm.matches(a.getTranslation()) || nm.matches(a.getSynonyms()))) { - results.add(a); - } + for (PoiCategory c : categories) { + checkPoiType(nm, c, results); + } + Iterator> it = translatedNames.entrySet().iterator(); + while (it.hasNext()) { + Entry e = it.next(); + PoiType pt = e.getValue(); + if (pt.getCategory() != types.getOtherMapCategory()) { + checkPoiType(nm, pt, results); + List additionals = pt.getPoiAdditionals(); + if (additionals != null && includeAdditionals) { + for (PoiType a : additionals) { + if (!results.containsKey(a)) { + String enTranslation = a.getEnTranslation().toLowerCase(); + if (!"yes".equals(enTranslation) && !"no".equals(enTranslation)) { + checkPoiType(nm, a, results); } } } } } } - phrase.setUnknownSearchWordPoiTypes(searchWordTypes); + return results; + } - if (resultMatcher != null) { - String word = phrase.getUnknownSearchWord(); - NameStringMatcher startMatch = new NameStringMatcher(word, StringMatcherMode.CHECK_ONLY_STARTS_WITH); - for (AbstractPoiType pt : results) { + private void checkPoiType(NameStringMatcher nm, AbstractPoiType pf, Map> results) { + List lst = results.get(pf); + boolean nl = lst == null; + if (nm.matches(pf.getTranslation())) { + lst = addToList(pf.getTranslation(), lst); + } + if (nm.matches(pf.getEnTranslation())) { + lst = addToList(pf.getEnTranslation(), lst); + } + if (nm.matches(pf.getKeyName())) { + lst = addToList(pf.getKeyName().replace('_', ' '), lst); + } + + if (nm.matches(pf.getSynonyms())) { + String[] synonyms = pf.getSynonyms().split(";"); + for (String synonym : synonyms) { + if (nm.matches(synonym)) { + lst = addToList(synonym, lst); + } + } + } + if(lst != null && nl) { + results.put(pf, lst); + } + } + + private List addToList(String s, List lst) { + if(lst == null) { + lst = new ArrayList<>(); + } + lst.add(s); + return lst; + } + + private void initPoiTypes() { + if (translatedNames.isEmpty()) { + translatedNames = types.getAllTranslatedNames(false); + topVisibleFilters = types.getTopVisibleFilters(); + topVisibleFilters.remove(types.getOsmwiki()); + categories = types.getCategories(false); + } + } + + @Override + public boolean search(SearchPhrase phrase, SearchResultMatcher resultMatcher) throws IOException { + boolean showTopFiltersOnly = !phrase.isUnknownSearchWordPresent(); + NameStringMatcher nm = phrase.getFirstUnknownNameStringMatcher(); + initPoiTypes(); + if (showTopFiltersOnly) { + for (AbstractPoiType pt : topVisibleFilters) { SearchResult res = new SearchResult(phrase); res.localeName = pt.getTranslation(); res.object = pt; - res.priorityDistance = 0; - res.objectType = ObjectType.POI_TYPE; - res.firstUnknownWordMatches = startMatch.matches(res.localeName); - if (showTopFiltersOnly) { - String stdFilterId = getStandardFilterId(pt); - if (filterOrders.contains(stdFilterId)) { - res.priority = SEARCH_AMENITY_TYPE_PRIORITY + filterOrders.indexOf(stdFilterId); - resultMatcher.publish(res); + addPoiTypeResult(phrase, resultMatcher, showTopFiltersOnly, getStandardFilterId(pt), res); + } + + } else { + boolean includeAdditional = !phrase.hasMoreThanOneUnknownSearchWord(); + Map> poiTypes = getPoiTypeResults(nm, includeAdditional); + for (Entry> pt : poiTypes.entrySet()) { + boolean match = !phrase.isFirstUnknownSearchWordComplete(); + if (!match) { + for (String foundName : pt.getValue()) { + CollatorStringMatcher csm = new CollatorStringMatcher(foundName, StringMatcherMode.CHECK_ONLY_STARTS_WITH); + match = csm.matches(phrase.getUnknownSearchPhrase()); + if (match) { + break; + } } - } else { - res.priority = SEARCH_AMENITY_TYPE_PRIORITY; - resultMatcher.publish(res); + } + if (match) { + SearchResult res = new SearchResult(phrase); + res.localeName = pt.getKey().getTranslation(); + res.object = pt.getKey(); + addPoiTypeResult(phrase, resultMatcher, showTopFiltersOnly, getStandardFilterId(pt.getKey()), + res); } } - for (int i = 0; i < customPoiFilters.size(); i++) { - CustomSearchPoiFilter csf = customPoiFilters.get(i); - if (!phrase.isUnknownSearchWordPresent() || nm.matches(csf.getName())) { - SearchResult res = new SearchResult(phrase); - res.localeName = csf.getName(); - res.object = csf; - res.objectType = ObjectType.POI_TYPE; - if (showTopFiltersOnly) { - if (filterOrders.contains(csf.getFilterId())) { - res.priority = SEARCH_AMENITY_TYPE_PRIORITY + filterOrders.indexOf(csf.getFilterId()); - resultMatcher.publish(res); - } - } else { - res.priority = SEARCH_AMENITY_TYPE_PRIORITY + customPoiFiltersPriorites.get(i); - resultMatcher.publish(res); - } - } + } + for (int i = 0; i < customPoiFilters.size(); i++) { + CustomSearchPoiFilter csf = customPoiFilters.get(i); + if (showTopFiltersOnly || nm.matches(csf.getName())) { + SearchResult res = new SearchResult(phrase); + res.localeName = csf.getName(); + res.object = csf; + addPoiTypeResult(phrase, resultMatcher, showTopFiltersOnly, csf.getFilterId(), res); } } return true; } + private void addPoiTypeResult(SearchPhrase phrase, SearchResultMatcher resultMatcher, boolean showTopFiltersOnly, + String stdFilterId , SearchResult res) { + res.priorityDistance = 0; + res.objectType = ObjectType.POI_TYPE; + res.firstUnknownWordMatches = true; + if (showTopFiltersOnly) { + if (activePoiFilters.containsKey(stdFilterId)) { + res.priority = getPoiTypePriority(stdFilterId); + resultMatcher.publish(res); + } + } else { + phrase.countUnknownWordsMatchMainResult(res); + res.priority = SEARCH_AMENITY_TYPE_PRIORITY; + resultMatcher.publish(res); + } + } + + private int getPoiTypePriority(String stdFilterId) { + Integer i = activePoiFilters.get(stdFilterId); + if ( i == null) { + return SEARCH_AMENITY_TYPE_PRIORITY; + } + return SEARCH_AMENITY_TYPE_PRIORITY + i.intValue(); + } + + + public String getStandardFilterId(AbstractPoiType poi) { return STD_POI_FILTER_PREFIX + poi.getKeyName(); } @@ -792,15 +840,24 @@ public class SearchCoreFactory { public static class SearchAmenityByTypeAPI extends SearchBaseAPI { private static final int BBOX_RADIUS = 10000; private SearchAmenityTypesAPI searchAmenityTypesAPI; - private MapPoiTypes types; - + private AbstractPoiType unselectedPoiType; + private String nameFilter; + public SearchAmenityByTypeAPI(MapPoiTypes types, SearchAmenityTypesAPI searchAmenityTypesAPI) { super(ObjectType.POI); this.types = types; this.searchAmenityTypesAPI = searchAmenityTypesAPI; } + public AbstractPoiType getUnselectedPoiType() { + return unselectedPoiType; + } + + public String getNameFilter() { + return nameFilter; + } + @Override public boolean isSearchMoreAvailable(SearchPhrase phrase) { return getSearchPriority(phrase) != -1 && super.isSearchMoreAvailable(phrase); @@ -816,110 +873,107 @@ public class SearchCoreFactory { return phrase.getNextRadiusSearch(BBOX_RADIUS); } - private Map> acceptedTypes = new LinkedHashMap>(); - private Map poiAdditionals = new HashMap(); - public void updateTypesToAccept(AbstractPoiType pt) { - pt.putTypes(acceptedTypes); - if (pt instanceof PoiType && ((PoiType) pt).isAdditional() && ((PoiType) pt).getParentType() != null) { - fillPoiAdditionals(((PoiType) pt).getParentType()); - } else { - fillPoiAdditionals(pt); - } - } - - private void fillPoiAdditionals(AbstractPoiType pt) { - for (PoiType add : pt.getPoiAdditionals()) { - poiAdditionals.put(add.getKeyName().replace('_', ':').replace(' ', ':'), add); - poiAdditionals.put(add.getTranslation().replace(' ', ':').toLowerCase(), add); - } - if (pt instanceof PoiFilter && !(pt instanceof PoiCategory)) { - for (PoiType ps : ((PoiFilter) pt).getPoiTypes()) { - fillPoiAdditionals(ps); - } - } - } - @Override public boolean search(final SearchPhrase phrase, final SearchResultMatcher resultMatcher) throws IOException { + unselectedPoiType = null; + SearchPoiTypeFilter poiTypeFilter = null; + String nameFilter = null; + int countExtraWords = 0; + Map poiAdditionals = new LinkedHashMap(); if (phrase.isLastWord(ObjectType.POI_TYPE)) { Object obj = phrase.getLastSelectedWord().getResult().object; - SearchPoiTypeFilter ptf; if (obj instanceof AbstractPoiType) { - ptf = getPoiTypeFilter((AbstractPoiType) obj); + poiTypeFilter = getPoiTypeFilter((AbstractPoiType) obj, poiAdditionals); } else if (obj instanceof SearchPoiTypeFilter) { - ptf = (SearchPoiTypeFilter) obj; + poiTypeFilter = (SearchPoiTypeFilter) obj; } else { throw new UnsupportedOperationException(); } - searchPoi(phrase, resultMatcher, obj, null, ptf); - } else if (searchAmenityTypesAPI != null) { - if (phrase.getUnknownSearchWordPoiTypes() == null) { - searchAmenityTypesAPI.search(phrase, null); - } - AbstractPoiType poiType = phrase.getUnknownSearchWordPoiType(); - if (poiType != null) { - SearchPoiTypeFilter ptf = getPoiTypeFilter(poiType); - String customName = phrase.getPoiNameFilter(poiType); - if (customName != null) { - phrase.setUnknownSearchWordPoiType(poiType); - searchPoi(phrase, resultMatcher, null, customName.length() == 0 ? null : customName, ptf); + nameFilter = phrase.getUnknownSearchPhrase(); + } else if (searchAmenityTypesAPI != null && phrase.isFirstUnknownSearchWordComplete()) { + NameStringMatcher nm = phrase.getFirstUnknownNameStringMatcher(); + searchAmenityTypesAPI.initPoiTypes(); + Map> poiTypeResults = searchAmenityTypesAPI.getPoiTypeResults(nm, true); + // find first full match only + for (Entry> poiType : poiTypeResults.entrySet()) { + for (String foundName : poiType.getValue()) { + CollatorStringMatcher csm = new CollatorStringMatcher(foundName, StringMatcherMode.CHECK_ONLY_STARTS_WITH); + // matches only completely + int mwords = phrase.countWords(foundName) ; + if (csm.matches(phrase.getUnknownSearchPhrase()) && countExtraWords < mwords) { + countExtraWords = phrase.countWords(foundName); + List otherSearchWords = phrase.getUnknownSearchWords(); + nameFilter = null; + if (countExtraWords - 1 < otherSearchWords.size()) { + nameFilter = ""; + for(int k = countExtraWords - 1; k < otherSearchWords.size(); k++) { + if(nameFilter.length() > 0) { + nameFilter += SearchPhrase.DELIMITER; + } + nameFilter += otherSearchWords.get(k); + } + } + poiTypeFilter = getPoiTypeFilter(poiType.getKey(), poiAdditionals); + unselectedPoiType = poiType.getKey(); + } } } } + this.nameFilter = nameFilter; + if (poiTypeFilter != null) { + QuadRect bbox = phrase.getRadiusBBoxToSearch(BBOX_RADIUS); + List offlineIndexes = phrase.getOfflineIndexes(); + Set searchedPois = new TreeSet<>(); + for (BinaryMapIndexReader r : offlineIndexes) { + ResultMatcher rm = getResultMatcher(phrase, poiTypeFilter, resultMatcher, nameFilter, r, + searchedPois, poiAdditionals, countExtraWords); + if (poiTypeFilter instanceof CustomSearchPoiFilter) { + rm = ((CustomSearchPoiFilter) poiTypeFilter).wrapResultMatcher(rm); + } + SearchRequest req = BinaryMapIndexReader.buildSearchPoiRequest((int) bbox.left, + (int) bbox.right, (int) bbox.top, (int) bbox.bottom, -1, poiTypeFilter, rm); + r.searchPoi(req); + resultMatcher.apiSearchRegionFinished(this, r, phrase); + } + } return true; } - private void searchPoi(SearchPhrase phrase, SearchResultMatcher resultMatcher, Object obj, String customName, SearchPoiTypeFilter ptf) throws IOException { - QuadRect bbox = phrase.getRadiusBBoxToSearch(BBOX_RADIUS); - List oo = phrase.getOfflineIndexes(); - Set searchedPois = new TreeSet<>(); - for (BinaryMapIndexReader o : oo) { - ResultMatcher rm = getResultMatcher(phrase, resultMatcher, customName, o, searchedPois); - if (obj instanceof CustomSearchPoiFilter) { - rm = ((CustomSearchPoiFilter) obj).wrapResultMatcher(rm); - } - SearchRequest req = BinaryMapIndexReader.buildSearchPoiRequest( - (int) bbox.left, (int) bbox.right, - (int) bbox.top, (int) bbox.bottom, -1, ptf, - rm); - o.searchPoi(req); - resultMatcher.apiSearchRegionFinished(this, o, phrase); - } - } - private ResultMatcher getResultMatcher(final SearchPhrase phrase, final SearchResultMatcher resultMatcher, - final String customName, final BinaryMapIndexReader selected, - final Set searchedPois) { - String unknownSearchPhrase = phrase.getUnknownSearchPhrase().trim(); - final NameStringMatcher phraseMatcher; - if (!Algorithms.isEmpty(unknownSearchPhrase)) { - phraseMatcher = new NameStringMatcher(unknownSearchPhrase, StringMatcherMode.CHECK_EQUALS); - } else { - phraseMatcher = null; - } - final NameStringMatcher ns; - final boolean hasCustomName = !Algorithms.isEmpty(customName); - if (hasCustomName) { - ns = phrase.getNameStringMatcher(customName, phrase.isLastUnknownSearchWordComplete()); - } else { - ns = phrase.getNameStringMatcher(); - } + private ResultMatcher getResultMatcher(final SearchPhrase phrase, final SearchPoiTypeFilter poiTypeFilter, + final SearchResultMatcher resultMatcher, final String nameFilter, + final BinaryMapIndexReader selected, final Set searchedPois, + final Map poiAdditionals, final int countExtraWords) { + + + final NameStringMatcher ns = nameFilter == null ? null : new NameStringMatcher(nameFilter, StringMatcherMode.CHECK_STARTS_FROM_SPACE); return new ResultMatcher() { @Override public boolean publish(Amenity object) { if (phrase.getSettings().isExportObjects()) { - resultMatcher.exportObject(object); + resultMatcher.exportObject(phrase, object); } SearchResult res = new SearchResult(phrase); String poiID = object.getType().getKeyName() + "_" + object.getId(); - if(!searchedPois.add(poiID)) { + if (!searchedPois.add(poiID)) { return false; } - if(object.isClosed()) { + if (object.isClosed()) { return false; } + if (!poiAdditionals.isEmpty()) { + boolean found = false; + for (String add : poiAdditionals.keySet()) { + if(object.getAdditionalInfo().containsKey(add)) { + found = true; + break; + } + } + if (!found) { + return false; + } + } res.localeName = object.getName(phrase.getSettings().getLang(), phrase.getSettings().isTransliterate()); res.otherNames = object.getAllNames(true); if (Algorithms.isEmpty(res.localeName)) { @@ -930,13 +984,17 @@ public class SearchCoreFactory { res.localeName = object.getSubType(); } } - if (phrase.isUnknownSearchWordPresent() - && !(ns.matches(res.localeName) || ns.matches(res.otherNames))) { - String ref = object.getTagContent(Amenity.REF, null); - if(ref == null || !ns.matches(ref)) { - return false; + if (ns != null) { + if (ns.matches(res.localeName) || ns.matches(res.otherNames)) { + phrase.countUnknownWordsMatchMainResult(res, countExtraWords); } else { - res.localeName += " " + ref; + String ref = object.getTagContent(Amenity.REF, null); + if (ref == null || !ns.matches(ref)) { + return false; + } else { + phrase.countUnknownWordsMatch(res, ref, null, countExtraWords); + res.localeName += " " + ref; + } } } @@ -946,16 +1004,6 @@ public class SearchCoreFactory { res.location = object.getLocation(); res.priority = SEARCH_AMENITY_BY_TYPE_PRIORITY; res.priorityDistance = 1; - if (phraseMatcher != null) { - boolean unknownPhraseMatches = phraseMatcher.matches(res.localeName); - AbstractPoiType unknownSearchWordPoiType = phrase.getUnknownSearchWordPoiType(); - if (unknownPhraseMatches && unknownSearchWordPoiType != null) { - unknownPhraseMatches = !phraseMatcher.matches(unknownSearchWordPoiType.getTranslation()) - && !phraseMatcher.matches(unknownSearchWordPoiType.getEnTranslation()) - && !phraseMatcher.matches(unknownSearchWordPoiType.getSynonyms()); - } - res.unknownPhraseMatches = unknownPhraseMatches; - } res.objectType = ObjectType.POI; resultMatcher.publish(res); return false; @@ -968,11 +1016,14 @@ public class SearchCoreFactory { }; } - private SearchPoiTypeFilter getPoiTypeFilter(AbstractPoiType pt) { - - acceptedTypes.clear(); + private SearchPoiTypeFilter getPoiTypeFilter(AbstractPoiType pt, Map poiAdditionals ) { + final Map> acceptedTypes = new LinkedHashMap>(); + pt.putTypes(acceptedTypes); poiAdditionals.clear(); - updateTypesToAccept(pt); + if (pt instanceof PoiType && ((PoiType) pt).isAdditional() && ((PoiType) pt).getParentType() != null) { + poiAdditionals.put(pt.getKeyName(), (PoiType) pt); + } return new SearchPoiTypeFilter() { @Override @@ -1045,16 +1096,8 @@ public class SearchCoreFactory { sw.getResult().file.preloadStreets(c, null); } int limit = 0; - String wordToSearch = phrase.getUnknownWordToSearch(); - boolean firstUnknownWordMatches = wordToSearch.equals(phrase.getUnknownSearchWord()); - NameStringMatcher nm = phrase.getNameStringMatcher(wordToSearch, phrase.isUnknownSearchWordComplete()); - String unknownSearchPhrase = phrase.getUnknownSearchPhrase().trim(); - NameStringMatcher phraseMatcher = null; - if (!Algorithms.isEmpty(unknownSearchPhrase)) { - phraseMatcher = new NameStringMatcher(unknownSearchPhrase, StringMatcherMode.CHECK_EQUALS); - } + NameStringMatcher nm = phrase.getMainUnknownNameStringMatcher(); for (Street object : c.getStreets()) { - SearchResult res = new SearchResult(phrase); res.localeName = object.getName(phrase.getSettings().getLang(), phrase.getSettings().isTransliterate()); @@ -1067,12 +1110,6 @@ public class SearchCoreFactory { && !(nm.matches(res.localeName) || nm.matches(res.otherNames))) { continue; } - res.firstUnknownWordMatches = firstUnknownWordMatches || - phrase.getNameStringMatcher().matches(res.localeName) || - phrase.getNameStringMatcher().matches(res.otherNames); - if (phraseMatcher != null) { - res.unknownPhraseMatches = phraseMatcher.matches(res.localeName); - } res.localeRelatedObjectName = c.getName(phrase.getSettings().getLang(), phrase.getSettings().isTransliterate()); res.object = object; res.preferredZoom = 17; @@ -1102,11 +1139,6 @@ public class SearchCoreFactory { } - public static boolean isLastWordCityGroup(SearchPhrase p ) { - return p.isLastWord(ObjectType.CITY) || p.isLastWord(ObjectType.POSTCODE) || - p.isLastWord(ObjectType.VILLAGE); - } - public static class SearchBuildingAndIntersectionsByStreetAPI extends SearchBaseAPI { Street cacheBuilding; @@ -1179,7 +1211,7 @@ public class SearchCoreFactory { }); } String lw = phrase.getUnknownWordToSearchBuilding(); - NameStringMatcher buildingMatch = phrase.getNameStringMatcher(lw, phrase.isLastUnknownSearchWordComplete()); + NameStringMatcher buildingMatch = phrase.getUnknownWordToSearchBuildingNameMatcher(); NameStringMatcher startMatch = new NameStringMatcher(lw, StringMatcherMode.CHECK_ONLY_STARTS_WITH); for (Building b : s.getBuildings()) { SearchResult res = new SearchResult(phrase); @@ -1194,6 +1226,7 @@ public class SearchCoreFactory { res.file = file; res.priority = priority; res.priorityDistance = 0; + // TOOO phrase.countUnknownWordsMatchMainResult(res); res.firstUnknownWordMatches = startMatch.matches(res.localeName); res.relatedObject = s; res.localeRelatedObjectName = s.getName(phrase.getSettings().getLang(), phrase.getSettings().isTransliterate()); @@ -1208,7 +1241,7 @@ public class SearchCoreFactory { resultMatcher.publish(res); } String streetIntersection = phrase.getUnknownWordToSearch(); - NameStringMatcher streetMatch = phrase.getNameStringMatcher(streetIntersection, phrase.isLastUnknownSearchWordComplete()); + NameStringMatcher streetMatch = phrase.getMainUnknownNameStringMatcher(); if (Algorithms.isEmpty(streetIntersection) || (!Character.isDigit(streetIntersection.charAt(0)) && CommonWords.getCommonSearch(streetIntersection) == -1) ) { @@ -1218,6 +1251,7 @@ public class SearchCoreFactory { || !phrase.isSearchTypeAllowed(ObjectType.STREET_INTERSECTION)) { continue; } + // TOOO phrase.countUnknownWordsMatchMainResult(res); res.otherNames = street.getAllNames(true); res.localeName = street.getName(phrase.getSettings().getLang(), phrase.getSettings().isTransliterate()); res.object = street; @@ -1404,4 +1438,22 @@ public class SearchCoreFactory { return cachedParsedCode == null ? SEARCH_LOCATION_PRIORITY : SEARCH_MAX_PRIORITY; } } + + private static String stripBraces(String localeName) { + int i = localeName.indexOf('('); + String retName = localeName; + if (i > -1) { + retName = localeName.substring(0, i); + int j = localeName.indexOf(')', i); + if (j > -1) { + retName = retName.trim() + ' ' + localeName.substring(j); + } + } + return retName; + } + + public static boolean isLastWordCityGroup(SearchPhrase p ) { + return p.isLastWord(ObjectType.CITY) || p.isLastWord(ObjectType.POSTCODE) || + p.isLastWord(ObjectType.VILLAGE); + } } diff --git a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchExportSettings.java b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchExportSettings.java index 2519d12edc..4cf725de73 100644 --- a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchExportSettings.java +++ b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchExportSettings.java @@ -3,30 +3,29 @@ package net.osmand.search.core; public class SearchExportSettings { private boolean exportEmptyCities; private boolean exportBuildings; + private double maxDistance; public SearchExportSettings() { exportEmptyCities = true; exportBuildings = true; + maxDistance = -1; } - public SearchExportSettings(boolean exportEmptyCities, boolean exportBuildings) { + public SearchExportSettings(boolean exportEmptyCities, boolean exportBuildings, double maxDistance) { this.exportEmptyCities = exportEmptyCities; this.exportBuildings = exportBuildings; + this.maxDistance = maxDistance; } public boolean isExportEmptyCities() { return exportEmptyCities; } - public void setExportEmptyCities(boolean exportEmptyCities) { - this.exportEmptyCities = exportEmptyCities; - } - public boolean isExportBuildings() { return exportBuildings; } - public void setExportBuildings(boolean exportBuildings) { - this.exportBuildings = exportBuildings; + public double getMaxDistance() { + return maxDistance; } } diff --git a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchPhrase.java b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchPhrase.java index 3e153f906e..b7050cd943 100644 --- a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchPhrase.java +++ b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchPhrase.java @@ -1,7 +1,7 @@ package net.osmand.search.core; import net.osmand.Collator; -import net.osmand.CollatorStringMatcher; +import net.osmand.CollatorStringMatcher;import net.osmand.OsmAndCollator; import net.osmand.CollatorStringMatcher.StringMatcherMode; import net.osmand.StringMatcher; import net.osmand.binary.BinaryMapIndexReader; @@ -9,7 +9,6 @@ import net.osmand.binary.BinaryMapIndexReader.SearchRequest; import net.osmand.binary.CommonWords; import net.osmand.data.LatLon; import net.osmand.data.QuadRect; -import net.osmand.osm.AbstractPoiType; import net.osmand.util.Algorithms; import net.osmand.util.LocationParser; import net.osmand.util.MapUtils; @@ -27,31 +26,41 @@ import java.util.Set; import java.util.TreeSet; import java.util.regex.Pattern; -//immutable object +// Immutable object ! public class SearchPhrase { - - private List words = new ArrayList<>(); - private List unknownWords = new ArrayList<>(); - private List unknownWordsMatcher = new ArrayList<>(); - private String unknownSearchWordTrim; - private String rawUnknownSearchPhrase = ""; - private String unknownSearchPhrase = ""; - private AbstractPoiType unknownSearchWordPoiType; - private List unknownSearchWordPoiTypes = null; - - private NameStringMatcher sm; - private SearchSettings settings; - private List indexes; - - private QuadRect cache1kmRect; - private boolean lastUnknownSearchWordComplete; - private static final String DELIMITER = " "; + public static final String DELIMITER = " "; private static final String ALLDELIMITERS = "\\s|,"; private static final Pattern reg = Pattern.compile(ALLDELIMITERS); - private Collator clt; private static Comparator commonWordsComparator; - private static Set conjunctions = new TreeSet<>(); + + private final Collator clt; + private final SearchSettings settings; + private List indexes; + + // Object consists of 2 part [known + unknown] + private String fullTextSearchPhrase = ""; + private String unknownSearchPhrase = ""; + + // words to be used for words span + private List words = new ArrayList<>(); + + // Words of 2 parts + private String firstUnknownSearchWord = ""; + private List otherUnknownWords = new ArrayList<>(); + private boolean lastUnknownSearchWordComplete; + + // Main unknown word used for search + private String mainUnknownWordToSearch = null; + private boolean mainUnknownSearchWordComplete; + + // Name Searchers + private NameStringMatcher firstUnknownNameStringMatcher; + private NameStringMatcher mainUnknownNameStringMatcher; + private List unknownWordsMatcher = new ArrayList<>(); + + private QuadRect cache1kmRect; + static { // the conjunctions.add("the"); @@ -140,7 +149,7 @@ public class SearchPhrase { } - public SearchPhrase(SearchSettings settings, Collator clt) { + private SearchPhrase(SearchSettings settings, Collator clt) { this.settings = settings; this.clt = clt; } @@ -149,97 +158,173 @@ public class SearchPhrase { return clt; } + public SearchPhrase generateNewPhrase(String text, SearchSettings settings) { - SearchPhrase sp = new SearchPhrase(settings, this.clt); - String restText = text; + String textToSearch = text; List leftWords = this.words; String thisTxt = getText(true); + List foundWords = new ArrayList<>(); if (text.startsWith(thisTxt)) { // string is longer - restText = text.substring(getText(false).length()); - sp.words = new ArrayList<>(this.words); + textToSearch = text.substring(getText(false).length()); + foundWords.addAll(this.words); leftWords = leftWords.subList(leftWords.size(), leftWords.size()); } - for(SearchWord w : leftWords) { - if(restText.startsWith(w.getWord() + DELIMITER)) { - sp.words.add(w); - restText = restText.substring(w.getWord().length() + DELIMITER.length()); + for (SearchWord w : leftWords) { + if (textToSearch.startsWith(w.getWord() + DELIMITER)) { + foundWords.add(w); + textToSearch = textToSearch.substring(w.getWord().length() + DELIMITER.length()); } else { break; } } - sp.rawUnknownSearchPhrase = text; - sp.unknownSearchPhrase = restText; - sp.unknownWords.clear(); - sp.unknownWordsMatcher.clear(); - - if (!reg.matcher(restText).find()) { - sp.unknownSearchWordTrim = sp.unknownSearchPhrase.trim(); + SearchPhrase sp = createNewSearchPhrase(settings, text, foundWords, textToSearch); + return sp; + } + + + public static SearchPhrase emptyPhrase() { + return emptyPhrase(null); + } + + public static SearchPhrase emptyPhrase(SearchSettings settings) { + return emptyPhrase(settings, OsmAndCollator.primaryCollator()); + } + + public static SearchPhrase emptyPhrase(SearchSettings settings, Collator clt) { + return new SearchPhrase(settings, clt); + } + + // init search phrase + private SearchPhrase createNewSearchPhrase(SearchSettings settings, String fullText, List foundWords, + String textToSearch) { + SearchPhrase sp = new SearchPhrase(settings, this.clt); + sp.words = foundWords; + sp.fullTextSearchPhrase = fullText; + sp.unknownSearchPhrase = textToSearch; + sp.lastUnknownSearchWordComplete = isTextComplete(fullText) ; + if (!reg.matcher(textToSearch).find()) { + sp.firstUnknownSearchWord = sp.unknownSearchPhrase.trim(); } else { - sp.unknownSearchWordTrim = ""; - String[] ws = restText.split(ALLDELIMITERS); + sp.firstUnknownSearchWord = ""; + String[] ws = textToSearch.split(ALLDELIMITERS); boolean first = true; for (int i = 0; i < ws.length ; i++) { String wd = ws[i].trim(); - if (wd.length() > 0 && !conjunctions.contains(wd.toLowerCase())) { + boolean conjunction = conjunctions.contains(wd.toLowerCase()); + boolean lastAndIncomplete = i == ws.length - 1 && !sp.lastUnknownSearchWordComplete; + if (wd.length() > 0 && (!conjunction || lastAndIncomplete)) { if (first) { - sp.unknownSearchWordTrim = wd; + sp.firstUnknownSearchWord = wd; first = false; } else { - sp.unknownWords.add(wd); + sp.otherUnknownWords.add(wd); } } } } - sp.lastUnknownSearchWordComplete = false; - if (text.length() > 0 ) { - char ch = text.charAt(text.length() - 1); - sp.lastUnknownSearchWordComplete = ch == ' ' || ch == ',' || ch == '\r' || ch == '\n' - || ch == ';'; - } return sp; } + public int countWords(String w) { + String[] ws = w.split(ALLDELIMITERS); + int cnt = 0; + for (int i = 0; i < ws.length; i++) { + String wd = ws[i].trim(); + if (wd.length() > 0) { + cnt++; + } + } + return cnt; + } + + public SearchPhrase selectWord(SearchResult res, List unknownWords, boolean lastComplete) { + SearchPhrase sp = new SearchPhrase(this.settings, this.clt); + addResult(res, sp); + SearchResult prnt = res.parentSearchResult; + while (prnt != null) { + addResult(prnt, sp); + prnt = prnt.parentSearchResult; + } + sp.words.addAll(0, this.words); + if (unknownWords != null) { + sp.lastUnknownSearchWordComplete = lastComplete; + StringBuilder genUnknownSearchPhrase = new StringBuilder(); + for (int i = 0; i < unknownWords.size(); i++) { + if (i == 0) { + sp.firstUnknownSearchWord = unknownWords.get(0); + } else { + sp.otherUnknownWords.add(unknownWords.get(i)); + } + genUnknownSearchPhrase.append(unknownWords.get(i)).append(" "); + } + sp.fullTextSearchPhrase = fullTextSearchPhrase; + sp.unknownSearchPhrase = genUnknownSearchPhrase.toString().trim(); + } + return sp; + } + + + private void calcMainUnknownWordToSearch() { + if (mainUnknownWordToSearch != null) { + return; + } + List unknownSearchWords = otherUnknownWords; + mainUnknownWordToSearch = firstUnknownSearchWord; + mainUnknownSearchWordComplete = lastUnknownSearchWordComplete; + if (unknownSearchWords.size() > 0) { + mainUnknownSearchWordComplete = true; + List searchWords = new ArrayList<>(unknownSearchWords); + searchWords.add(0, getFirstUnknownSearchWord()); + Collections.sort(searchWords, commonWordsComparator); + for (String s : searchWords) { + if (s.length() > 0 && !Character.isDigit(s.charAt(0)) && !LocationParser.isValidOLC(s)) { + mainUnknownWordToSearch = s.trim(); + int unknownInd = unknownSearchWords.indexOf(s); + if (!lastUnknownSearchWordComplete && unknownSearchWords.size() - 1 == unknownInd) { + mainUnknownSearchWordComplete = false; + } + break; + } + } + } + } public List getWords() { return words; } - public boolean isUnknownSearchWordComplete() { - return lastUnknownSearchWordComplete || unknownWords.size() > 0 || unknownSearchWordPoiType != null; + public boolean isMainUnknownSearchWordComplete() { + // return lastUnknownSearchWordComplete || otherUnknownWords.size() > 0 || unknownSearchWordPoiType != null; + return mainUnknownSearchWordComplete; } + public boolean isLastUnknownSearchWordComplete() { return lastUnknownSearchWordComplete; } - + + public boolean hasMoreThanOneUnknownSearchWord() { + return otherUnknownWords.size() > 0; + } public List getUnknownSearchWords() { - return unknownWords; - } - - public List getUnknownSearchWords(Collection exclude) { - if(exclude == null || unknownWords.size() == 0 || exclude.size() == 0) { - return unknownWords; - } - List l = new ArrayList<>(); - for(String uw : unknownWords) { - if(exclude == null || !exclude.contains(uw)) { - l.add(uw); - } - } - return l; + return otherUnknownWords; } - public String getUnknownSearchWord() { - return unknownSearchWordTrim; + public String getFirstUnknownSearchWord() { + return firstUnknownSearchWord; + } + + public boolean isFirstUnknownSearchWordComplete() { + return hasMoreThanOneUnknownSearchWord() || isLastUnknownSearchWordComplete(); } - public String getRawUnknownSearchPhrase() { - return rawUnknownSearchPhrase; + public String getFullSearchPhrase() { + return fullTextSearchPhrase; } public String getUnknownSearchPhrase() { @@ -247,66 +332,9 @@ public class SearchPhrase { } public boolean isUnknownSearchWordPresent() { - return unknownSearchWordTrim.length() > 0; + return firstUnknownSearchWord.length() > 0; } - public int getUnknownSearchWordLength() { - return unknownSearchWordTrim.length() ; - } - - public AbstractPoiType getUnknownSearchWordPoiType() { - return unknownSearchWordPoiType; - } - - public void setUnknownSearchWordPoiType(AbstractPoiType unknownSearchWordPoiType) { - this.unknownSearchWordPoiType = unknownSearchWordPoiType; - } - - public boolean hasUnknownSearchWordPoiType() { - return unknownSearchWordPoiType != null; - } - - public String getPoiNameFilter() { - return getPoiNameFilter(unknownSearchWordPoiType); - } - - public boolean hasUnknownSearchWordPoiTypes() { - return unknownSearchWordPoiTypes != null && unknownSearchWordPoiTypes.size() > 0; - } - - public List getUnknownSearchWordPoiTypes() { - return unknownSearchWordPoiTypes; - } - - public void setUnknownSearchWordPoiTypes(List unknownSearchWordPoiTypes) { - this.unknownSearchWordPoiTypes = unknownSearchWordPoiTypes; - for (AbstractPoiType pt : unknownSearchWordPoiTypes) { - if (getPoiNameFilter(pt) != null) { - setUnknownSearchWordPoiType(pt); - break; - } - } - } - - public String getPoiNameFilter(AbstractPoiType pt) { - String nameFilter = null; - if (pt != null) { - NameStringMatcher nm = getNameStringMatcher(getUnknownSearchWord(), true); - String unknownSearchPhrase = getUnknownSearchPhrase(); - String enTranslation = pt.getEnTranslation(); - String translation = pt.getTranslation(); - String synonyms = pt.getSynonyms(); - if (unknownSearchPhrase.length() >= enTranslation.length() && nm.matches(enTranslation)) { - nameFilter = unknownSearchPhrase.substring(enTranslation.length()).trim(); - } else if (unknownSearchPhrase.length() >= translation.length() && nm.matches(translation)) { - nameFilter = unknownSearchPhrase.substring(translation.length()).trim(); - } else if (unknownSearchPhrase.length() >= synonyms.length() && nm.matches(synonyms)) { - nameFilter = unknownSearchPhrase.substring(synonyms.length()).trim(); - } - } - return nameFilter; - } - public QuadRect getRadiusBBoxToSearch(int radius) { int radiusInMeters = getRadiusSearch(radius); QuadRect cache1kmRect = get1km31Rect(); @@ -459,31 +487,6 @@ public class SearchPhrase { return selectWord(res, null, false); } - public SearchPhrase selectWord(SearchResult res, List unknownWords, boolean lastComplete) { - SearchPhrase sp = new SearchPhrase(this.settings, this.clt); - addResult(res, sp); - SearchResult prnt = res.parentSearchResult; - while (prnt != null) { - addResult(prnt, sp); - prnt = prnt.parentSearchResult; - } - sp.words.addAll(0, this.words); - if (unknownWords != null) { - sp.lastUnknownSearchWordComplete = lastComplete; - StringBuilder genUnknownSearchPhrase = new StringBuilder(); - for (int i = 0; i < unknownWords.size(); i++) { - if (i == 0) { - sp.unknownSearchWordTrim = unknownWords.get(0); - } else { - sp.unknownWords.add(unknownWords.get(i)); - } - genUnknownSearchPhrase.append(unknownWords.get(i)).append(" "); - } - - sp.rawUnknownSearchPhrase = sp.unknownSearchPhrase = genUnknownSearchPhrase.toString().trim(); - } - return sp; - } private void addResult(SearchResult res, SearchPhrase sp) { SearchWord sw = new SearchWord(res.wordsSpan != null ? res.wordsSpan : res.localeName.trim(), res); @@ -513,16 +516,32 @@ public class SearchPhrase { return null; } - public NameStringMatcher getNameStringMatcher() { - if(sm != null) { - return sm; + public NameStringMatcher getMainUnknownNameStringMatcher() { + calcMainUnknownWordToSearch(); + if (mainUnknownNameStringMatcher == null) { + mainUnknownNameStringMatcher = getNameStringMatcher(mainUnknownWordToSearch, mainUnknownSearchWordComplete); } - sm = getNameStringMatcher(unknownSearchWordTrim, lastUnknownSearchWordComplete); - return sm; + return mainUnknownNameStringMatcher; + } + + public NameStringMatcher getFirstUnknownNameStringMatcher() { + if (firstUnknownNameStringMatcher == null) { + firstUnknownNameStringMatcher = getNameStringMatcher(firstUnknownSearchWord, lastUnknownSearchWordComplete); + } + return firstUnknownNameStringMatcher; + } + + public NameStringMatcher getUnknownNameStringMatcher(int i) { + while (unknownWordsMatcher.size() <= i) { + int ind = unknownWordsMatcher.size(); + boolean completeMatch = ind < otherUnknownWords.size() - 1 || isLastUnknownSearchWordComplete(); + unknownWordsMatcher.add(getNameStringMatcher(otherUnknownWords.get(ind), completeMatch)); + } + return unknownWordsMatcher.get(i); } - public NameStringMatcher getNameStringMatcher(String word, boolean complete) { + private NameStringMatcher getNameStringMatcher(String word, boolean complete) { return new NameStringMatcher(word, (complete ? StringMatcherMode.CHECK_EQUALS_FROM_SPACE : @@ -544,12 +563,12 @@ public class SearchPhrase { } } - public String getText(boolean includeLastWord) { + public String getText(boolean includeUnknownPart) { StringBuilder sb = new StringBuilder(); for(SearchWord s : words) { - sb.append(s.getWord()).append(DELIMITER.trim() + " "); + sb.append(s.getWord()).append(DELIMITER); } - if(includeLastWord) { + if(includeUnknownPart) { sb.append(unknownSearchPhrase); } return sb.toString(); @@ -558,11 +577,11 @@ public class SearchPhrase { public String getTextWithoutLastWord() { StringBuilder sb = new StringBuilder(); List words = new ArrayList<>(this.words); - if(Algorithms.isEmpty(unknownSearchWordTrim) && words.size() > 0) { + if (Algorithms.isEmpty(unknownSearchPhrase.trim()) && words.size() > 0) { words.remove(words.size() - 1); } for(SearchWord s : words) { - sb.append(s.getWord()).append(DELIMITER.trim() + " "); + sb.append(s.getWord()).append(DELIMITER); } return sb.toString(); } @@ -705,8 +724,8 @@ public class SearchPhrase { private CollatorStringMatcher sm; - public NameStringMatcher(String lastWordTrim, StringMatcherMode mode) { - sm = new CollatorStringMatcher(lastWordTrim, mode); + public NameStringMatcher(String namePart, StringMatcherMode mode) { + sm = new CollatorStringMatcher(namePart, mode); } public boolean matches(Collection map) { @@ -728,35 +747,53 @@ public class SearchPhrase { } - public void countUnknownWordsMatch(SearchResult sr) { - countUnknownWordsMatch(sr, sr.localeName, sr.otherNames); + public int countUnknownWordsMatchMainResult(SearchResult sr) { + return countUnknownWordsMatch(sr, sr.localeName, sr.otherNames, 0); } - public void countUnknownWordsMatch(SearchResult sr, String localeName, Collection otherNames) { - if (unknownWords.size() > 0) { - for (int i = 0; i < unknownWords.size(); i++) { - if (unknownWordsMatcher.size() == i) { - unknownWordsMatcher.add(new NameStringMatcher(unknownWords.get(i), - i < unknownWords.size() - 1 || isLastUnknownSearchWordComplete() - ? StringMatcherMode.CHECK_EQUALS_FROM_SPACE - : StringMatcherMode.CHECK_STARTS_FROM_SPACE)); + public int countUnknownWordsMatchMainResult(SearchResult sr, int amountMatchingWords) { + return countUnknownWordsMatch(sr, sr.localeName, sr.otherNames, amountMatchingWords); + } + + + public int countUnknownWordsMatch(SearchResult sr, String localeName, Collection otherNames, int amountMatchingWords) { + int r = 0; + if (otherUnknownWords.size() > 0) { + for (int i = 0; i < otherUnknownWords.size(); i++) { + boolean match = false; + if (i < amountMatchingWords - 1) { + match = true; + } else { + NameStringMatcher ms = getUnknownNameStringMatcher(i); + if (ms.matches(localeName) || ms.matches(otherNames)) { + match = true; + } } - NameStringMatcher ms = unknownWordsMatcher.get(i); - if (ms.matches(localeName) || ms.matches(otherNames)) { + if (match) { if (sr.otherWordsMatch == null) { sr.otherWordsMatch = new TreeSet<>(); } - sr.otherWordsMatch.add(unknownWords.get(i)); + sr.otherWordsMatch.add(otherUnknownWords.get(i)); + r++; } } } - if(!sr.firstUnknownWordMatches) { - sr.firstUnknownWordMatches = localeName.equals(getUnknownSearchWord()) || - getNameStringMatcher().matches(localeName) || - getNameStringMatcher().matches(otherNames); + if (amountMatchingWords > 0) { + sr.firstUnknownWordMatches = true; + r++; + } else { + boolean match = localeName.equals(getFirstUnknownSearchWord()) + || getFirstUnknownNameStringMatcher().matches(localeName) + || getFirstUnknownNameStringMatcher().matches(otherNames); + if(match) { + r++; + } + sr.firstUnknownWordMatches = match || sr.firstUnknownWordMatches; } - + return r; } + + public int getRadiusSearch(int meters, int radiusLevel) { int res = meters; for(int k = 0; k < radiusLevel; k++) { @@ -777,17 +814,38 @@ public class SearchPhrase { return (x < y) ? -1 : ((x == y) ? 0 : 1); } - public String getUnknownWordToSearchBuilding() { - List unknownSearchWords = getUnknownSearchWords(); - if(unknownSearchWords.size() > 0 && Algorithms.extractFirstIntegerNumber(getUnknownSearchWord()) == 0) { - for(String wrd : unknownSearchWords) { - if(Algorithms.extractFirstIntegerNumber(wrd) != 0) { - return wrd; + private int getUnknownWordToSearchBuildingInd() { + if (otherUnknownWords.size() > 0 && Algorithms.extractFirstIntegerNumber(getFirstUnknownSearchWord()) == 0) { + int ind = 0; + for (String wrd : otherUnknownWords) { + ind++; + if (Algorithms.extractFirstIntegerNumber(wrd) != 0) { + return ind; } } - } - return getUnknownSearchWord(); + } + return 0; } + + public NameStringMatcher getUnknownWordToSearchBuildingNameMatcher() { + int ind = getUnknownWordToSearchBuildingInd(); + if(ind > 0) { + return getUnknownNameStringMatcher(ind - 1); + } else { + return getFirstUnknownNameStringMatcher(); + } + } + + public String getUnknownWordToSearchBuilding() { + int ind = getUnknownWordToSearchBuildingInd(); + if(ind > 0) { + return otherUnknownWords.get(ind - 1); + } else { + return firstUnknownSearchWord; + } + } + + private static int lengthWithoutNumbers(String s) { int len = 0; @@ -802,20 +860,21 @@ public class SearchPhrase { } public String getUnknownWordToSearch() { - List unknownSearchWords = getUnknownSearchWords(); - String wordToSearch = getUnknownSearchWord(); - if (unknownSearchWords.size() > 0) { - List searchWords = new ArrayList<>(unknownSearchWords); - searchWords.add(0, getUnknownSearchWord()); - Collections.sort(searchWords, commonWordsComparator); - for (String s : searchWords) { - if (s.length() > 0 && !Character.isDigit(s.charAt(0)) && !LocationParser.isValidOLC(s)) { - return s; - } - } + calcMainUnknownWordToSearch(); + return mainUnknownWordToSearch; + } + + private boolean isTextComplete(String fullText) { + boolean lastUnknownSearchWordComplete = false; + if (fullText.length() > 0 ) { + char ch = fullText.charAt(fullText.length() - 1); + lastUnknownSearchWordComplete = ch == ' ' || ch == ',' || ch == '\r' || ch == '\n' + || ch == ';'; } - return wordToSearch; + return lastUnknownSearchWordComplete; } + + } diff --git a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchResult.java b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchResult.java index 269694eae9..c72dd84079 100644 --- a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchResult.java +++ b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchResult.java @@ -16,37 +16,59 @@ import java.util.Collection; public class SearchResult { // search phrase that makes search result valid public SearchPhrase requiredSearchPhrase; + + // internal package fields (used for sorting) + public SearchResult parentSearchResult; + String wordsSpan ; + boolean firstUnknownWordMatches; + Collection otherWordsMatch = null; + public Object object; public ObjectType objectType; public BinaryMapIndexReader file; - + public double priority; public double priorityDistance; - public String wordsSpan ; - public SearchResult parentSearchResult; - public Collection otherWordsMatch = null; - public boolean firstUnknownWordMatches = true; - public boolean unknownPhraseMatches = false; + + public LatLon location; + public int preferredZoom = 15; + + public String localeName; + public String alternateName; + public Collection otherNames; + + public String localeRelatedObjectName; + public Object relatedObject; + public double distRelatedObjectName; public SearchResult(SearchPhrase sp) { this.requiredSearchPhrase = sp; } + private static final double MAX_TYPE_WEIGHT = 10; + // maximum corresponds to the top entry public double getUnknownPhraseMatchWeight() { // if result is a complete match in the search we prioritize it highers - double res = 0; - if (unknownPhraseMatches) { - res = ObjectType.getTypeWeight(objectType); - } + return getSumPhraseMatchWeight() / Math.pow(MAX_TYPE_WEIGHT, getDepth() - 1); + } + + public double getSumPhraseMatchWeight() { + // if result is a complete match in the search we prioritize it highers + double res = ObjectType.getTypeWeight(objectType); if (parentSearchResult != null) { - // 10 > maximum type - // res = Math.max(res,parentSearchResult.getUnknownPhraseMatchWeight()) ; - res += parentSearchResult.getUnknownPhraseMatchWeight() / 10; + res = res + parentSearchResult.getSumPhraseMatchWeight() / MAX_TYPE_WEIGHT; } return res; } + public int getDepth() { + if (parentSearchResult != null) { + return 1 + parentSearchResult.getDepth(); + } + return 1; + } + public int getFoundWordCount() { int inc = 0; if (firstUnknownWordMatches) { @@ -77,16 +99,6 @@ public class SearchResult { return priority - 1 / (1 + pd * distance); } - public LatLon location; - public int preferredZoom = 15; - public String localeName; - public String alternateName; - - public Collection otherNames; - - public String localeRelatedObjectName; - public Object relatedObject; - public double distRelatedObjectName; @Override public String toString() { diff --git a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchSettings.java b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchSettings.java index 3779bb801a..a958d16f18 100644 --- a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchSettings.java +++ b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchSettings.java @@ -24,7 +24,7 @@ public class SearchSettings { private boolean emptyQueryAllowed; private boolean sortByName; private SearchExportSettings exportSettings; - //private SearchExportSettings exportSettings = new SearchExportSettings(false, false); + //private SearchExportSettings exportSettings = new SearchExportSettings(false, false, -1); public SearchSettings(SearchSettings s) { if(s != null) { diff --git a/OsmAnd-java/src/test/java/net/osmand/search/LocationSearchTest.java b/OsmAnd-java/src/test/java/net/osmand/search/LocationSearchTest.java index 3190115507..874a82aeb0 100644 --- a/OsmAnd-java/src/test/java/net/osmand/search/LocationSearchTest.java +++ b/OsmAnd-java/src/test/java/net/osmand/search/LocationSearchTest.java @@ -17,7 +17,7 @@ public class LocationSearchTest { private void search(String string, LatLon latLon) throws IOException { SearchResultMatcher srm = new SearchUICore.SearchResultMatcher(null, null, 0, null, 100); new SearchCoreFactory.SearchLocationAndUrlAPI(). - search(new SearchPhrase(null, OsmAndCollator.primaryCollator()).generateNewPhrase(string, null), srm); + search(SearchPhrase.emptyPhrase().generateNewPhrase(string, null), srm); Assert.assertEquals(1, srm.getRequestResults().size()); Assert.assertEquals(latLon, srm.getRequestResults().get(0).location); } diff --git a/OsmAnd-java/src/test/java/net/osmand/search/SearchUICoreGenericTest.java b/OsmAnd-java/src/test/java/net/osmand/search/SearchUICoreGenericTest.java index aa4d7430d6..0c0b99b5ac 100644 --- a/OsmAnd-java/src/test/java/net/osmand/search/SearchUICoreGenericTest.java +++ b/OsmAnd-java/src/test/java/net/osmand/search/SearchUICoreGenericTest.java @@ -8,7 +8,6 @@ import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; -import net.osmand.OsmAndCollator; import net.osmand.data.LatLon; import net.osmand.search.SearchUICore.SearchResultCollection; import net.osmand.search.core.SearchPhrase; @@ -29,7 +28,7 @@ public class SearchUICoreGenericTest { public void testDuplicates() throws IOException { SearchSettings ss = new SearchSettings((SearchSettings)null); ss = ss.setOriginalLocation(new LatLon(0, 0)); - SearchPhrase phrase = new SearchPhrase(ss, OsmAndCollator.primaryCollator()); + SearchPhrase phrase = SearchPhrase.emptyPhrase(ss); SearchResultCollection cll = new SearchUICore.SearchResultCollection(phrase); List rs = new ArrayList<>(); SearchResult a1 = searchResult(rs, phrase, "a", 100); @@ -47,7 +46,7 @@ public class SearchUICoreGenericTest { public void testNoResort() throws IOException { SearchSettings ss = new SearchSettings((SearchSettings)null); ss = ss.setOriginalLocation(new LatLon(0, 0)); - SearchPhrase phrase = new SearchPhrase(ss, OsmAndCollator.primaryCollator()); + SearchPhrase phrase = SearchPhrase.emptyPhrase(ss); SearchResultCollection cll = new SearchUICore.SearchResultCollection(phrase); List rs = new ArrayList<>(); SearchResult a1 = searchResult(rs, phrase, "a", 100); @@ -80,7 +79,7 @@ public class SearchUICoreGenericTest { public void testNoResortDuplicate() throws IOException { SearchSettings ss = new SearchSettings((SearchSettings)null); ss = ss.setOriginalLocation(new LatLon(0, 0)); - SearchPhrase phrase = new SearchPhrase(ss, OsmAndCollator.primaryCollator()); + SearchPhrase phrase = SearchPhrase.emptyPhrase(ss); SearchResultCollection cll = new SearchUICore.SearchResultCollection(phrase); List rs = new ArrayList<>(); SearchResult a1 = searchResult(rs, phrase, "a", 100); diff --git a/OsmAnd-java/src/test/java/net/osmand/search/SearchUICoreTest.java b/OsmAnd-java/src/test/java/net/osmand/search/SearchUICoreTest.java index 13c9668741..f3ab84c76b 100644 --- a/OsmAnd-java/src/test/java/net/osmand/search/SearchUICoreTest.java +++ b/OsmAnd-java/src/test/java/net/osmand/search/SearchUICoreTest.java @@ -35,6 +35,7 @@ import net.osmand.search.core.SearchPhrase; import net.osmand.search.core.SearchResult; import net.osmand.search.core.SearchSettings; import net.osmand.util.Algorithms; +import net.osmand.util.MapUtils; @RunWith(Parameterized.class) public class SearchUICoreTest { @@ -99,7 +100,20 @@ public class SearchUICoreTest { BinaryMapIndexReaderTest reader = new BinaryMapIndexReaderTest(); JSONObject sourceJson = new JSONObject(sourceJsonText); - String phraseText = sourceJson.getString("phrase"); + JSONArray phrasesJson = sourceJson.optJSONArray("phrases"); + String singlePhrase = sourceJson.optString("phrase", null); + List phrases = new ArrayList<>(); + if (singlePhrase != null) { + phrases.add(singlePhrase); + } + if (phrasesJson != null) { + for (int i = 0; i < phrasesJson.length(); i++) { + String phrase = phrasesJson.optString(i); + if (phrase != null) { + phrases.add(phrase); + } + } + } JSONObject settingsJson = sourceJson.getJSONObject("settings"); if (sourceJson.has("amenities")) { JSONArray amenitiesArr = sourceJson.getJSONArray("amenities"); @@ -135,26 +149,25 @@ public class SearchUICoreTest { reader.matchedCities = matchedCities; reader.streetCities = streetCities; } - List results = new ArrayList<>(); + List> results = new ArrayList<>(); + for (int i = 0; i < phrases.size(); i++) { + results.add(new ArrayList()); + } if (sourceJson.has("results")) { - JSONArray resultsArr = sourceJson.getJSONArray("results"); - for (int i = 0; i < resultsArr.length(); i++) { - results.add(resultsArr.getString(i)); - } + parseResults(sourceJson, "results", results); } if (TEST_EXTRA_RESULTS && sourceJson.has("extra-results")) { - JSONArray resultsArr = sourceJson.getJSONArray("extra-results"); - for (int i = 0; i < resultsArr.length(); i++) { - results.add(resultsArr.getString(i)); - } + parseResults(sourceJson, "extra-results", results); + } + + Assert.assertEquals(phrases.size(), results.size()); + if (phrases.size() != results.size()) { + return; } SearchSettings s = SearchSettings.parseJSON(settingsJson); s.setOfflineIndexes(Collections.singletonList(reader)); - SearchPhrase phrase = new SearchPhrase(s, OsmAndCollator.primaryCollator()); - phrase = phrase.generateNewPhrase(phraseText, s); - final SearchUICore core = new SearchUICore(MapPoiTypes.getDefault(), "en", false); core.init(); @@ -169,32 +182,76 @@ public class SearchUICoreTest { return false; } }; - SearchResultMatcher matcher = new SearchResultMatcher(rm, phrase, 1, new AtomicInteger(1), -1); - core.searchInternal(phrase, matcher); - SearchResultCollection collection = new SearchResultCollection(phrase); - collection.addSearchResults(matcher.getRequestResults(), true, true); - List searchResults = collection.getCurrentSearchResults(); - int i = 0; - for (SearchResult result : searchResults) { - String expected = results.get(i++); - String present = result.toString(); - if (!Algorithms.stringsEqual(expected, present)) { - System.out.println(String.format("Mismatch for '%s' != '%s' (%d, %.3f, %s). Result: ", expected, - present, result.getFoundWordCount(), result.getUnknownPhraseMatchWeight(), result.objectType.toString())); - for (SearchResult r : searchResults) { -// System.out.println(String.format("\t\"%s\",", r.toString())); - System.out.println(String.format("\"%s\", (%d, %.3f, %s),", r.toString(), - r.getFoundWordCount(), r.getUnknownPhraseMatchWeight(), r.objectType.toString())); + boolean simpleTest = true; + SearchPhrase emptyPhrase = SearchPhrase.emptyPhrase(s); + for (int k = 0; k < phrases.size(); k++) { + String text = phrases.get(k); + List result = results.get(k); + SearchPhrase phrase = emptyPhrase.generateNewPhrase(text, s); + SearchResultMatcher matcher = new SearchResultMatcher(rm, phrase, 1, new AtomicInteger(1), -1); + core.searchInternal(phrase, matcher); + + SearchResultCollection collection = new SearchResultCollection(phrase); + collection.addSearchResults(matcher.getRequestResults(), true, true); + List searchResults = collection.getCurrentSearchResults(); + int i = 0; + for (SearchResult res : searchResults) { + String expected = result.get(i++); + if (simpleTest && expected.indexOf('[') != -1) { + expected = expected.substring(0, expected.indexOf('[')).trim(); + } +// String present = result.toString(); + String present = formatResult(simpleTest, res, phrase); + if (!Algorithms.stringsEqual(expected, present)) { + System.out.println(String.format("Phrase: %s", phrase)); + System.out.println(String.format("Mismatch for '%s' != '%s'. Result: ", expected, present)); + for (SearchResult r : searchResults) { + System.out.println(String.format("\t\"%s\",", formatResult(false, r, phrase))); + } + } + Assert.assertEquals(expected, present); + if (i >= result.size()) { + break; } } - Assert.assertEquals(expected, present); - if (i >= results.size()) { - break; + } + } + + private void parseResults(JSONObject sourceJson, String tag, List> results) { + List result = results.get(0); + JSONArray resultsArr = sourceJson.getJSONArray(tag); + boolean hasInnerArray = resultsArr.length() > 0 && resultsArr.optJSONArray(0) != null; + for (int i = 0; i < resultsArr.length(); i++) { + if (hasInnerArray) { + JSONArray innerArray = resultsArr.optJSONArray(i); + if (innerArray != null && results.size() > i) { + result = results.get(i); + for (int k = 0; k < innerArray.length(); k++) { + result.add(innerArray.getString(k)); + } + } + } else { + result.add(resultsArr.getString(i)); } } } + private String formatResult(boolean simpleTest, SearchResult r, SearchPhrase phrase) { + if (simpleTest) { + return r.toString().trim(); + } + double dist = 0; + if(r.location != null) { + dist = MapUtils.getDistance(r.location, phrase.getLastTokenLocation()); + } + return String.format("%s [[%d, %s, %.3f, %.2f km]]", r.toString(), + r.getFoundWordCount(), r.objectType.toString(), + r.getUnknownPhraseMatchWeight(), + dist / 1000 + ); + } + static class TestSearchTranslator implements MapPoiTypes.PoiTranslator { private Map enPhrases; diff --git a/OsmAnd-java/src/test/resources/search/100_bridge_street.json b/OsmAnd-java/src/test/resources/search/100_bridge_street.json index 84d7b0bc66..034e6969d2 100644 --- a/OsmAnd-java/src/test/resources/search/100_bridge_street.json +++ b/OsmAnd-java/src/test/resources/search/100_bridge_street.json @@ -9,14 +9,144 @@ "emptyQueryAllowed": false, "sortByName": false }, - "phrase": "100 Bridge Street", + "phrases": [ "100 bridge", "100 bridge street", "100 bridge street westbrook" ], "results": [ - "100.0, ", - "100, Bridge Street, Westbrook", - "100, Bridge Street, Yarmouth", - "Bridge Street", - "Bridge Street Dam", - "Bridge Street" + [ + "100.0, [[1, PARTIAL_LOCATION, 1.000, 5591.91 km]]", + "100, Bridge Street, Westbrook [[2, HOUSE, 0.430, 11.29 km]]", + "100, Bridge Street, Yarmouth [[2, HOUSE, 0.430, 23.69 km]]" + ], + [ + "100.0, [[1, PARTIAL_LOCATION, 1.000, 5591.91 km]]", + "100, Bridge Street, Westbrook [[3, HOUSE, 0.430, 11.29 km]]", + "100, Bridge Street, Yarmouth [[3, HOUSE, 0.430, 23.69 km]]" + ], + [ + "100.0, [[1, PARTIAL_LOCATION, 1.000, 5591.91 km]]", + "100, Bridge Street, Westbrook [[4, HOUSE, 0.043, 11.29 km]]", + "100, Bridge Street, Yarmouth [[3, HOUSE, 0.430, 23.69 km]]", + "Bridge Street, Westbrook [[3, STREET, 0.310, 11.35 km]]", + "Bridge Street, Frenchtown [[2, STREET, 3.000, 11.35 km]]", + "Bridge Street, Yarmouth [[2, STREET, 3.000, 23.44 km]]", + "Bridge Street, Cornish [[2, STREET, 3.000, 27.39 km]]", + "Bridge Street (Ocean Park), Old Orchard Beach [[2, STREET, 3.000, 28.42 km]]", + "Bridge Street (Newfield), West Newfield [[2, STREET, 3.000, 32.66 km]]", + "Bridge Street, Newfield [[2, STREET, 3.000, 32.66 km]]", + "Bridge Street (Sprague City), West Newfield [[2, STREET, 3.000, 32.72 km]]", + "Bridge Street, Sprague City [[2, STREET, 3.000, 33.02 km]]", + "Bridge Street, Kezar Falls [[2, STREET, 3.000, 34.35 km]]", + "Bridge Street (Springvale), Sanford [[2, STREET, 3.000, 41.40 km]]", + "Bridge Street, Springvale [[2, STREET, 3.000, 41.40 km]]", + "Bridge Street, Brunswick [[2, STREET, 3.000, 43.74 km]]", + "Bridge Street, Lewiston [[2, STREET, 3.000, 43.86 km]]", + "Bridge Street, Topsham [[2, STREET, 3.000, 43.93 km]]", + "Bridge Street, Bath [[2, STREET, 3.000, 53.34 km]]", + "Bridge Street, Ogunquit [[2, STREET, 3.000, 56.93 km]]", + "Bridge Street, Berwick [[2, STREET, 3.000, 62.86 km]]", + "Bridge Street, Richmond [[2, STREET, 3.000, 65.70 km]]", + "Bridge Street, Boothbay Harbor [[2, STREET, 3.000, 68.39 km]]", + "Bridge Street, Gardiner [[2, STREET, 3.000, 77.20 km]]", + "Bridge Street (Oak Terrace), Kittery [[2, STREET, 3.000, 77.36 km]]", + "Bridge Street, Randolph [[2, STREET, 3.000, 77.40 km]]", + "Bridge Street, Oak Terrace [[2, STREET, 3.000, 77.41 km]]", + "Bridge Street, Gilead [[2, STREET, 3.000, 82.07 km]]", + "Bridge Street, Livermore Falls [[2, STREET, 3.000, 83.24 km]]", + "Bridge Street, Augusta [[2, STREET, 3.000, 83.82 km]]", + "Bridge Street, Jay [[2, STREET, 3.000, 85.89 km]]" + ] + ], + "extra-results" : [ + [ + "Bridge Street, Frenchtown [[1, STREET, 3.000, 11.35 km]]", + "Bridge Street, Westbrook [[1, STREET, 3.000, 11.35 km]]", + "Bridge Street, Yarmouth [[1, STREET, 3.000, 23.44 km]]", + "Bridge Street, Cornish [[1, STREET, 3.000, 27.39 km]]", + "Bridge Street (Ocean Park), Old Orchard Beach [[1, STREET, 3.000, 28.42 km]]", + "Bridge Street (Newfield), West Newfield [[1, STREET, 3.000, 32.66 km]]", + "Bridge Street, Newfield [[1, STREET, 3.000, 32.66 km]]", + "Bridge Street (Sprague City), West Newfield [[1, STREET, 3.000, 32.72 km]]", + "Bridge Street, Sprague City [[1, STREET, 3.000, 33.02 km]]", + "Bridge Street, Kezar Falls [[1, STREET, 3.000, 34.35 km]]", + "Bridge Road, Biddeford [[1, STREET, 3.000, 35.42 km]]", + "Bridge Street (Springvale), Sanford [[1, STREET, 3.000, 41.40 km]]", + "Bridge Street, Springvale [[1, STREET, 3.000, 41.40 km]]", + "Bridge Street, Brunswick [[1, STREET, 3.000, 43.74 km]]", + "Bridge Street, Lewiston [[1, STREET, 3.000, 43.86 km]]", + "Bridge Street, Topsham [[1, STREET, 3.000, 43.93 km]]", + "Bridge Road, Brunswick [[1, STREET, 3.000, 52.12 km]]", + "Bridge Street, Bath [[1, STREET, 3.000, 53.34 km]]", + "Bridge Lane, Ogunquit [[1, STREET, 3.000, 56.91 km]]", + "Bridge Street, Ogunquit [[1, STREET, 3.000, 56.93 km]]", + "Bridge Road, North Waterford [[1, STREET, 3.000, 57.76 km]]", + "Bridge Street, Berwick [[1, STREET, 3.000, 62.86 km]]", + "Bridge Street, Richmond [[1, STREET, 3.000, 65.70 km]]", + "Bridge Road, Edgecomb [[1, STREET, 3.000, 68.32 km]]", + "Bridge Road, Wiscasset [[1, STREET, 3.000, 68.34 km]]", + "Bridge Street, Boothbay Harbor [[1, STREET, 3.000, 68.39 km]]", + "Bridge Street, Gardiner [[1, STREET, 3.000, 77.20 km]]", + "Bridge Street (Oak Terrace), Kittery [[1, STREET, 3.000, 77.36 km]]", + "Bridge Street, Randolph [[1, STREET, 3.000, 77.40 km]]", + "Bridge Street, Oak Terrace [[1, STREET, 3.000, 77.41 km]]", + "Bridge Street, Gilead [[1, STREET, 3.000, 82.07 km]]", + "Bridge Street, Livermore Falls [[1, STREET, 3.000, 83.24 km]]", + "Bridge Street, Augusta [[1, STREET, 3.000, 83.82 km]]", + "Bridge Street, Jay [[1, STREET, 3.000, 85.89 km]]" + ], + [ + "Bridge Street, Frenchtown [[2, STREET, 3.000, 11.35 km]]", + "Bridge Street, Westbrook [[2, STREET, 3.000, 11.35 km]]", + "Bridge Street, Yarmouth [[2, STREET, 3.000, 23.44 km]]", + "Bridge Street, Cornish [[2, STREET, 3.000, 27.39 km]]", + "Bridge Street (Ocean Park), Old Orchard Beach [[2, STREET, 3.000, 28.42 km]]", + "Bridge Street (Newfield), West Newfield [[2, STREET, 3.000, 32.66 km]]", + "Bridge Street, Newfield [[2, STREET, 3.000, 32.66 km]]", + "Bridge Street (Sprague City), West Newfield [[2, STREET, 3.000, 32.72 km]]", + "Bridge Street, Sprague City [[2, STREET, 3.000, 33.02 km]]", + "Bridge Street, Kezar Falls [[2, STREET, 3.000, 34.35 km]]", + "Bridge Street (Springvale), Sanford [[2, STREET, 3.000, 41.40 km]]", + "Bridge Street, Springvale [[2, STREET, 3.000, 41.40 km]]", + "Bridge Street, Brunswick [[2, STREET, 3.000, 43.74 km]]", + "Bridge Street, Lewiston [[2, STREET, 3.000, 43.86 km]]", + "Bridge Street, Topsham [[2, STREET, 3.000, 43.93 km]]", + "Bridge Street, Bath [[2, STREET, 3.000, 53.34 km]]", + "Bridge Street, Ogunquit [[2, STREET, 3.000, 56.93 km]]", + "Bridge Street, Berwick [[2, STREET, 3.000, 62.86 km]]", + "Bridge Street, Richmond [[2, STREET, 3.000, 65.70 km]]", + "Bridge Street, Boothbay Harbor [[2, STREET, 3.000, 68.39 km]]", + "Bridge Street, Gardiner [[2, STREET, 3.000, 77.20 km]]", + "Bridge Street (Oak Terrace), Kittery [[2, STREET, 3.000, 77.36 km]]", + "Bridge Street, Randolph [[2, STREET, 3.000, 77.40 km]]", + "Bridge Street, Oak Terrace [[2, STREET, 3.000, 77.41 km]]", + "Bridge Street, Gilead [[2, STREET, 3.000, 82.07 km]]", + "Bridge Street, Livermore Falls [[2, STREET, 3.000, 83.24 km]]", + "Bridge Street, Augusta [[2, STREET, 3.000, 83.82 km]]", + "Bridge Street, Jay [[2, STREET, 3.000, 85.89 km]]", + "Bridge Street [[2, POI, 2.000, 11.59 km]]", + "Bridge Street Dam [[2, POI, 2.000, 23.62 km]]", + "Bridge Street [[2, POI, 2.000, 27.24 km]]", + "Bridge Street [[2, POI, 2.000, 34.36 km]]", + "Bridge Street [[2, POI, 2.000, 41.33 km]]", + "Bridge Street Dam [[2, POI, 2.000, 41.35 km]]", + "Bridge Street [[2, POI, 2.000, 43.84 km]]", + "Bridge Street [[2, POI, 2.000, 76.87 km]]", + "Bridge Street [[2, POI, 2.000, 77.27 km]]", + "Bridge Street [[2, POI, 2.000, 82.37 km]]", + "Bridge Street [[2, POI, 2.000, 88.20 km]]", + "The Bridge Street Green [[2, POI, 2.000, 104.21 km]]", + "Bridge Street [[2, POI, 2.000, 104.29 km]]", + "Bridge Street [[2, POI, 2.000, 110.92 km]]", + "Bridge Street [[2, POI, 2.000, 116.14 km]]", + "Bridge Street [[2, POI, 2.000, 116.20 km]]", + "Bridge Street [[2, POI, 2.000, 116.26 km]]", + "Bridge Street [[2, POI, 2.000, 119.68 km]]", + "Bridge Street [[2, POI, 2.000, 151.84 km]]", + "Bridge Street [[2, POI, 2.000, 224.29 km]]", + "Bridge Street [[2, POI, 2.000, 243.40 km]]", + "Bridge Street [[2, POI, 2.000, 394.32 km]]", + "Bridge Street [[2, POI, 2.000, 415.17 km]]", + "Bridge Street [[2, POI, 2.000, 434.56 km]]" + ], + [] ], "amenities": [ { diff --git a/OsmAnd-java/src/test/resources/search/bank_abcd.json b/OsmAnd-java/src/test/resources/search/bank_abcd.json index 86aaae239e..75710cc36c 100644 --- a/OsmAnd-java/src/test/resources/search/bank_abcd.json +++ b/OsmAnd-java/src/test/resources/search/bank_abcd.json @@ -11,25 +11,24 @@ }, "phrase": "Bank dr", "results": [ - "Bank (Finance)", - "Hohe-Bank-Weg, Königswartha - Rakecy", - "Dresdner Bank", - "Ostsächsische Sparkasse Dresden", - "Ostsächsische Sparkasse Dresden", - "Filiale Dresden Technische Universität", - "Ostsächsische Sparkasse Dresden", - "Volksbank Raiffeisenbank Dresden", - "Ostsächsische Sparkasse Dresden Zwst. Strehlen", - "Ostsächsische Sparkasse Dresden", - "Ostsächsische Sparkasse Dresden", - "Dresdner Volksbank Raiffeisenbank", - "Ostsächsische Sparkasse Filiale Dresden Wilder Mann", - "Ostsächsische Sparkasse Dresden", - "Ostsächsische Sparkasse Dresden", - "Ostsächsische Sparkasse Dresden", - "Ostsächsische Sparkasse Dresden", - "Ostsächsische Sparkasse Dresden", - "Dresdner Volksbank Raiffeisenbank eG" + "Bank (Finance) [[1, POI_TYPE, 1.000, 0.00 km]]", + "Dresdner Bank [[2, POI, 2.000, 0.10 km]]", + "Ostsächsische Sparkasse Dresden [[2, POI, 2.000, 1.46 km]]", + "Ostsächsische Sparkasse Dresden [[2, POI, 2.000, 2.15 km]]", + "Filiale Dresden Technische Universität [[2, POI, 2.000, 2.61 km]]", + "Ostsächsische Sparkasse Dresden [[2, POI, 2.000, 2.68 km]]", + "Volksbank Raiffeisenbank Dresden [[2, POI, 2.000, 2.77 km]]", + "Ostsächsische Sparkasse Dresden Zwst. Strehlen [[2, POI, 2.000, 2.86 km]]", + "Ostsächsische Sparkasse Dresden [[2, POI, 2.000, 3.42 km]]", + "Ostsächsische Sparkasse Dresden [[2, POI, 2.000, 3.74 km]]", + "Dresdner Volksbank Raiffeisenbank [[2, POI, 2.000, 4.72 km]]", + "Ostsächsische Sparkasse Filiale Dresden Wilder Mann [[2, POI, 2.000, 5.06 km]]", + "Ostsächsische Sparkasse Dresden [[2, POI, 2.000, 7.42 km]]", + "Ostsächsische Sparkasse Dresden [[2, POI, 2.000, 7.44 km]]", + "Ostsächsische Sparkasse Dresden [[2, POI, 2.000, 7.57 km]]", + "Ostsächsische Sparkasse Dresden [[2, POI, 2.000, 8.06 km]]", + "Ostsächsische Sparkasse Dresden [[2, POI, 2.000, 8.83 km]]", + "Dresdner Volksbank Raiffeisenbank eG [[2, POI, 2.000, 8.97 km]]" ], "amenities": [ { diff --git a/OsmAnd-java/src/test/resources/search/burger_king.json b/OsmAnd-java/src/test/resources/search/burger_king.json index 78f2ecd72a..3108612856 100644 --- a/OsmAnd-java/src/test/resources/search/burger_king.json +++ b/OsmAnd-java/src/test/resources/search/burger_king.json @@ -11,17 +11,26 @@ }, "phrase": "Burger King", "results": [ - "Burger (Cafe / Cafe and restaurant)", - "Burger (Pub / Food)", - "Burger (Bar / Food)", - "Burger (Restaurant / Cafe and restaurant)", - "Burger (Biergarten / Food)", - "Burger (Fast food / Food)", - "Burger King", - "Burger King", - "Burger King", - "Burger King", - "Burger King" + "Burger King Thiendorf [[2, POI, 2.000, 46.35 km]]", + "Burger King [[2, POI, 2.000, 46.75 km]]", + "Burger King [[2, POI, 2.000, 57.61 km]]", + "Burger King [[2, POI, 2.000, 58.23 km]]", + "Burger King [[2, POI, 2.000, 59.20 km]]", + "Burger King [[2, POI, 2.000, 66.93 km]]", + "Burger King Riesa [[2, POI, 2.000, 78.15 km]]", + "Burger King [[2, POI, 2.000, 118.29 km]]", + "Bürger King Chemnitz [[2, POI, 2.000, 121.13 km]]", + "Burger King Chemnitz [[2, POI, 2.000, 123.17 km]]", + "Burger King [[2, POI, 2.000, 135.11 km]]", + "Burger King [[2, POI, 2.000, 139.54 km]]", + "Burger King [[2, POI, 2.000, 139.98 km]]", + "Burger King [[2, POI, 2.000, 140.17 km]]", + "Burger King Glauchau [[2, POI, 2.000, 142.15 km]]", + "Burger King [[2, POI, 2.000, 144.43 km]]", + "Burger King [[2, POI, 2.000, 146.38 km]]", + "Burger King [[2, POI, 2.000, 147.72 km]]", + "Burger King [[2, POI, 2.000, 148.27 km]]", + "Burger King [[2, POI, 2.000, 151.57 km]]" ], "amenities": [ { diff --git a/OsmAnd-java/src/test/resources/search/carrer_de_vic.json b/OsmAnd-java/src/test/resources/search/carrer_de_vic.json index 83ce2d7810..18f908690a 100644 --- a/OsmAnd-java/src/test/resources/search/carrer_de_vic.json +++ b/OsmAnd-java/src/test/resources/search/carrer_de_vic.json @@ -11,25 +11,70 @@ }, "phrase": "carrer de Vic, Sant Bartomeu del grau", "results": [ - "Carrer de Sant Bartomeu del Grau, Vic", - "Carrer de Vic, Sant Bartomeu del Grau", - "carrer Ponent, Sant Bartomeu del Grau", - "Carrer Pla de l'Oratori, Sant Bartomeu del Grau", - "carrer de Dalt, Sant Bartomeu del Grau", - "Carrer de la Migjorn, Sant Bartomeu del Grau", - "Carrer de la Tramuntana, Sant Bartomeu del Grau", - "Carrer de la Codina (Xalet Mas Reig), Sant Bartomeu del Grau", - "Carrer de Sant Bartomeu, Sant Cugat del Vallès", - "Carretera de Sant Bartomeu del Grau, Muntanyola", - "Carretera de Sant Bartomeu del Grau, Sant Bartomeu del Grau", - "Carretera de Sant Bartomeu, Sant Bartomeu del Grau", - "Carretera de Sant Bartomeu del Grau, Xalet Mas Reig", - "Camí de St. Bartomeu al Sorreig (Xalet Mas Reig), Sant Bartomeu del Grau", - "Carrer Tres Creus, Sant Bartomeu del Grau", - "Carrer del Mig, Sant Bartomeu del Grau", - "carrer Vell, Sant Bartomeu del Grau", - "Carrer Nou, Sant Bartomeu del Grau" + "Carrer de Vic, Sant Bartomeu del Grau [[7, STREET, 0.310, 64.33 km]]", + "Carrer de Sant Bartomeu del Grau, Vic [[7, STREET, 0.310, 61.63 km]]" ], + "extra-results": [ + "carrer Ponent, Sant Bartomeu del Grau [[6, STREET, 0.310, 64.29 km]]", + "Carrer Pla de l'Oratori, Sant Bartomeu del Grau [[6, STREET, 0.310, 64.38 km]]", + "carrer de Dalt, Sant Bartomeu del Grau [[6, STREET, 0.310, 64.44 km]]", + "Carrer de la Migjorn, Sant Bartomeu del Grau [[6, STREET, 0.310, 64.78 km]]", + "Carrer de la Tramuntana, Sant Bartomeu del Grau [[6, STREET, 0.310, 64.83 km]]", + "Carrer de la Codina (Xalet Mas Reig), Sant Bartomeu del Grau [[6, STREET, 0.310, 64.85 km]]", + "Carretera de Sant Bartomeu del Grau, Muntanyola [[5, STREET, 3.000, 61.03 km]]", + "Carretera de Sant Bartomeu del Grau, Sant Bartomeu del Grau [[5, STREET, 3.000, 63.00 km]]", + "Carretera de Sant Bartomeu del Grau, Xalet Mas Reig [[5, STREET, 3.000, 64.71 km]]", + "Carrer de Sant Bartomeu, Sant Cugat del Vallès [[5, STREET, 0.310, 11.20 km]]", + "Carrer Tres Creus, Sant Bartomeu del Grau [[5, STREET, 0.310, 64.34 km]]", + "Carrer del Mig, Sant Bartomeu del Grau [[5, STREET, 0.310, 64.43 km]]", + "carrer Vell, Sant Bartomeu del Grau [[5, STREET, 0.310, 64.47 km]]", + "Carrer Nou, Sant Bartomeu del Grau [[5, STREET, 0.310, 64.54 km]]", + "Carrer Llevant, Sant Bartomeu del Grau [[5, STREET, 0.310, 64.76 km]]", + "Carrer del Garbí, Sant Bartomeu del Grau [[5, STREET, 0.310, 64.79 km]]", + "Carrer del Gregal, Sant Bartomeu del Grau [[5, STREET, 0.310, 64.80 km]]", + "Carrer del Xaloc, Sant Bartomeu del Grau [[5, STREET, 0.310, 64.90 km]]", + "Túnel de la Fontfreda (Pere-riera), Sant Bartomeu del Grau [[5, STREET, 0.310, 56.61 km]]", + "Eix Transversal C-25 Viaducte de Pere-riera, Sant Bartomeu del Grau [[5, STREET, 0.310, 57.32 km]]", + "Camí de Ca la Burra, Sant Bartomeu del Grau [[5, STREET, 0.310, 57.58 km]]", + "Camí de Sant Genís, Sant Bartomeu del Grau [[5, STREET, 0.310, 63.08 km]]", + "Camí de Rogers, Sant Bartomeu del Grau [[5, STREET, 0.310, 63.60 km]]", + "Carretera de Sant Bartomeu, Sant Bartomeu del Grau [[5, STREET, 0.310, 63.68 km]]", + "Camí de St. Bartomeu al Sorreig (Xalet Mas Reig), Sant Bartomeu del Grau [[5, STREET, 0.310, 65.11 km]]", + "Carrer de Sant Bartomeu, Martorell [[4, STREET, 3.000, 6.20 km]]", + "Carrer de Sant Bartomeu de la Quadra (les Corts), Barcelona [[4, STREET, 3.000, 12.07 km]]", + "Carrer de Sant Bartomeu (el Raval), Barcelona [[4, STREET, 3.000, 17.67 km]]", + "Carrer de Sant Bartomeu (Sant Antoni de Llefià), Badalona [[4, STREET, 3.000, 20.95 km]]", + "Carrer de Sant Bartomeu (Sitges), Garraf [[4, STREET, 3.000, 24.54 km]]", + "Carrer de Sant Bartomeu, Vallromanes [[4, STREET, 3.000, 29.73 km]]", + "Carrer de Sant Bartomeu, Granollers [[4, STREET, 3.000, 33.57 km]]", + "Carrer de Sant Bartomeu, Igualada [[4, STREET, 3.000, 33.65 km]]", + "Carrer de Sant Bartomeu (Les Escodines), Manresa [[4, STREET, 3.000, 35.11 km]]", + "Carrer de Sant Bartomeu, Navarcles [[4, STREET, 3.000, 37.02 km]]", + "Carrer de Sant Bartomeu, Cabrera de Mar [[4, STREET, 3.000, 38.13 km]]", + "Carrer de Sant Bartomeu, Santa Oliva [[4, STREET, 3.000, 41.03 km]]", + "Carrer de Sant Bartomeu, Masarbonès [[4, STREET, 3.000, 47.72 km]]", + "Carrer de Sant Bartomeu (Masarbonès), Masllorenç [[4, STREET, 3.000, 47.72 km]]", + "Carrer de Sant Bartomeu (els Hostalets de Balenyà), Balenyà [[4, STREET, 3.000, 48.45 km]]", + "Carrer de Sant Bartomeu, Vistabella [[4, STREET, 3.000, 63.26 km]]", + "Carrer de Sant Bartomeu, Mas de Bondia [[4, STREET, 3.000, 67.50 km]]", + "Carrer de Sant Bartomeu (Mas de Bondia), Montornès de Segarra [[4, STREET, 3.000, 67.50 km]]", + "Carrer de Sant Bartomeu, l'Esquirol [[4, STREET, 3.000, 75.82 km]]", + "Carrer de Sant Bartomeu (Les Planes), l'Esquirol [[4, STREET, 3.000, 76.88 km]]", + "Carrer de Sant Bartomeu, Lloret de Mar [[4, STREET, 3.000, 79.60 km]]", + "Carrer de Sant Bartomeu, Coll de Nargó [[4, STREET, 3.000, 99.35 km]]", + "Carrer de Sant Bartomeu, Camallera [[4, STREET, 3.000, 113.48 km]]", + "Sant Bartomeu del Grau [[4, POI, 2.000, 64.32 km]]", + "Sant Bartomeu del Grau [[4, POI, 2.000, 64.60 km]]", + "Carrer Bartomeu Garcia i Subirà, Sant Boi de Llobregat [[4, STREET, 0.310, 11.59 km]]", + "Carretera de Sant Bartomeu, l'Ametlla del Vallès [[4, STREET, 0.310, 37.92 km]]", + "Camí d'Alboquers (Pere-riera), Sant Bartomeu del Grau [[4, STREET, 0.310, 58.08 km]]", + "Eix Transversal, Sant Bartomeu del Grau [[4, STREET, 0.310, 59.04 km]]", + "GR 3, Sant Bartomeu del Grau [[4, STREET, 0.310, 64.08 km]]", + "Passeig del Grau, Sant Bartomeu del Grau [[4, STREET, 0.310, 64.28 km]]", + "Plaça del Doctor Griera, Sant Bartomeu del Grau [[4, STREET, 0.310, 64.36 km]]", + "Carretera del Cementiri, Sant Bartomeu del Grau [[4, STREET, 0.310, 64.42 km]]" + ], + "amenities": [ { "name": "Collada de Sant Bartomeu", diff --git a/OsmAnd-java/src/test/resources/search/double_parking.json b/OsmAnd-java/src/test/resources/search/double_parking.json index 46abccb8d1..c3812aae31 100644 --- a/OsmAnd-java/src/test/resources/search/double_parking.json +++ b/OsmAnd-java/src/test/resources/search/double_parking.json @@ -9,24 +9,60 @@ "emptyQueryAllowed": false, "sortByName": false }, - "phrase": "parking", + "phrase": "parking ", "results": [ - "Parking (Personal transport)", - "Parking entrance (Personal transport)", - "Parking fee (Charging station / Transportation)", - "Parking fee: no (Charging station / Transportation)", - "Parking fee: yes (Charging station / Transportation)", - "Parking lot (Fire hydrant / Emergency infrastructure)", - "Parking space (Personal transport)", - "Parking tickets (Vending machine / Store)", - "Parking tickets (Vending machine / Store)", - "Parking time limit (Parking / Personal transport)", - "Bicycle parking (Bicycle transport)", - "Motorcycle parking (Personal transport)", - "Parking", - "Parking", - "Parking", - "Parking" + "Parking (Personal transport) [[1, POI_TYPE, 1.000, 0.00 km]]", + "для посетителей [[0, POI, 2.000, 0.03 km]]", + "Parking [[0, POI, 2.000, 0.05 km]]", + "Parking [[0, POI, 2.000, 0.11 km]]", + "Parking [[0, POI, 2.000, 0.16 km]]", + "Parking [[0, POI, 2.000, 0.17 km]]", + "Parking [[0, POI, 2.000, 0.23 km]]", + "Parking [[0, POI, 2.000, 0.35 km]]", + "Parking [[0, POI, 2.000, 0.40 km]]", + "Parking [[0, POI, 2.000, 0.48 km]]", + "Parking [[0, POI, 2.000, 0.49 km]]", + "Parking [[0, POI, 2.000, 0.55 km]]", + "Автостоянка №1 [[0, POI, 2.000, 0.56 km]]", + "Parking [[0, POI, 2.000, 0.58 km]]", + "Parking [[0, POI, 2.000, 0.61 km]]", + "Parking [[0, POI, 2.000, 0.72 km]]", + "Parking [[0, POI, 2.000, 0.81 km]]", + "Parking [[0, POI, 2.000, 0.81 km]]", + "Parking [[0, POI, 2.000, 0.85 km]]", + "для клиентов [[0, POI, 2.000, 0.89 km]]", + "Parking [[0, POI, 2.000, 0.93 km]]", + "Parking [[0, POI, 2.000, 0.94 km]]", + "Заинская ГРЭС [[0, POI, 2.000, 1.01 km]]", + "Parking [[0, POI, 2.000, 1.02 km]]", + "Южная [[0, POI, 2.000, 1.03 km]]", + "Parking [[0, POI, 2.000, 1.06 km]]", + "Parking [[0, POI, 2.000, 1.09 km]]", + "Parking [[0, POI, 2.000, 1.10 km]]", + "Служебная [[0, POI, 2.000, 1.14 km]]", + "Parking [[0, POI, 2.000, 1.20 km]]", + "Parking [[0, POI, 2.000, 1.21 km]]", + "Parking [[0, POI, 2.000, 1.36 km]]", + "Parking [[0, POI, 2.000, 1.44 km]]", + "Три тополя [[0, POI, 2.000, 1.47 km]]", + "Parking [[0, POI, 2.000, 1.53 km]]", + "Parking [[0, POI, 2.000, 1.56 km]]", + "Parking [[0, POI, 2.000, 1.62 km]]", + "Parking [[0, POI, 2.000, 1.85 km]]", + "Штрафстоянка (Эвакуатор) [[0, POI, 2.000, 2.03 km]]", + "Parking [[0, POI, 2.000, 2.05 km]]", + "для регистрации в ГИБДД [[0, POI, 2.000, 2.06 km]]", + "Parking [[0, POI, 2.000, 2.06 km]]", + "Parking [[0, POI, 2.000, 2.07 km]]", + "для техосмотра [[0, POI, 2.000, 2.09 km]]", + "Parking [[0, POI, 2.000, 2.18 km]]", + "Parking [[0, POI, 2.000, 2.55 km]]", + "Parking [[0, POI, 2.000, 3.40 km]]", + "Parking [[0, POI, 2.000, 3.41 km]]", + "Parking [[0, POI, 2.000, 3.41 km]]", + "Parking [[0, POI, 2.000, 3.45 km]]", + "Parking [[0, POI, 2.000, 4.29 km]]", + "Parking [[0, POI, 2.000, 6.71 km]]" ], "amenities": [ { diff --git a/OsmAnd-java/src/test/resources/search/free_street_portland.json b/OsmAnd-java/src/test/resources/search/free_street_portland.json index d39fbcab43..92351f530c 100644 --- a/OsmAnd-java/src/test/resources/search/free_street_portland.json +++ b/OsmAnd-java/src/test/resources/search/free_street_portland.json @@ -11,17 +11,18 @@ }, "phrase": "48 Free Street Portland", "results": [ - "48.0, ", - "48, Free Street (Downtown), Portland" + "48.0, [[0, PARTIAL_LOCATION, 1.000, 5274.99 km]]", + "48, Free Street (Downtown), Portland [[4, HOUSE, 0.043, 0.09 km]]", + "48, Portland Street, North Berwick [[3, HOUSE, 0.430, 54.48 km]]", + "Free Street (Downtown), Portland [[3, STREET, 0.310, 0.03 km]]", + "Free Street (Ferry Village), South Portland [[3, STREET, 0.310, 1.69 km]]", ], "extra-results": [ - "48, Portland Street, North Berwick", - "Free Street (Downtown), Portland", - "Free Street (Ferry Village), South Portland", - "Portland Street", - "Portland Street (Downtown), Portland", - "Portland Street Pier, South Portland", - "Portland Street, Yarmouth" + "Portland Street (Downtown), Portland [[2, STREET, 3.000, 0.62 km]]", + "Portland Street Pier, South Portland [[2, STREET, 3.000, 1.43 km]]", + "Portland Street, Yarmouth [[2, STREET, 3.000, 16.13 km]]", + "Portland Street, North Berwick [[2, STREET, 3.000, 54.37 km]]", + "Portland Street, Berwick [[2, STREET, 3.000, 59.60 km]]" ], "amenities": [ { diff --git a/OsmAnd-java/src/test/resources/search/fuel_diesel.json b/OsmAnd-java/src/test/resources/search/fuel_diesel.json new file mode 100644 index 0000000000..a7c9eb5ad7 --- /dev/null +++ b/OsmAnd-java/src/test/resources/search/fuel_diesel.json @@ -0,0 +1,1090 @@ +{ + "settings": { + "lat": "52.37277", + "lon": "4.89359", + "radiusLevel": 1, + "totalLimit": -1, + "lang": "", + "transliterateIfMissing": false, + "emptyQueryAllowed": false, + "sortByName": false + }, + "phrases": ["Fuel diesel", "Fuel diesel BP", "Fuel diesel "], + "results": [ + [ + "Gas station (Filling station)", + "Diesel", + "Diesel", + "Diesel/Benzin", + "Diesel", + "Diesel", + "Texaco Marnixstraat", + "Argos", + "BP", + "Isolatorweg", + "AVIA Marees Isolatorweg 40", + "Pin & Drive", + "Hansa", + "BP Coentunnel", + "Shell Europaboulevard", + "Kriterion", + "BP Kadoelen", + "Esso", + "Tango", + "Esso" + ], + [ + "Gas station (Filling station)", + "BP", + "BP Coentunnel", + "BP Kadoelen", + "Diesel", + "Diesel", + "Diesel/Benzin", + "Diesel", + "Diesel" + ], + [ + "Gas station (Filling station)", + "Diesel", + "Diesel", + "Diesel/Benzin", + "Diesel", + "Diesel", + "Texaco Marnixstraat", + "Argos", + "BP", + "Isolatorweg", + "AVIA Marees Isolatorweg 40", + "Pin & Drive", + "Hansa", + "BP Coentunnel", + "Shell Europaboulevard", + "Kriterion", + "BP Kadoelen", + "Esso", + "Tango", + "Esso" + ] + ], + "amenities": [ + { + "name": "Smitsven", + "lat": "52.43833", + "lon": "4.84435", + "id": 93229168, + "subType": "fuel", + "type": "transportation" + }, + { + "name": "Total", + "lat": "52.43126", + "lon": "4.85310", + "id": 5792135070, + "subType": "fuel", + "type": "transportation" + }, + { + "lat": "52.38280", + "lon": "4.87072", + "id": 297151392, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "operator": "Gulf" + } + }, + { + "name": "Tango", + "lat": "52.39063", + "lon": "4.80105", + "id": 1125848178, + "subType": "fuel", + "type": "transportation" + }, + { + "name": "Argos", + "lat": "52.42714", + "lon": "4.87797", + "id": 11836600936, + "subType": "fuel", + "type": "transportation" + }, + { + "lat": "52.38321", + "lon": "4.83377", + "id": 13447465828, + "subType": "fuel", + "type": "transportation" + }, + { + "name": "Argos", + "lat": "52.37679", + "lon": "4.86739", + "id": 2864423190, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "fuel_octane_95": "yes", + "fuel_diesel": "yes", + "access_private": "private", + "website": "https://www.argos.nl/tankstation/argos-amsterdam-jan-van-galenstraat-besloten-terrein/", + "operator": "Argos Amsterdam", + "brand": "Argos", + "note": "Not public accessible, in restricted commercial area." + } + }, + { + "name": "Total", + "lat": "52.33424", + "lon": "4.92848", + "id": 570682093, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "operator": "Total" + } + }, + { + "lat": "52.34905", + "lon": "4.85531", + "id": 1224007749, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "surface_paved": "paved", + "covered_yes": "yes" + } + }, + { + "name": "Tango", + "lat": "52.34189", + "lon": "4.79429", + "id": 1125841260, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "fuel_octane_95": "yes", + "fuel_diesel": "yes", + "fuel_octane_98": "yes", + "payment_maestro_yes": "yes", + "payment_cash_no": "no" + } + }, + { + "lat": "52.34941", + "lon": "4.89467", + "id": 11533103330, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "note": "Total Selfservicestation De Pijp", + "operator": "Total" + } + }, + { + "name": "BP Buitenveldert", + "lat": "52.33599", + "lon": "4.86834", + "id": 115716311, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "operator": "BP", + "start_date": "1982" + } + }, + { + "name": "Shell express", + "lat": "52.42085", + "lon": "4.95104", + "id": 9162110312, + "subType": "fuel", + "type": "transportation" + }, + { + "name": "Shell Westpoort", + "lat": "52.39624", + "lon": "4.80092", + "id": 5473469574, + "subType": "fuel", + "type": "transportation" + }, + { + "name": "Esso Osdorp", + "lat": "52.35525", + "lon": "4.81030", + "id": 890452205, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "brand": "Esso", + "alt_name": "Texaco Meer en Vaart" + } + }, + { + "name": "Diesel", + "lat": "52.36778", + "lon": "4.89119", + "id": 5448077178, + "subType": "clothes", + "type": "shop", + "openingHours": "Tu-We,Fr-Sa 10:00-18:00; Su-Mo 12:00-18:00; Th 10:00-21:00", + "additionalInfo": { + "wheelchair_yes": "yes", + "opening_hours": "Tu-We,Fr-Sa 10:00-18:00; Su-Mo 12:00-18:00; Th 10:00-21:00", + "phone": "+31 20 638 4082", + "brand": "Diesel" + } + }, + { + "lat": "52.34893", + "lon": "4.85527", + "id": 1224007735, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "surface_paved": "paved", + "covered_yes": "yes" + } + }, + { + "name": "BP Slagboom", + "lat": "52.34744", + "lon": "4.92569", + "id": 671496197, + "subType": "fuel", + "type": "transportation", + "openingHours": "24/7", + "additionalInfo": { + "opening_hours": "24/7", + "operator": "NP" + } + }, + { + "name": "Baarsjesweg", + "lat": "52.36767", + "lon": "4.86201", + "id": 1230247896, + "subType": "fuel", + "type": "transportation" + }, + { + "name": "BP Oude Haagseweg", + "lat": "52.33749", + "lon": "4.81813", + "id": 3197728670, + "subType": "fuel", + "type": "transportation", + "openingHours": "Mo-Fr 06:00-24:00; Sa 07:00-24:00; Su 08:00-24:00", + "additionalInfo": { + "fuel_octane_95": "yes", + "fuel_octane_98": "yes", + "opening_hours": "Mo-Fr 06:00-24:00; Sa 07:00-24:00; Su 08:00-24:00", + "operator": "BP" + } + }, + { + "name": "BP Sloterplas", + "lat": "52.37374", + "lon": "4.82729", + "id": 671496195, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "operator": "BP" + } + }, + { + "name": "Diesel", + "lat": "52.35958", + "lon": "4.87847", + "id": 9413553430, + "subType": "clothes", + "type": "shop" + }, + { + "name": "BP De Vries & Van Slooten", + "lat": "52.40107", + "lon": "4.90718", + "id": 671496193, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "operator": "BP" + } + }, + { + "name": "Shell", + "lat": "52.42951", + "lon": "4.84336", + "id": 5793072844, + "subType": "fuel", + "type": "transportation" + }, + { + "name": "Shell", + "lat": "52.34968", + "lon": "4.88544", + "id": 9092747702, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "brand": "Shell" + } + }, + { + "name": "Esso", + "lat": "52.38703", + "lon": "4.92479", + "id": 470389254, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "operator": "Esso", + "brand": "Esso" + } + }, + { + "name": "Avia", + "lat": "52.43224", + "lon": "4.87578", + "id": 11836723214, + "subType": "fuel", + "type": "transportation" + }, + { + "lat": "52.34897", + "lon": "4.85544", + "id": 1224007739, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "surface_paved": "paved", + "covered_yes": "yes", + "horse_no": "no" + } + }, + { + "name": "Osdorperweg", + "lat": "52.36775", + "lon": "4.78274", + "id": 92736522, + "subType": "fuel", + "type": "transportation" + }, + { + "name": "AVIA Marees Isolatorweg 40", + "lat": "52.39425", + "lon": "4.85076", + "id": 3437131090, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "fuel_octane_95": "yes", + "fuel_diesel": "yes", + "operator": "Marees", + "brand": "AVIA" + } + }, + { + "name": "Esso", + "lat": "52.42867", + "lon": "4.79980", + "id": 6592660390, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "fuel_octane_95": "yes", + "shop_additional_yes": "yes", + "fuel_diesel": "yes", + "fuel_octane_98": "yes", + "fuel_e85": "yes", + "fuel_lpg": "yes", + "operator": "Texaco Pouw BV" + } + }, + { + "name": "Isolatorweg", + "lat": "52.39422", + "lon": "4.85079", + "id": 5257482314, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "fuel_octane_95": "yes", + "shop_additional_yes": "yes", + "fuel_diesel": "yes", + "operator": "Olthof", + "brand": "Avia" + } + }, + { + "name": "BP Westerspoor-Zuid", + "lat": "52.43067", + "lon": "4.80388", + "id": 571547525, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "operator": "BP", + "start_date": "2002" + } + }, + { + "name": "Tinq", + "lat": "52.36690", + "lon": "4.78388", + "id": 1132779156, + "subType": "fuel", + "type": "transportation" + }, + { + "lat": "52.43117", + "lon": "4.85362", + "id": 93189782, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "operator": "Kok Tankstations BV" + } + }, + { + "name": "Tamoil", + "lat": "52.31194", + "lon": "4.87454", + "id": 1201991038, + "subType": "fuel", + "type": "transportation", + "openingHours": "24/7", + "additionalInfo": { + "opening_hours": "24/7", + "phone": "+31884007321" + } + }, + { + "name": "Esso", + "names": { + "nl": "ESSO Diemen" + }, + "lat": "52.33298", + "lon": "4.98215", + "id": 3325409264, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "fuel_octane_95": "yes", + "fuel_diesel": "yes", + "fuel_octane_98": "yes", + "self_service_yes": "yes", + "fuel_lpg": "yes", + "website": "https://www.essofuelfinder.nl/nl-nl/diemen--essodiemen-100359738", + "operator": "EG Group", + "brand": "Esso" + } + }, + { + "name": "Esso", + "lat": "52.33215", + "lon": "4.91194", + "id": 5680960518, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "operator": "Esso" + } + }, + { + "name": "BP", + "lat": "52.41550", + "lon": "4.87426", + "id": 89648457, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "start_date": "1973" + } + }, + { + "name": "Diesel", + "lat": "52.96288", + "lon": "4.78116", + "id": 2720685942, + "subType": "waterway_fuel", + "type": "transportation" + }, + { + "name": "Diesel", + "lat": "52.96288", + "lon": "4.78116", + "id": 2720685942, + "subType": "small_craft_facility", + "type": "seamark" + }, + { + "lat": "52.43279", + "lon": "4.88108", + "id": 99445647, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "operator": "Avia" + } + }, + { + "name": "Shell A9 Amstelveen Noordzijde", + "lat": "52.30592", + "lon": "4.83609", + "id": 5562850742, + "subType": "fuel", + "type": "transportation", + "openingHours": "24/7", + "additionalInfo": { + "opening_hours": "24/7", + "operator": "Shell" + } + }, + { + "name": "Pin & Drive", + "lat": "52.38304", + "lon": "4.83373", + "id": 1343255990, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "fuel_diesel": "yes", + "website": "http://pinendrive.nl", + "note": "diesel & benzine", + "alt_name": "Tankstation Haris BV" + } + }, + { + "name": "Autoradam", + "lat": "52.38359", + "lon": "4.86014", + "id": 11758107894, + "subType": "fuel", + "type": "transportation", + "openingHours": "24/7", + "additionalInfo": { + "opening_hours": "24/7" + } + }, + { + "name": "TinQ Badhoevedo", + "lat": "52.34212", + "lon": "4.78536", + "id": 1202042180, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "operator": "TinQ" + } + }, + { + "name": "Shell Europaboulevard", + "lat": "52.32815", + "lon": "4.88954", + "id": 5637411240, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "fuel_octane_95": "yes", + "fuel_diesel": "yes", + "fuel_octane_98": "yes", + "brand": "Shell" + } + }, + { + "name": "Texaco Marnixstraat", + "lat": "52.36993", + "lon": "4.87696", + "id": 92756650, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "fuel_diesel": "yes", + "fuel_lpg": "yes", + "operator": "EFR SERVICES NETHERLANDS B.V." + } + }, + { + "name": "Kok", + "lat": "52.43544", + "lon": "4.81444", + "id": 562350380, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "brand": "AVIA" + } + }, + { + "name": "Total Kadoelen", + "lat": "52.41648", + "lon": "4.91233", + "id": 5693092218, + "subType": "fuel", + "type": "transportation" + }, + { + "name": "Total Vlugtlaan", + "lat": "52.38012", + "lon": "4.82800", + "id": 890388131, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "operator": "Total Amsterdam", + "brand": "Total" + } + }, + { + "name": "BP Oude Haagseweg", + "lat": "52.33758", + "lon": "4.81817", + "id": 5616941048, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "operator": "BP" + } + }, + { + "name": "Tinq", + "lat": "52.35049", + "lon": "4.93896", + "id": 1132783038, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "brand": "Tinq" + } + }, + { + "name": "BP Kadoelen", + "lat": "52.41960", + "lon": "4.91218", + "id": 62007626, + "subType": "fuel", + "type": "transportation", + "openingHours": "24/7", + "additionalInfo": { + "fuel_octane_95": "yes", + "fuel_diesel": "yes", + "fuel_octane_98": "yes", + "fuel_lpg": "yes", + "opening_hours": "24/7" + } + }, + { + "lat": "52.34604", + "lon": "4.97816", + "id": 460257555, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "operator": "Shell" + } + }, + { + "name": "Hansa", + "lat": "52.34407", + "lon": "4.84205", + "id": 236323756, + "subType": "fuel", + "type": "transportation", + "openingHours": "24/7", + "additionalInfo": { + "fuel_diesel": "yes", + "fuel_octane_98": "yes", + "payment_maestro_yes": "yes", + "payment_notes_yes": "yes", + "payment_coins_yes": "yes", + "fuel_octane_95": "yes", + "fuel_octane_100": "yes", + "opening_hours": "24/7", + "website": "https://find.shell.com/nl/fuel/12661638-shell-station-hansa/nl_NL", + "phone": "+31206177018", + "operator": "Shell", + "brand": "Shell" + } + }, + { + "name": "Esso", + "lat": "52.31786", + "lon": "4.87008", + "id": 61912014, + "subType": "fuel", + "type": "transportation" + }, + { + "name": "Shell", + "lat": "52.39634", + "lon": "4.80079", + "id": 972110096, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "operator": "Shell" + } + }, + { + "name": "Argos", + "lat": "52.39909", + "lon": "4.94018", + "id": 5696605642, + "subType": "fuel", + "type": "transportation" + }, + { + "name": "Argos", + "lat": "52.36382", + "lon": "4.83536", + "id": 5384852724, + "subType": "fuel", + "type": "transportation" + }, + { + "name": "Makro Amsterdam", + "lat": "52.32508", + "lon": "4.92529", + "id": 9423577524, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "fuel_cng": "yes", + "wheelchair_yes": "yes", + "fuel_lpg": "yes", + "toilets_wheelchair_yes": "yes" + } + }, + { + "name": "Shell van Slingelandtstraat", + "lat": "52.38410", + "lon": "4.86475", + "id": 297151412, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "operator": "Shell" + } + }, + { + "name": "Diesel/Benzin", + "lat": "52.36818", + "lon": "4.96599", + "id": 8988805510, + "subType": "small_craft_facility", + "type": "seamark", + "additionalInfo": { + "description": "Diesel, Benzin" + } + }, + { + "name": "Lukoil Zaandam", + "lat": "52.44236", + "lon": "4.81197", + "id": 9041702382, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "website": "http://www.lukoil.nl/go/lukoil_station.cfm?id=469", + "brand": "Lukoil" + } + }, + { + "lat": "52.42963", + "lon": "4.84334", + "id": 871250152, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "operator": "Shell" + } + }, + { + "name": "BP Nieuwe Hemweg", + "lat": "52.39374", + "lon": "4.86503", + "id": 3266785854, + "subType": "fuel", + "type": "transportation", + "openingHours": "24/7", + "additionalInfo": { + "opening_hours": "24/7", + "website": "https://www.bp.com/", + "phone": "+3120-4889514", + "description": "AH to go", + "operator": "BP" + } + }, + { + "name": "BP", + "lat": "52.33593", + "lon": "4.86849", + "id": 1118602024, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "operator": "BP" + } + }, + { + "name": "Tango", + "lat": "52.36246", + "lon": "4.82753", + "id": 11435170396, + "subType": "fuel", + "type": "transportation" + }, + { + "name": "BP Coentunnel", + "lat": "52.41546", + "lon": "4.87452", + "id": 178863395, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "fuel_octane_95": "yes", + "fuel_diesel": "yes", + "operator": "BP", + "brand": "BP" + } + }, + { + "name": "BP", + "lat": "52.34904", + "lon": "4.85531", + "id": 61987006, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "fuel_octane_95": "yes", + "fuel_diesel": "yes", + "fuel_lpg": "yes", + "website": "https://www.bp.com/", + "phone": "+31 (0) 20 671 4678", + "operator": "BP" + } + }, + { + "name": "Esso", + "lat": "52.35600", + "lon": "4.82452", + "id": 1185962557, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "phone": "0204084081", + "brand": "Esso" + } + }, + { + "name": "Kriterion", + "lat": "52.36889", + "lon": "4.97071", + "id": 60237274, + "subType": "fuel", + "type": "transportation", + "openingHours": "Mo-Su 06:00-23:00", + "additionalInfo": { + "fuel_octane_95": "yes", + "payment_visa_yes": "yes", + "payment_mastercard_yes": "yes", + "fuel_diesel": "yes", + "payment_maestro_yes": "yes", + "payment_cash_yes": "yes", + "opening_hours": "Mo-Su 06:00-23:00", + "brand": "Shell", + "note": "owned and operated by students; fuel brand: Shell." + } + }, + { + "name": "Tinq", + "lat": "52.34032", + "lon": "4.89716", + "id": 1132780364, + "subType": "fuel", + "type": "transportation", + "openingHours": "Mo-Su 07:00-23:00", + "additionalInfo": { + "opening_hours": "Mo-Su 07:00-23:00", + "brand": "Tinq" + } + }, + { + "lat": "52.30504", + "lon": "4.92280", + "id": 60500940, + "subType": "fuel", + "type": "transportation", + "openingHours": "24/7", + "additionalInfo": { + "opening_hours": "24/7", + "operator": "Esso" + } + }, + { + "name": "Total", + "lat": "52.34267", + "lon": "4.85699", + "id": 60675146, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "wheelchair_yes": "yes", + "website": "http://www.total.nl", + "description": "selfservicestation", + "operator": "Total" + } + }, + { + "name": "Total Flierbos", + "lat": "52.31563", + "lon": "4.96408", + "id": 502639714, + "subType": "fuel", + "type": "transportation" + }, + { + "name": "Tinq", + "lat": "52.33639", + "lon": "4.94681", + "id": 1134367690, + "subType": "fuel", + "type": "transportation" + }, + { + "name": "Esso Express", + "lat": "52.31725", + "lon": "4.86960", + "id": 497051574, + "subType": "fuel", + "type": "transportation" + }, + { + "name": "Esso", + "lat": "52.43040", + "lon": "4.86394", + "id": 5750021548, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "phone": "+3175-6159517", + "brand": "Esso" + } + }, + { + "name": "Diesel", + "lat": "52.36770", + "lon": "4.89132", + "id": 6919427832, + "subType": "clothes", + "type": "shop" + }, + { + "name": "Total", + "lat": "52.43621", + "lon": "4.81671", + "id": 5787172710, + "subType": "fuel", + "type": "transportation" + }, + { + "name": "BP Gooiseweg", + "lat": "52.34768", + "lon": "4.92636", + "id": 5660457972, + "subType": "fuel", + "type": "transportation", + "openingHours": "24/7", + "additionalInfo": { + "opening_hours": "24/7", + "operator": "BP" + } + }, + { + "name": "Garage Lux", + "lat": "52.35263", + "lon": "4.92883", + "id": 1486917817, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "operator": "Garage Lux" + } + }, + { + "name": "Total Ganzenhoef", + "lat": "52.31761", + "lon": "4.96301", + "id": 502639726, + "subType": "fuel", + "type": "transportation" + }, + { + "name": "Texaco Sarphatistraat", + "lat": "52.36694", + "lon": "4.92430", + "id": 53224118, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "operator": "EFR Services", + "brand": "Texaco" + } + }, + { + "name": "BP Zuiderzeeweg", + "lat": "52.38918", + "lon": "4.96470", + "id": 2264161136, + "subType": "fuel", + "type": "transportation", + "openingHours": "24/7", + "additionalInfo": { + "opening_hours": "24/7", + "website": "https://www.bp.com/", + "phone": "+31204942593", + "operator": "BP", + "brand": "BP" + } + }, + { + "lat": "52.30575", + "lon": "4.93400", + "id": 14491874838, + "subType": "fuel", + "type": "transportation" + }, + { + "name": "Gulf Badhoevedorp", + "lat": "52.34104", + "lon": "4.78309", + "id": 1202042172, + "subType": "fuel", + "type": "transportation", + "additionalInfo": { + "phone": "020-6593527", + "operator": "Gulf" + } + }, + { + "name": "Jan van Gentstraat", + "lat": "52.33569", + "lon": "4.79489", + "id": 92453470, + "subType": "fuel", + "type": "transportation" + }, + { + "lat": "52.41498", + "lon": "4.89739", + "id": 1094649633, + "subType": "fuel", + "type": "transportation" + } + ], + "cities": [] +} \ No newline at end of file diff --git a/OsmAnd-java/src/test/resources/search/hisar.json b/OsmAnd-java/src/test/resources/search/hisar.json new file mode 100644 index 0000000000..6feaf5989e --- /dev/null +++ b/OsmAnd-java/src/test/resources/search/hisar.json @@ -0,0 +1,2143 @@ +{ + "settings": { + "lat": "28.65172", + "lon": "77.22193", + "radiusLevel": 1, + "totalLimit": -1, + "lang": "", + "transliterateIfMissing": false, + "emptyQueryAllowed": false, + "sortByName": false + }, + "phrase": "421, Sector 15A, Hisar", + "results": [ + "421.25, ", + "421, Sector 15A, Hisar", + "Sector 15A, Hisar", + "Hisar", + "پل حصار", + "Hisarcık", + "Демир Хисар", + "Бачка Паланка", + "Tanwar Hospital, Hisar", + "Hisar", + "Eye-Q Super Speciality Eye Hospitals, Hisar, Jindal Chowk", + "Ravindra Hospital And Heart Center - Hisar", + "Kailash Hospital, Hisar", + "Sharda Hospital, Hisar", + "Geetanjali Hospital, Hisar", + "N. D. Hospital, Hisar", + "Jain Eye Hospital, Hisar", + "Sai Hospital, Hisar", + "Hisar", + "Surya Hospital, Hisar", + "Goverment Polytechnic Hisar", + "Hisar Children Hospital", + "Hisar Junction", + "Sharma Nursing Home, Hisar", + "Eye Q Super Speciality Eye Hospitals, Hisar", + "Aakash Hospital, Hisar", + "Hisar Bus Stand", + "Malik Nursing Home, Hisar", + "District Civil Hospital Hisar", + "Veer Hospital, Hisar", + "Sangwan Hospital, Hisar" + ], + "amenities": [ + { + "name": "Hisarcık", + "lat": "39.25052", + "lon": "29.23127", + "id": -28899, + "subType": "town", + "type": "administrative" + }, + { + "name": "Sangwan Hospital, Hisar", + "lat": "29.50597", + "lon": "75.88285", + "id": 14018526132, + "subType": "hospital", + "type": "healthcare" + }, + { + "name": "Goverment Polytechnic Hisar", + "lat": "29.17199", + "lon": "75.74159", + "id": 367272909, + "subType": "college", + "type": "education" + }, + { + "name": "Surya Hospital, Hisar", + "lat": "29.13962", + "lon": "75.73537", + "id": 14002788814, + "subType": "hospital", + "type": "healthcare" + }, + { + "name": "Демир Хисар", + "enName": "Demir Hisar", + "lat": "41.21991", + "lon": "21.20207", + "id": -28017, + "subType": "town", + "type": "administrative" + }, + { + "name": "Hisar", + "names": { + "ja": "ヒサール" + }, + "lat": "29.17879", + "lon": "75.75726", + "id": 366474597, + "subType": "aerodrome", + "type": "transportation", + "additionalInfo": { + "iata": "HSS" + } + }, + { + "name": "Hisar Bus Stand", + "lat": "29.16556", + "lon": "75.71857", + "id": 367259217, + "subType": "bus_station", + "type": "transportation", + "additionalInfo": { + "bus_yes": "yes" + } + }, + { + "name": "Hisar Bus Stand", + "lat": "29.16556", + "lon": "75.71857", + "id": 367259217, + "subType": "public_transport_station", + "type": "transportation", + "additionalInfo": { + "bus_yes": "yes" + } + }, + { + "name": "Veer Hospital, Hisar", + "lat": "29.50171", + "lon": "75.88705", + "id": 14016686980, + "subType": "hospital", + "type": "healthcare" + }, + { + "name": "Ravindra Hospital And Heart Center - Hisar", + "lat": "29.13312", + "lon": "75.74616", + "id": 13994070504, + "subType": "hospital", + "type": "healthcare" + }, + { + "name": "Hisar Children Hospital", + "lat": "29.14841", + "lon": "75.72445", + "id": 14006901018, + "subType": "hospital", + "type": "healthcare" + }, + { + "name": "Geetanjali Hospital, Hisar", + "lat": "29.13213", + "lon": "75.74344", + "id": 13995400392, + "subType": "hospital", + "type": "healthcare", + "additionalInfo": { + "website": "http://www.geetanjalihospitalhisar.com", + "email": "geetanjalihospitalhisar@gmail.com" + } + }, + { + "name": "Hisar", + "names": { + "ar": "حصار", + "hi": "हिसार", + "de": "Hisar", + "ru": "Хисар", + "kn": "ಹಿಸಾರ್", + "ja": "ヒサール", + "fa": "حصار", + "fr": "Hisar", + "ta": "ஹிசார்", + "es": "Hisar" + }, + "lat": "29.15628", + "lon": "75.72921", + "id": -81021, + "subType": "city", + "type": "administrative", + "additionalInfo": { + "population": "301240" + } + }, + { + "name": "Tanwar Hospital, Hisar", + "lat": "29.09366", + "lon": "75.95949", + "id": 14017613498, + "subType": "hospital", + "type": "healthcare" + }, + { + "name": "Eye-Q Super Speciality Eye Hospitals, Hisar, Jindal Chowk", + "lat": "29.13408", + "lon": "75.74666", + "id": 14002391512, + "subType": "hospital", + "type": "healthcare", + "additionalInfo": { + "website": "http://www.eyeqindia.com/" + } + }, + { + "name": "Kailash Hospital, Hisar", + "lat": "29.13050", + "lon": "75.74309", + "id": 13994689126, + "subType": "hospital", + "type": "healthcare" + }, + { + "name": "Aakash Hospital, Hisar", + "lat": "29.16350", + "lon": "75.71775", + "id": 14003764922, + "subType": "hospital", + "type": "healthcare" + }, + { + "name": "Hisar", + "names": { + "hi": "हिसार", + "pa": "ਹਿਸਾਰ", + "de": "Hisar", + "ar": "حصار", + "kn": "ಹಿಸಾರ್", + "ru": "Хисар", + "ja": "ヒサール", + "fa": "حصار", + "fr": "Hisar", + "ur": "حصار", + "ta": "ஹிசார்", + "es": "Hisar" + }, + "lat": "29.15628", + "lon": "75.72921", + "id": 1542464122, + "subType": "city", + "type": "administrative", + "additionalInfo": { + "population": "301240", + "wikipedia": "http://en.wikipedia.org/wiki/Hisar (city)" + } + }, + { + "name": "پل حصار", + "enName": "Pul-e Hisar", + "lat": "35.62017", + "lon": "69.46578", + "id": -35021, + "subType": "town", + "type": "administrative" + }, + { + "name": "N. D. Hospital, Hisar", + "lat": "29.13376", + "lon": "75.74337", + "id": 13987934828, + "subType": "hospital", + "type": "healthcare" + }, + { + "name": "Sharda Hospital, Hisar", + "lat": "29.13415", + "lon": "75.74430", + "id": 14020205240, + "subType": "hospital", + "type": "healthcare" + }, + { + "name": "Hisar Junction", + "lat": "29.15235", + "lon": "75.72458", + "id": 3886032948, + "subType": "public_transport_station", + "type": "transportation", + "additionalInfo": { + "network": "IR", + "ref": "HSR", + "operator": "NR", + "wikipedia": "http://en.wikipedia.org/wiki/Hisar Junction railway station" + } + }, + { + "name": "Hisar Junction", + "lat": "29.15235", + "lon": "75.72458", + "id": 3886032948, + "subType": "railway_station", + "type": "transportation", + "additionalInfo": { + "network": "IR", + "ref": "HSR", + "operator": "NR", + "wikipedia": "http://en.wikipedia.org/wiki/Hisar Junction railway station" + } + }, + { + "name": "Malik Nursing Home, Hisar", + "lat": "29.15555", + "lon": "75.71372", + "id": 14020678628, + "subType": "clinic", + "type": "healthcare" + }, + { + "name": "Hisar", + "lat": "29.10361", + "lon": "75.88634", + "id": 250986657, + "subType": "power_substation", + "type": "man_made", + "additionalInfo": { + "substation_transmission": "transmission", + "voltage": "400000;220000" + } + }, + { + "name": "Бачка Паланка", + "enName": "Bačka Palanka", + "names": { + "de": "Plankenburg", + "ru": "Бачка Паланка", + "sk": "Báčska Palanka", + "hu": "Palánka", + "tr": "Küçük Hisar", + "sr": "Бачка Паланка" + }, + "lat": "45.25025", + "lon": "19.39608", + "id": -90393, + "subType": "town", + "type": "administrative", + "additionalInfo": { + "population": "29449" + } + }, + { + "name": "Sharma Nursing Home, Hisar", + "lat": "29.15231", + "lon": "75.71674", + "id": 13995732832, + "subType": "hospital", + "type": "healthcare", + "additionalInfo": { + "website": "http://snhhisar.4t.com/", + "email": "snhhisar@sancharnet.in" + } + }, + { + "name": "District Civil Hospital Hisar", + "lat": "29.16992", + "lon": "75.71855", + "id": 14015078342, + "subType": "hospital", + "type": "healthcare", + "additionalInfo": { + "description": "Civil Hospital" + } + }, + { + "name": "Jain Eye Hospital, Hisar", + "lat": "29.13286", + "lon": "75.74142", + "id": 13987934496, + "subType": "hospital", + "type": "healthcare" + }, + { + "name": "Eye Q Super Speciality Eye Hospitals, Hisar", + "lat": "29.16957", + "lon": "75.72136", + "id": 13988029790, + "subType": "hospital", + "type": "healthcare" + }, + { + "name": "Sai Hospital, Hisar", + "lat": "29.13241", + "lon": "75.74093", + "id": 13995541100, + "subType": "hospital", + "type": "healthcare" + } + ], + "cities": [ + { + "name": "Bhuna", + "names": { + "hi": "भूना" + }, + "lat": "29.53355", + "lon": "75.70522", + "id": 1798597526, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Ladwa", + "lat": "29.99482", + "lon": "77.04969", + "id": 7251240345, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Sangarya", + "names": { + "ta": "சங்கரிய" + }, + "lat": "29.79144", + "lon": "74.46440", + "id": 245768836, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Thanesar", + "names": { + "ar": "تانيسر", + "hi": "थानेसर", + "kn": "ಥಾನೇಸರ್", + "ur": "تھانیسر" + }, + "lat": "29.97506", + "lon": "76.83094", + "id": 245769218, + "type": "CITY", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Ferozepur Jhirka", + "names": { + "hi": "फ़िरोज़पुर झिरका" + }, + "lat": "27.78768", + "lon": "76.94649", + "id": 1777068877, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Nising", + "names": { + "hi": "निसिंग" + }, + "lat": "29.69030", + "lon": "76.75050", + "id": 245768718, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Bawal", + "names": { + "hi": "बावल", + "uk": "Бавал" + }, + "lat": "28.07136", + "lon": "76.58089", + "id": 3195684306, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Pundri", + "names": { + "hi": "पूण्डरी" + }, + "lat": "29.76076", + "lon": "76.55905", + "id": 245768843, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Sonipat", + "names": { + "ar": "سوني بت", + "hi": "सोनीपत", + "pa": "ਸੋਨੀਪਤ", + "ru": "Сонипат", + "ja": "ソーニーパト", + "ta": "சோனிபத்", + "ur": "سونی پت" + }, + "lat": "29.00331", + "lon": "77.01673", + "id": 245767308, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Panchkula", + "names": { + "hi": "पंचकुला", + "pa": "ਪੰਚਕੁਲਾ", + "ja": "パンチクラー", + "ta": "பஞ்ச்குலா" + }, + "lat": "30.69754", + "lon": "76.85511", + "id": 1432932807, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Shahzadpur", + "lat": "30.44641", + "lon": "77.03342", + "id": 6600814817, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Narnaul", + "names": { + "hi": "नारनौल" + }, + "lat": "28.04385", + "lon": "76.10620", + "id": 1739310619, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Sadhaura", + "names": { + "hi": "साढौरा" + }, + "lat": "30.38535", + "lon": "77.22123", + "id": 1804140668, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Gurugram", + "enName": "Gurugram", + "names": { + "ar": "غرو غرام", + "hi": "गुरुग्राम", + "kn": "ಗುರುಗ್ರಾಮ", + "ja": "グルガーオン", + "fa": "گورگان", + "ta": "குர்காவுன்", + "ur": "گرو گرام" + }, + "lat": "28.46461", + "lon": "77.02992", + "id": 2718939516, + "type": "CITY", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Faridabad", + "enName": "Faridabád", + "names": { + "de": "Faridabad", + "hi": "फ़रीदाबाद", + "ar": "فريد آباد", + "pa": "ਫ਼ਰੀਦਾਬਾਦ", + "kn": "ಫರೀದಬಾದ್", + "ru": "Фаридабад", + "uk": "Фарідабад", + "ja": "ファリーダーバード", + "fr": "Faridabad", + "ta": "பரிதாபாது", + "ur": "فریدآباد", + "es": "Faridabad" + }, + "lat": "28.40284", + "lon": "77.30856", + "id": 245765268, + "type": "CITY", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Radaur", + "names": { + "hi": "रादौर" + }, + "lat": "30.03020", + "lon": "77.15119", + "id": 311934434, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Shahbad", + "lat": "30.16617", + "lon": "76.86786", + "id": 7090718615, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Kalka", + "names": { + "hi": "कालका" + }, + "lat": "30.83668", + "lon": "76.93693", + "id": 245770782, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Kalanwali", + "names": { + "hi": "कालांवाली" + }, + "lat": "29.83306", + "lon": "74.97609", + "id": 1396800702, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Dharuhera", + "lat": "28.20552", + "lon": "76.79531", + "id": 3159106993, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Mandi Dabwali", + "names": { + "hi": "मंडी डबवाली", + "pa": "ਮੰਡੀ ਡੱਬਵਾਲੀ" + }, + "lat": "29.96571", + "lon": "74.70294", + "id": 1396800704, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Hansi", + "names": { + "ar": "هانسي", + "hi": "हांसी", + "ja": "ハーンシー", + "ur": "ہانسی" + }, + "lat": "29.10532", + "lon": "75.96341", + "id": 1396151305, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Charkhi Dadri", + "names": { + "hi": "चरखी दादरी", + "pa": "ਚਰਖੀ ਦਾਦਰੀ", + "ja": "チャルキ・ダドリ" + }, + "lat": "28.59199", + "lon": "76.27198", + "id": 245766042, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Uklana", + "names": { + "hi": "उकलाना" + }, + "lat": "29.51244", + "lon": "75.87820", + "id": 1396322940, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Narwana", + "names": { + "hi": "नरवाना", + "ta": "நார்வேனா" + }, + "lat": "29.59576", + "lon": "76.11857", + "id": 1396221563, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Hisar", + "enName": "Hisar", + "names": { + "de": "Hisar", + "hi": "हिसार", + "ar": "حصار", + "pa": "ਹਿਸਾਰ", + "kn": "ಹಿಸಾರ್", + "ru": "Хисар", + "ja": "ヒサール", + "fa": "حصار", + "fr": "Hisar", + "ta": "ஹிசார்", + "ur": "حصار", + "es": "Hisar" + }, + "lat": "29.15627", + "lon": "75.72923", + "id": 771232061, + "type": "CITY", + "listOfStreets": [ + { + "name": "Hissar Ambala Road", + "lat": "29.20453", + "lon": "75.74565", + "id": 856 + }, + { + "name": "", + "enName": "", + "names": { + "de": "", + "hi": "<हिसार>", + "ar": "<حصار>", + "pa": "<ਹਿਸਾਰ>", + "kn": "<ಹಿಸಾರ್>", + "ru": "<Хисар>", + "ja": "<ヒサール>", + "fa": "<حصار>", + "fr": "", + "ta": "<ஹிசார்>", + "ur": "<حصار>", + "es": "" + }, + "lat": "29.14695", + "lon": "75.70780", + "id": 1470 + }, + { + "name": "Airport Road", + "lat": "29.17738", + "lon": "75.75277", + "id": 868 + }, + { + "name": "Bhai Parmanand Marg", + "names": { + "hi": "भाई पर्मानंद मार्ग" + }, + "lat": "29.13758", + "lon": "75.72243", + "id": 870 + }, + { + "name": "Hisar Cantt", + "lat": "29.11387", + "lon": "75.81706", + "id": 1097 + }, + { + "name": "Raipur Road", + "lat": "29.15968", + "lon": "75.76535", + "id": 869 + }, + { + "name": "Satya Nagar", + "lat": "29.16106", + "lon": "75.70730", + "id": 87 + }, + { + "name": "Sector 15A", + "lat": "29.13385", + "lon": "75.71799", + "id": 198, + "buildings": [ + { + "name": "394", + "lat": "29.13394", + "lon": "75.71696" + }, + { + "name": "395", + "lat": "29.13406", + "lon": "75.71702" + }, + { + "name": "395", + "lat": "29.13415", + "lon": "75.71713" + }, + { + "name": "396", + "lat": "29.13411", + "lon": "75.71722" + }, + { + "name": "397", + "lat": "29.13408", + "lon": "75.71730" + }, + { + "name": "398", + "lat": "29.13406", + "lon": "75.71739" + }, + { + "name": "399", + "lat": "29.13402", + "lon": "75.71747" + }, + { + "name": "400", + "lat": "29.13400", + "lon": "75.71756" + }, + { + "name": "401", + "lat": "29.13398", + "lon": "75.71764" + }, + { + "name": "402", + "lat": "29.13396", + "lon": "75.71773" + }, + { + "name": "403", + "lat": "29.13393", + "lon": "75.71782" + }, + { + "name": "404", + "lat": "29.13389", + "lon": "75.71790" + }, + { + "name": "405", + "lat": "29.13385", + "lon": "75.71799" + }, + { + "name": "406", + "lat": "29.13383", + "lon": "75.71810" + }, + { + "name": "407", + "lat": "29.13378", + "lon": "75.71818" + }, + { + "name": "421", + "lat": "29.13488", + "lon": "75.71852" + }, + { + "name": "422", + "lat": "29.13483", + "lon": "75.71848" + }, + { + "name": "423", + "lat": "29.13473", + "lon": "75.71844" + }, + { + "name": "424", + "lat": "29.13466", + "lon": "75.71842" + }, + { + "name": "425", + "lat": "29.13458", + "lon": "75.71835" + }, + { + "name": "426", + "lat": "29.13453", + "lon": "75.71833" + }, + { + "name": "427", + "lat": "29.13445", + "lon": "75.71829" + }, + { + "name": "428", + "lat": "29.13438", + "lon": "75.71822" + }, + { + "name": "429", + "lat": "29.13432", + "lon": "75.71820" + }, + { + "name": "430", + "lat": "29.13424", + "lon": "75.71816" + }, + { + "name": "431", + "lat": "29.13419", + "lon": "75.71812" + }, + { + "name": "432", + "lat": "29.13406", + "lon": "75.71803" + }, + { + "name": "432", + "lat": "29.13408", + "lon": "75.71807" + }, + { + "name": "433", + "lat": "29.13490", + "lon": "75.71724" + }, + { + "name": "434", + "lat": "29.13483", + "lon": "75.71719" + }, + { + "name": "435", + "lat": "29.13475", + "lon": "75.71715" + }, + { + "name": "436", + "lat": "29.13468", + "lon": "75.71713" + }, + { + "name": "437", + "lat": "29.13460", + "lon": "75.71709" + }, + { + "name": "438", + "lat": "29.13451", + "lon": "75.71707" + }, + { + "name": "439", + "lat": "29.13445", + "lon": "75.71704" + }, + { + "name": "440", + "lat": "29.13438", + "lon": "75.71702" + }, + { + "name": "441", + "lat": "29.13432", + "lon": "75.71698" + }, + { + "name": "442", + "lat": "29.13426", + "lon": "75.71694" + }, + { + "name": "443", + "lat": "29.13417", + "lon": "75.71689" + }, + { + "name": "444", + "lat": "29.13409", + "lon": "75.71685" + }, + { + "name": "445", + "lat": "29.13400", + "lon": "75.71681" + }, + { + "name": "446-P", + "lat": "29.13393", + "lon": "75.71679" + }, + { + "name": "460", + "lat": "29.13505", + "lon": "75.71702" + }, + { + "name": "461-P", + "lat": "29.13518", + "lon": "75.71700" + }, + { + "name": "462", + "lat": "29.13514", + "lon": "75.71709" + }, + { + "name": "463", + "lat": "29.13513", + "lon": "75.71719" + }, + { + "name": "464", + "lat": "29.13509", + "lon": "75.71728" + }, + { + "name": "465", + "lat": "29.13505", + "lon": "75.71734" + }, + { + "name": "466", + "lat": "29.13503", + "lon": "75.71743" + }, + { + "name": "467", + "lat": "29.13499", + "lon": "75.71752" + }, + { + "name": "468", + "lat": "29.13496", + "lon": "75.71758" + }, + { + "name": "469", + "lat": "29.13492", + "lon": "75.71764" + }, + { + "name": "470", + "lat": "29.13488", + "lon": "75.71773" + }, + { + "name": "471", + "lat": "29.13486", + "lon": "75.71779" + }, + { + "name": "472", + "lat": "29.13481", + "lon": "75.71790" + }, + { + "name": "473", + "lat": "29.13477", + "lon": "75.71801" + }, + { + "name": "474", + "lat": "29.13471", + "lon": "75.71812" + }, + { + "name": "476", + "lat": "29.13490", + "lon": "75.71831" + } + ] + }, + { + "name": "Tosham Road", + "lat": "29.13102", + "lon": "75.74170", + "id": 773 + }, + { + "name": "gali no 3", + "lat": "29.12693", + "lon": "75.70822", + "id": 117 + } + ], + "init": 1, + "matchCity": 1, + "matchStreet": 1 + }, + { + "name": "New Delhi", + "enName": "New Delhi", + "names": { + "hi": "नई दिल्ली", + "pt": "Nova Deli", + "hr": "New Delhi", + "ht": "Niou Deli", + "hu": "Újdelhi", + "lmo": "New Delhi", + "yi": "ניי דעלי", + "hy": "Նյու Դելի", + "nah": "Yancuīc Deli", + "yo": "New Delhi", + "pms": "New Delhi", + "ia": "Nove Delhi", + "nan": "Sin Delhi", + "id": "New Delhi", + "sco": "New Delhi", + "scn": "Nova Delhi", + "ext": "Nueva Delhi", + "qu": "Musuq Dilhi", + "af": "Nieu-Delhi", + "pnb": "نئی دلی", + "io": "Nova-Delhi", + "is": "Nýja Delí", + "it": "Nuova Delhi", + "am": "ኒው ዴሊ", + "an": "Nueva Delhi", + "zh": "新德里", + "ar": "دلهي الجديدة", + "ja": "ニューデリー", + "ro": "New Delhi", + "be": "Нью-Дэлі", + "ru": "Нью-Дели", + "bg": "Ню Делхи", + "bn": "নতুন দিল্লি", + "jv": "New Delhi", + "bo": "ནེའུ་དིལ་ལི།", + "sa": "नवदेहली", + "br": "New Delhi", + "bs": "New Delhi", + "ka": "ნიუ-დელი", + "si": "නව දිල්ලිය", + "sk": "Naí Dillí", + "sl": "New Delhi", + "so": "New Delhi", + "ca": "Nova Delhi", + "sq": "New Delhi", + "sr": "Њу Делхи", + "kk": "Нью-Дели", + "mzn": "نو دهلی", + "kl": "New Delhi", + "kn": "ಹೊಸ ದೆಹಲಿ", + "sv": "New Delhi", + "ko": "뉴델리", + "sw": "New Delhi", + "ks": "نٔو دلھی", + "ku": "Delhiya Nû", + "co": "New Delhi", + "ta": "புது தில்லி", + "cs": "Nové Dillí", + "te": "క్రొత్త ఢిల్లీ", + "tg": "Ню-Дели", + "th": "นิวเดลี", + "la": "Dellium Novum", + "cy": "Delhi Newydd", + "lb": "Nei-Delhi", + "tl": "Bagong Delhi", + "da": "New Delhi", + "tr": "Yeni Delhi", + "be-tarask": "Нью-Дэлі", + "de": "Neu-Delhi", + "ace": "New delhi", + "hif": "New Delhi", + "lt": "Naujasis Delis", + "lv": "Ņūdeli", + "simple": "New Delhi", + "lij": "Neuva Delhi", + "diq": "Delhiyo Newe", + "dv": "ނިއުދިއްލީ", + "ug": "Yéngi Déhli", + "uk": "Нью-Делі", + "fiu-vro": "New Delhi", + "mg": "New Delhi", + "mi": "New Delhi", + "pam": "New Delhi", + "ur": "نئی دہلی", + "mk": "Њу Делхи", + "ml": "ന്യൂ ഡെൽഹി", + "mn": "Шинэ Дели", + "mr": "नवी दिल्ली", + "ms": "New Delhi", + "el": "Νέο Δελχί", + "eo": "Nov-Delhio", + "my": "နယူးဒေလီမြို့", + "es": "Nueva Delhi", + "et": "New Delhi", + "eu": "New Delhi", + "vi": "Tân Delhi", + "bat-smg": "Naujasės Delės", + "ne": "नयाँ दिल्ली", + "fa": "دهلی نو", + "nl": "New Delhi", + "nn": "New Delhi", + "no": "New Delhi", + "fi": "New Delhi", + "yue": "新德里", + "fr": "New Delhi", + "fy": "Nij Delly", + "nov": "Novi Deli", + "oc": "Nòva Delhi", + "crh": "Nyu Deli", + "ga": "Nua-Deilí", + "ang": "Nīƿe Delhi", + "sah": "Саҥа Дели", + "gd": "New Delhi", + "os": "Нью-Дели", + "gl": "Nova Deli - नई दिल्ली", + "war": "New Delhi", + "bpy": "নুৱা দিল্লী", + "gv": "Delhi Noa", + "pa": "ਨਵੀਂ ਦਿੱਲੀ", + "cbk-zam": "Nueva Delhi", + "ckb": "نیودلھی", + "pl": "Nowe Delhi", + "he": "ניו דלהי" + }, + "lat": "28.61418", + "lon": "77.20227", + "id": 16173236, + "type": "CITY", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Barwala", + "names": { + "hi": "बरवाला" + }, + "lat": "29.36612", + "lon": "75.90707", + "id": 1396322291, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Barara", + "lat": "30.21422", + "lon": "77.03836", + "id": 7090772207, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Hassanpur", + "names": { + "hi": "हसनपुर" + }, + "lat": "27.96892", + "lon": "77.49422", + "id": 2429775200, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Bawani Khera", + "names": { + "hi": "बवानी खेड़ा" + }, + "lat": "28.94977", + "lon": "76.03175", + "id": 1395398114, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Bhiwani", + "enName": "Bhiwani", + "names": { + "de": "Bhiwani", + "hi": "भिवानी", + "pa": "ਭਿਵਾਨੀ", + "kn": "ಭಿವಾನಿ", + "ru": "Вхивани", + "ja": "ビワーニー", + "fr": "Bhiwani", + "es": "Bhiwani" + }, + "lat": "28.79317", + "lon": "76.13913", + "id": 1395398115, + "type": "CITY", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Manesar", + "names": { + "ja": "マネサル" + }, + "lat": "28.35639", + "lon": "76.93718", + "id": 1996955018, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Taraori", + "names": { + "ar": "تراوري", + "hi": "तरावड़ी", + "ur": "تراوری" + }, + "lat": "29.80046", + "lon": "76.92738", + "id": 2634530968, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Chandhat", + "names": { + "hi": "चाँदहट" + }, + "lat": "28.12234", + "lon": "77.44651", + "id": 2429803332, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Kharkhoda", + "names": { + "hi": "खरखौदा" + }, + "lat": "28.87773", + "lon": "76.91180", + "id": 2737939553, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Jhajjar", + "names": { + "hi": "झज्जर", + "pa": "ਝੱਜਰ" + }, + "lat": "28.60668", + "lon": "76.65808", + "id": 1397401437, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Taoru", + "names": { + "hi": "तावड़ू" + }, + "lat": "28.20571", + "lon": "76.94506", + "id": 2953319839, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Safidon", + "names": { + "hi": "सफीदों", + "kn": "ಸಫೀದೋಂ" + }, + "lat": "29.40476", + "lon": "76.65991", + "id": 1802090175, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Jind", + "enName": "Jind", + "names": { + "ar": "جند", + "de": "Jind", + "hi": "जीन्द", + "pa": "ਜੀਂਦ", + "kn": "ಜಿಂದ್", + "ja": "ジンド", + "fr": "Jind", + "ur": "جند", + "es": "Jind" + }, + "lat": "29.31404", + "lon": "76.31795", + "id": 1144143339, + "type": "CITY", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Loharu", + "lat": "28.42795", + "lon": "75.80548", + "id": 245765373, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Rewari", + "enName": "Rewari", + "names": { + "hi": "रेवाड़ी", + "pa": "ਰੇਵਾੜੀ", + "kn": "ರೇವರಿ", + "ja": "レーワーリー", + "ta": "ரேவாரி" + }, + "lat": "28.19565", + "lon": "76.61652", + "id": 520986776, + "type": "CITY", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Mohna", + "names": { + "hi": "मोहना" + }, + "lat": "28.22288", + "lon": "77.44479", + "id": 2429827919, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Indri", + "names": { + "hi": "इन्द्री" + }, + "lat": "29.87894", + "lon": "77.05206", + "id": 311937677, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Bapoli", + "lat": "29.33729", + "lon": "77.08514", + "id": 7250349820, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Gohana", + "names": { + "ar": "غوهانا", + "hi": "गोहाना", + "kn": "ಗೊಹಾನ", + "ja": "ゴハナ", + "ta": "கோஹனா", + "ur": "گوہانا" + }, + "lat": "29.13722", + "lon": "76.70452", + "id": 245767678, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Karnal", + "enName": "Karnal", + "names": { + "ar": "كرنال", + "de": "Karnal", + "hi": "करनाल", + "pa": "ਕਰਨਾਲ", + "kn": "ಕರ್ನಾಲ್", + "ja": "カルナール", + "bn": "কার্নাল", + "fr": "Karnal", + "ta": "கர்னால்", + "ur": "کرنال", + "es": "Karnal" + }, + "lat": "29.68033", + "lon": "76.98963", + "id": 982143511, + "type": "CITY", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Chhatar", + "names": { + "hi": "छतर" + }, + "lat": "29.51294", + "lon": "76.31348", + "id": 5286438532, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Badhra", + "names": { + "hi": "बाढड़ा", + "ja": "バドラ" + }, + "lat": "28.51086", + "lon": "75.93739", + "id": 3669656933, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Siwani", + "names": { + "hi": "सिवानी", + "kn": "ಸಿವಾನಿ", + "ja": "シワニ" + }, + "lat": "28.91103", + "lon": "75.61234", + "id": 1757600990, + "type": "CITY", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Matenhail", + "lat": "28.57789", + "lon": "76.46811", + "id": 7090767302, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Ambala", + "enName": "Ambala", + "names": { + "de": "Ambala", + "hi": "अम्बाला", + "pa": "ਅੰਬਾਲਾ", + "kn": "ಅಂಬಾಲ", + "ru": "Амбала", + "ja": "アンバーラー", + "fr": "Ambala", + "ta": "அம்பாலா", + "es": "Ambala" + }, + "lat": "30.38437", + "lon": "76.77042", + "id": 176044062, + "type": "CITY", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Mahendragarh", + "names": { + "hi": "महेन्द्रगढ़", + "pa": "ਮਹਿੰਦਰਗੜ੍ਹ", + "ta": "மஹேந்திரங்கார்ஹ்" + }, + "lat": "28.26591", + "lon": "76.15148", + "id": 1739279693, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Cheeka", + "names": { + "hi": "चीका" + }, + "lat": "30.04810", + "lon": "76.33386", + "id": 2628723655, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Delhi", + "enName": "Delhi", + "names": { + "de": "Delhi", + "hi": "दिल्ली", + "ru": "Дели", + "pt": "Deli", + "lv": "Deli", + "bn": "দিল্লি", + "fr": "Delhi", + "oc": "Delhi", + "uk": "Делі", + "ur": "دہلی", + "ml": "ഡെൽഹി", + "kn": "ದೆಹಲಿ", + "ko": "델리", + "ms": "Delhi", + "el": "Δελχί", + "eo": "Delhio", + "ku": "Delhî", + "my": "ဒေလီမြို့", + "ta": "தில்லி", + "es": "Delhi", + "zh": "德里", + "cs": "Dillí", + "ar": "دلهي", + "pa": "ਦਿੱਲੀ", + "th": "เดลี", + "ja": "デリー", + "ne": "दिल्ली", + "ckb": "دێلهی", + "fa": "دهلی", + "he": "דלהי" + }, + "lat": "28.65172", + "lon": "77.22194", + "id": 2702400314, + "type": "CITY", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Israna", + "lat": "29.27818", + "lon": "76.85082", + "id": 7090767304, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Sirsa", + "enName": "Sirsa", + "names": { + "ar": "سرسا", + "de": "Sirsa", + "hi": "सिरसा", + "pa": "ਸਿਰਸਾ", + "kn": "ಸಿರ್ಸಾ", + "ru": "Сирса", + "ja": "シルサ", + "fr": "Sirsa", + "ur": "سرسا", + "es": "Sirsa" + }, + "lat": "29.53728", + "lon": "75.03776", + "id": 245768393, + "type": "CITY", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Yamunanagar", + "enName": "Yamunanagar", + "names": { + "ar": "جمنا نغر", + "de": "Yamunanaga", + "hi": "यमुनानगर", + "pa": "ਯਮੁਨਾਨਗਰ", + "kn": "ಯಮುನನಗರ", + "uk": "Ямунанаґар", + "ja": "ヤムナーナガル", + "fr": "Yamunanaga", + "ta": "யமுனா நகர்", + "ur": "جمنا نگر", + "es": "Yamuna Naga" + }, + "lat": "30.12313", + "lon": "77.28633", + "id": 245769418, + "type": "CITY", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Tosham", + "names": { + "hi": "तोशाम" + }, + "lat": "28.87020", + "lon": "75.91530", + "id": 1395403741, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Sohna", + "enName": "Sohna", + "names": { + "hi": "सोहना" + }, + "lat": "28.24599", + "lon": "77.06710", + "id": 1307288992, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Kurukshetra", + "names": { + "ar": "كروكشيتر", + "hi": "कुरुक्षेत्र", + "pa": "ਕੁਰੂਕਸ਼ੇਤਰ", + "kn": "ಕುರುಕ್ಷೇತ್ರ", + "ja": "クルクシェトラ", + "ur": "کروکشیتر" + }, + "lat": "29.96937", + "lon": "76.84828", + "id": 245769169, + "type": "CITY", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Pehowa", + "names": { + "hi": "पिहोवा", + "ru": "Пехова", + "uk": "Пегова" + }, + "lat": "29.97837", + "lon": "76.58324", + "id": 817818057, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Samana", + "names": { + "hi": "समाना", + "pa": "ਸਮਾਣਾ" + }, + "lat": "30.15525", + "lon": "76.20243", + "id": 1144142412, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Naraingarh", + "names": { + "hi": "नारायणगढ़", + "pa": "ਨਰਾਇਣਗੜ੍ਹ" + }, + "lat": "30.47239", + "lon": "77.12427", + "id": 302560565, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Hodal", + "lat": "27.89992", + "lon": "77.37393", + "id": 245762908, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Jagadhari", + "names": { + "ar": "جغادهري", + "hi": "जगाधरी", + "ur": "جگادہری" + }, + "lat": "30.16890", + "lon": "77.30190", + "id": 245769511, + "type": "CITY", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Gannaur", + "names": { + "hi": "गन्नौर" + }, + "lat": "29.13332", + "lon": "77.01764", + "id": 311937751, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Ellenabad", + "names": { + "hi": "ऐलनाबाद", + "ru": "Элленабад" + }, + "lat": "29.45214", + "lon": "74.66347", + "id": 245768228, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Rohtak", + "enName": "Rohtak", + "names": { + "ar": "روهتك", + "de": "Rohtak", + "hi": "रोहतक", + "pa": "ਰੋਹਤਕ", + "kn": "ರೋಹ್ಟಕ್", + "ja": "ロータク", + "bn": "রওহটাক", + "fr": "Rohtak", + "ur": "روہتک", + "es": "Rohtak" + }, + "lat": "28.90109", + "lon": "76.58019", + "id": 1397139972, + "type": "CITY", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Samalkha", + "names": { + "ar": "سامالكها", + "hi": "समालखा", + "ur": "سامالکھا" + }, + "lat": "29.23771", + "lon": "77.00938", + "id": 311937747, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Gharaunda", + "names": { + "hi": "घरौंदा" + }, + "lat": "29.53619", + "lon": "76.96979", + "id": 311937746, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Jakhal", + "lat": "29.80193", + "lon": "75.82233", + "id": 245768866, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Tauru", + "lat": "28.21093", + "lon": "76.95064", + "id": 588254168, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Bilaspur", + "names": { + "hi": "बिलासपुर", + "pa": "ਬਿਲਾਸਪੁਰ", + "ta": "பிலாசுப்பூர் (சத்தீசுகர்)" + }, + "lat": "30.30426", + "lon": "77.30273", + "id": 3039967803, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Panipat", + "enName": "Panipat", + "names": { + "ar": "باني بت", + "de": "Panipat", + "hi": "पानीपत", + "pa": "ਪਾਨੀਪਤ", + "kn": "ಪಾನಿಪತ್", + "ja": "パーニーパト", + "fr": "Pânipat", + "ur": "پانی پت", + "es": "Panipat" + }, + "lat": "29.39128", + "lon": "76.97717", + "id": 245768111, + "type": "CITY", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Chhachhrauli", + "names": { + "hi": "छछरौली" + }, + "lat": "30.24557", + "lon": "77.35923", + "id": 3039967804, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Kaithal", + "enName": "Kaithal", + "names": { + "de": "Kaithal", + "hi": "कैथल", + "pa": "ਕੈਥਲ", + "kn": "ಕೈತಾಲ್", + "ja": "カイサル", + "fr": "Kaithal", + "es": "Kaithal" + }, + "lat": "29.79966", + "lon": "76.39899", + "id": 1143706658, + "type": "CITY", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Asandh", + "names": { + "hi": "असन्ध" + }, + "lat": "29.52127", + "lon": "76.60346", + "id": 245768365, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Pinjore", + "enName": "Pinjore", + "names": { + "hi": "पिंजौर" + }, + "lat": "30.80424", + "lon": "76.91495", + "id": 567278081, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Palwal", + "names": { + "hi": "पलवल", + "pa": "ਪਲਵਲ", + "ja": "パルワル" + }, + "lat": "28.14057", + "lon": "77.32598", + "id": 1812344279, + "type": "CITY", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Ratia", + "names": { + "hi": "रतिया", + "ta": "ராடியா" + }, + "lat": "29.68507", + "lon": "75.57324", + "id": 1396983320, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Nuh", + "names": { + "hi": "नूँह", + "pa": "ਨੂੰਹ", + "ta": "நூஹ்" + }, + "lat": "28.10334", + "lon": "77.00480", + "id": 1307289465, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Shadipur Julana", + "names": { + "hi": "शादीपुर जुलाना" + }, + "lat": "29.12334", + "lon": "76.40281", + "id": 1812853215, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Nilokheri", + "names": { + "hi": "नीलोखेड़ी" + }, + "lat": "29.83977", + "lon": "76.93180", + "id": 982143328, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Kanina Khas", + "names": { + "hi": "कनीना खास" + }, + "lat": "28.33025", + "lon": "76.30914", + "id": 1732367128, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Fatehabad", + "names": { + "ar": "فتح آباد", + "hi": "फ़तेहाबाद", + "pa": "ਫ਼ਤਿਹਾਬਾਦ", + "ta": "பாட்டெஹாபாத்", + "ur": "فتح آباد" + }, + "lat": "29.51043", + "lon": "75.45353", + "id": 1396551467, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Tohana", + "names": { + "hi": "टोहाना", + "ta": "டோஹானா" + }, + "lat": "29.71079", + "lon": "75.90423", + "id": 3183719452, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Bahadurgarh", + "names": { + "hi": "बहादुरगढ़", + "or": "ବାହାଦୁର୍‌ଗଡ଼", + "ru": "Бахадургарх", + "bh": "बहादुरगढ", + "uk": "Багадурґарг", + "ja": "バハードゥルガル", + "bn": "বাহাদুরগড়", + "zh": "巴哈杜尔加尔" + }, + "lat": "28.69332", + "lon": "76.93324", + "id": 245766462, + "type": "CITY", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Bass", + "lat": "29.11136", + "lon": "76.19958", + "id": 7250837813, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + }, + { + "name": "Kaul", + "names": { + "hi": "कौल" + }, + "lat": "29.84601", + "lon": "76.66075", + "id": 2634287835, + "type": "TOWN", + "listOfStreets": [], + "init": 1 + } + ] +} \ No newline at end of file diff --git a/OsmAnd-java/src/test/resources/search/charging_stations.json b/OsmAnd-java/src/test/resources/search/kiev.json similarity index 99% rename from OsmAnd-java/src/test/resources/search/charging_stations.json rename to OsmAnd-java/src/test/resources/search/kiev.json index 740ea4bc7c..84de0dd6b0 100644 --- a/OsmAnd-java/src/test/resources/search/charging_stations.json +++ b/OsmAnd-java/src/test/resources/search/kiev.json @@ -11,9 +11,9 @@ }, "phrase": "Київ Саксаганського вулиця 32", "results": [ - "32, Саксаганського вулиця, Київ", - "Саксаганського вулиця, Київ", - "вул. Саксаганського (на вимогу)" + "32, Саксаганського вулиця, Київ [[3, HOUSE, 0.430, 1.79 km]]", + "Саксаганського вулиця, Київ [[2, STREET, 3.000, 1.61 km]]", + "вул. Саксаганського (на вимогу) [[1, POI, 2.000, 1.61 km]]" ], "amenities": [ { diff --git a/OsmAnd-java/src/test/resources/search/navacerrada.json b/OsmAnd-java/src/test/resources/search/navacerrada.json index b4c94a734e..8bf429fc8a 100644 --- a/OsmAnd-java/src/test/resources/search/navacerrada.json +++ b/OsmAnd-java/src/test/resources/search/navacerrada.json @@ -11,69 +11,28 @@ }, "phrase": "Calle de las eras 5, Navacerrada", "results": [ - "5, Calle de las Eras (Uranización Los Corales), Navacerrada" + "5, Calle de las Eras (Uranización Los Corales), Navacerrada [[6, HOUSE, 0.043, 70.17 km]]", + "Calle de las Eras (Uranización Los Corales), Navacerrada [[5, STREET, 0.310, 70.15 km]]" ], - "extra-results": [ - "Calle de las Eras (Uranización Los Corales), Navacerrada", - "Calle del Sotillo (Uranización Los Corales), Pasaje de las Eras (Uranización Los Corales), Navacerrada", - "Calle del Puerto de Navacerrada, Las Nieves", - "5, Calle Navacerrada (Urb. Las Suertes), Las Suertes", - "50, Calle de Francisco Navacerrada, Salamanca", - "52, Calle de Francisco Navacerrada, Salamanca", - "53, Calle de Francisco Navacerrada, Salamanca", - "54, Calle de Francisco Navacerrada, Salamanca", - "55, Calle de Francisco Navacerrada, Salamanca", - "56, Calle de Francisco Navacerrada, Salamanca", - "57, Calle de Francisco Navacerrada, Salamanca", - "58, Calle de Francisco Navacerrada, Salamanca", - "59, Calle de Francisco Navacerrada, Salamanca", - "Pasaje de las Eras (Uranización Los Corales), Navacerrada", - "Calle Barrio de las Peñas, Navacerrada", - "Calle de las Cruces (Residencial Sanabria), Navacerrada", - "Calle de las Escuelas, Navacerrada", - "Calle de las Huertas (Residencial Sanabria), Navacerrada", - "Calle de la Virgen de las Nieves, Puerto de Navacerrada", - "Calle Puerto de Navacerrada, La Poveda", - "Calle del Embalse de Navacerrada, Villa de Vallecas", - "Calle del Puerto de Navacerrada, Puente de Vallecas", - "Calle de Francisco Navacerrada, Salamanca", - "Calle de Navacerrada, Moraleja de Enmedio", - "Calle Navacerrada (Urb. Las Suertes), Las Suertes", - "Calle Puerto de Navacerrada, Roman Candelas", - "Calle Navacerrada, Becerril de la Sierra", - "Carretera de Collado Villalba a Navacerrada, El Baillo y las Hojarascas", - "Calle de Ángel Rojas, Navacerrada", - "Calle de los Robles (Uranización Los Corales), Navacerrada", - "Calle de los Enebros (Uranización Los Corales), Navacerrada", - "Calle de la Bola del Mundo (Residencial Sanabria), Navacerrada", - "Calle de la Maliciosa (Residencial Sanabria), Navacerrada", - "Calle de la Perdiz, Navacerrada", - "Calle de la Magdalena, Navacerrada", - "Calle las Jaras, Navacerrada", - "Calle de la Audiencia, Navacerrada", - "Calle de Prado Jerez, Navacerrada", - "Calle de Carmen Conde (Residencial Sanabria), Navacerrada", - "Calle de la Iglesia, Navacerrada", - "Calle de la Tejera, Navacerrada", - "Calle de la Encinilla, Navacerrada", - "Calle de la Canaleja (Residencial Sanabria), Navacerrada", - "Calle de Rafael Alvarado, Navacerrada", - "Calle de Andrés Segovia, Navacerrada", - "Calle de los Pradillos (Residencial Sanabria), Navacerrada", - "Calle de Abel, Navacerrada", - "Calle Praderas de San Sebastián, Navacerrada", - "Calle de San Sebastián (Residencial Sanabria), Navacerrada", - "Calle de Álvaro Iglesia, Navacerrada", - "Calle de los Arcos, Navacerrada", - "Calle de Peñalara, Puerto de Navacerrada", - "Calle de la Bola del Mundo, Puerto de Navacerrada", - "Calle de la Estación, Puerto de Navacerrada", - "Calle Ginos, Puerto de Navacerrada", - "Calle Vitoria, Puerto de Navacerrada", - "Calle Dos Castillas, Puerto de Navacerrada", - "Travesía de las Huertas, Navacerrada", - "Vereda de las Encinillas, Navacerrada", - "Centro Municipal de Mayores «Navacerrada»", + "extra-results": [ + "5, Calle Navacerrada (Urb. Las Suertes), Las Suertes [[4, HOUSE, 0.430, 60.50 km]]", + "50, Calle de Francisco Navacerrada, Salamanca [[4, HOUSE, 0.430, 26.37 km]]", + "52, Calle de Francisco Navacerrada, Salamanca [[4, HOUSE, 0.430, 26.36 km]]", + "53, Calle de Francisco Navacerrada, Salamanca [[4, HOUSE, 0.430, 26.38 km]]", + "54, Calle de Francisco Navacerrada, Salamanca [[4, HOUSE, 0.430, 26.36 km]]", + "55, Calle de Francisco Navacerrada, Salamanca [[4, HOUSE, 0.430, 26.38 km]]", + "56, Calle de Francisco Navacerrada, Salamanca [[4, HOUSE, 0.430, 26.36 km]]", + "57, Calle de Francisco Navacerrada, Salamanca [[4, HOUSE, 0.430, 26.37 km]]", + "58, Calle de Francisco Navacerrada, Salamanca [[4, HOUSE, 0.430, 26.35 km]]", + "59, Calle de Francisco Navacerrada, Salamanca [[4, HOUSE, 0.430, 26.35 km]]", + "Pasaje de las Eras (Uranización Los Corales), Navacerrada [[4, STREET, 0.310, 70.23 km]]", + "Calle del Puerto de Navacerrada, Las Nieves [[4, STREET, 0.310, 33.80 km]]", + "Calle Barrio de las Peñas, Navacerrada [[4, STREET, 0.310, 70.10 km]]", + "Calle de las Cruces (Residencial Sanabria), Navacerrada [[4, STREET, 0.310, 70.14 km]]", + "Calle de las Escuelas, Navacerrada [[4, STREET, 0.310, 70.17 km]]", + "Calle de las Huertas (Residencial Sanabria), Navacerrada [[4, STREET, 0.310, 70.18 km]]", + "Calle de la Virgen de las Nieves, Puerto de Navacerrada [[4, STREET, 0.310, 74.59 km]]", + "Calle del Sotillo (Uranización Los Corales), Pasaje de las Eras (Uranización Los Corales), Navacerrada [[4, STREET_INTERSECTION, 0.043, 70.23 km]]" ], "amenities": [ { diff --git a/OsmAnd-java/src/test/resources/search/olc.json b/OsmAnd-java/src/test/resources/search/olc.json index c4db0630cd..104f132446 100644 --- a/OsmAnd-java/src/test/resources/search/olc.json +++ b/OsmAnd-java/src/test/resources/search/olc.json @@ -11,7 +11,7 @@ }, "phrase": "QHW6+CQ", "results": [ - "55.796062, 37.56194" + "55.796062, 37.56194 [[1, LOCATION, 1.000, 6.52 km]]" ], "cities": [] } \ No newline at end of file diff --git a/OsmAnd-java/src/test/resources/search/poi_biergarten.json b/OsmAnd-java/src/test/resources/search/poi_biergarten.json index 362e58f4d7..63c19b794f 100644 --- a/OsmAnd-java/src/test/resources/search/poi_biergarten.json +++ b/OsmAnd-java/src/test/resources/search/poi_biergarten.json @@ -9,18 +9,66 @@ "emptyQueryAllowed": false, "sortByName": false }, - "phrase": "Biergarten", + "phrase": "Biergarten ", "results": [ - "Biergarten (Food)", - "Biergarten Italienisches Dörfchen", - "Biergarten Narrenhäus'l", - "Biergarten Elbsegler", - "Biergarten Elbsegler", - "Biergarten", - "Biergarten", - "Biergarten", - "Biergarten", - "Biergarten" + "Biergarten (Food) [[1, POI_TYPE, 1.000, 0.00 km]]", + "Biergarten Italienisches Dörfchen [[1, POI, 2.000, 0.55 km]]", + "Biergarten Narrenhäus'l [[1, POI, 2.000, 0.84 km]]", + "Biergarten Elbsegler [[1, POI, 2.000, 0.89 km]]", + "Biergarten Elbsegler [[1, POI, 2.000, 0.90 km]]", + "Körnergarten [[1, POI, 2.000, 5.18 km]]", + "Biergarten Goldener Anker [[1, POI, 2.000, 9.78 km]]", + "Palais Bistro [[0, POI, 2.000, 0.29 km]]", + "Augustus Garten am Narrenhäusl [[0, POI, 2.000, 0.88 km]]", + "Zum Schießhaus [[0, POI, 2.000, 0.96 km]]", + "Biergarten [[0, POI, 2.000, 1.24 km]]", + "Wachstube [[0, POI, 2.000, 1.24 km]]", + "Torwirtschaft [[0, POI, 2.000, 1.27 km]]", + "Altes Wettbüro [[0, POI, 2.000, 1.77 km]]", + "Bottoms Up [[0, POI, 2.000, 2.16 km]]", + "Louisengarten [[0, POI, 2.000, 2.20 km]]", + "Biergarten [[0, POI, 2.000, 2.28 km]]", + "Fährgarten Johannstadt [[0, POI, 2.000, 2.42 km]]", + "Carolaschlösschen [[0, POI, 2.000, 2.53 km]]", + "Alt-Dresden [[0, POI, 2.000, 2.75 km]]", + "Biergarten [[0, POI, 2.000, 2.90 km]]", + "Café & Restaurant Saite [[0, POI, 2.000, 3.09 km]]", + "Brauhaus am Waldschlößchen [[0, POI, 2.000, 3.45 km]]", + "Brauhaus Watzke [[0, POI, 2.000, 3.51 km]]", + "el Horst [[0, POI, 2.000, 3.67 km]]", + "Biergarten [[0, POI, 2.000, 3.74 km]]", + "Spitzwegerich [[0, POI, 2.000, 3.81 km]]", + "Biergarten [[0, POI, 2.000, 3.88 km]]", + "Biergarten [[0, POI, 2.000, 4.46 km]]", + "Trobischhof [[0, POI, 2.000, 4.48 km]]", + "Biergarten [[0, POI, 2.000, 4.80 km]]", + "Biergarten [[0, POI, 2.000, 4.91 km]]", + "Schillergarten [[0, POI, 2.000, 4.97 km]]", + "Biergarten [[0, POI, 2.000, 5.11 km]]", + "Biergarten [[0, POI, 2.000, 5.13 km]]", + "Demnitz Elbegarten [[0, POI, 2.000, 5.16 km]]", + "Körnergarten [[0, POI, 2.000, 5.18 km]]", + "Biergarten [[0, POI, 2.000, 5.31 km]]", + "Trachauer Sommergarten [[0, POI, 2.000, 5.31 km]]", + "Biergarten [[0, POI, 2.000, 5.91 km]]", + "Biergarten [[0, POI, 2.000, 6.12 km]]", + "Biergarten [[0, POI, 2.000, 6.26 km]]", + "Biergarten [[0, POI, 2.000, 6.42 km]]", + "Biergarten [[0, POI, 2.000, 6.88 km]]", + "Biergarten [[0, POI, 2.000, 7.11 km]]", + "Straußenwirtschaft Weingut Pesterwitz [[0, POI, 2.000, 7.14 km]]", + "Klotzscher Sommerwirtschaft [[0, POI, 2.000, 7.16 km]]", + "Biergarten [[0, POI, 2.000, 7.17 km]]", + "Zacke [[0, POI, 2.000, 8.20 km]]", + "Weingut Seifert [[0, POI, 2.000, 8.50 km]]", + "Biergarten [[0, POI, 2.000, 8.82 km]]", + "Biergarten [[0, POI, 2.000, 9.11 km]]", + "Biergarten [[0, POI, 2.000, 9.23 km]]", + "Landgut Hofewiese [[0, POI, 2.000, 9.40 km]]", + "Biergarten Goldener Anker [[0, POI, 2.000, 9.78 km]]", + "Biergarten [[0, POI, 2.000, 10.00 km]]", + "Biergarten [[0, POI, 2.000, 10.22 km]]", + "Besenwirtschaft Steinrücken [[0, POI, 2.000, 10.85 km]]" ], "amenities": [ { diff --git a/OsmAnd-java/src/test/resources/search/poi_fuel.json b/OsmAnd-java/src/test/resources/search/poi_fuel.json new file mode 100644 index 0000000000..8115349b2f --- /dev/null +++ b/OsmAnd-java/src/test/resources/search/poi_fuel.json @@ -0,0 +1,25 @@ +{ + "settings": { + "lat": "51.04933", + "lon": "13.73815", + "radiusLevel": 1, + "totalLimit": -1, + "lang": "", + "transliterateIfMissing": false, + "emptyQueryAllowed": false, + "sortByName": false + }, + "phrase": ["Fuel", "Fuel "], + "results": [[ + "Aircraft fuel station (Filling station) [[1, POI_TYPE, 1.000, 0.00 km]]", + "Gas station (Filling station) [[1, POI_TYPE, 1.000, 0.00 km]]", + "Gas station for boats (Filling station) [[1, POI_TYPE, 1.000, 0.00 km]]" + ], + [ + "Aircraft fuel station (Filling station) [[1, POI_TYPE, 1.000, 0.00 km]]", + "Gas station (Filling station) [[1, POI_TYPE, 1.000, 0.00 km]]", + "Gas station for boats (Filling station) [[1, POI_TYPE, 1.000, 0.00 km]]" + ]], + "amenities": [], + "cities": [] +} \ No newline at end of file diff --git a/OsmAnd-java/src/test/resources/search/rolandstr.json b/OsmAnd-java/src/test/resources/search/rolandstr.json new file mode 100644 index 0000000000..8d3e0e2ee9 --- /dev/null +++ b/OsmAnd-java/src/test/resources/search/rolandstr.json @@ -0,0 +1,2705 @@ +{ + "settings": { + "lat": "50.78244", + "lon": "6.08911", + "radiusLevel": 1, + "totalLimit": -1, + "lang": "", + "transliterateIfMissing": false, + "emptyQueryAllowed": false, + "sortByName": false + }, + "phrases": ["8 rolandstrasse ", "8 rolandstraße ", "rolandstraße 8 "], + "results": [ + [ + "8.0, [[0, PARTIAL_LOCATION, 1.000, 4791.59 km]]", + "8, Rolandstraße, Aachen [[2, HOUSE, 0.430, 0.03 km]]", + "Rolandstraße, Aachen [[1, STREET, 3.000, 0.39 km]]", + "8, Rolandplatz, Aachen [[1, HOUSE, 0.430, 0.31 km]]", + "8, Rehmplatz, Aachen [[1, HOUSE, 0.430, 0.86 km]]", + "8, Reimanstraße, Aachen [[1, HOUSE, 0.430, 0.89 km]]", + "8, Rudolfstraße (Rehmviertel), Aachen [[1, HOUSE, 0.430, 0.75 km]]", + "8, Reihstraße, Aachen [[1, HOUSE, 0.430, 1.02 km]]", + "Rolandplatz, Aachen [[0, STREET, 3.000, 0.35 km]]", + "Rochusstraße, Aachen [[0, STREET, 3.000, 0.40 km]]", + "Robensstraße, Aachen [[0, STREET, 3.000, 0.70 km]]", + "Rethelstraße, Aachen [[0, STREET, 3.000, 0.76 km]]", + "Rommelsgasse, Aachen [[0, STREET, 3.000, 0.80 km]]", + "Romaneygasse, Aachen [[0, STREET, 3.000, 0.84 km]]", + "Rehmplatz, Aachen [[0, STREET, 3.000, 0.88 km]]", + "Reimanstraße, Aachen [[0, STREET, 3.000, 0.90 km]]", + "Ritter-Chorus-Straße, Aachen [[0, STREET, 3.000, 0.90 km]]", + "Rudolfstraße (Rehmviertel), Aachen [[0, STREET, 3.000, 0.94 km]]", + "Hans-von-Reutlingen-Gasse, Aachen [[0, STREET, 3.000, 0.99 km]]", + "Reihstraße, Aachen [[0, STREET, 3.000, 0.99 km]]", + "Rennbahn, Aachen [[0, STREET, 3.000, 1.00 km]]", + "6-8, Robensstraße, Aachen [[0, HOUSE, 0.430, 0.64 km]]" + ], + [ + "8.0, [[0, PARTIAL_LOCATION, 1.000, 4791.59 km]]", + "8, Rolandstraße, Aachen [[2, HOUSE, 0.430, 0.03 km]]", + "Rolandstraße, Aachen [[1, STREET, 3.000, 0.39 km]]", + "8, Rolandplatz, Aachen [[1, HOUSE, 0.430, 0.31 km]]", + "8, Rehmplatz, Aachen [[1, HOUSE, 0.430, 0.86 km]]", + "8, Reimanstraße, Aachen [[1, HOUSE, 0.430, 0.89 km]]", + "8, Rudolfstraße (Rehmviertel), Aachen [[1, HOUSE, 0.430, 0.75 km]]", + "8, Reihstraße, Aachen [[1, HOUSE, 0.430, 1.02 km]]", + "Rolandplatz, Aachen [[0, STREET, 3.000, 0.35 km]]", + "Rochusstraße, Aachen [[0, STREET, 3.000, 0.40 km]]", + "Robensstraße, Aachen [[0, STREET, 3.000, 0.70 km]]", + "Rethelstraße, Aachen [[0, STREET, 3.000, 0.76 km]]", + "Rommelsgasse, Aachen [[0, STREET, 3.000, 0.80 km]]", + "Romaneygasse, Aachen [[0, STREET, 3.000, 0.84 km]]", + "Rehmplatz, Aachen [[0, STREET, 3.000, 0.88 km]]", + "Reimanstraße, Aachen [[0, STREET, 3.000, 0.90 km]]", + "Ritter-Chorus-Straße, Aachen [[0, STREET, 3.000, 0.90 km]]", + "Rudolfstraße (Rehmviertel), Aachen [[0, STREET, 3.000, 0.94 km]]", + "Hans-von-Reutlingen-Gasse, Aachen [[0, STREET, 3.000, 0.99 km]]", + "Reihstraße, Aachen [[0, STREET, 3.000, 0.99 km]]", + "Rennbahn, Aachen [[0, STREET, 3.000, 1.00 km]]", + "6-8, Robensstraße, Aachen [[0, HOUSE, 0.430, 0.64 km]]" + ], + [ + "8, Rolandstraße, Aachen [[2, HOUSE, 0.430, 0.03 km]]", + "Rolandstraße, Aachen [[1, STREET, 3.000, 0.39 km]]", + "8, Rolandplatz, Aachen [[1, HOUSE, 0.430, 0.31 km]]", + "8, Rehmplatz, Aachen [[1, HOUSE, 0.430, 0.86 km]]", + "8, Reimanstraße, Aachen [[1, HOUSE, 0.430, 0.89 km]]", + "8, Rudolfstraße (Rehmviertel), Aachen [[1, HOUSE, 0.430, 0.75 km]]", + "8, Reihstraße, Aachen [[1, HOUSE, 0.430, 1.02 km]]", + "Rolandplatz, Aachen [[0, STREET, 3.000, 0.35 km]]", + "Rochusstraße, Aachen [[0, STREET, 3.000, 0.40 km]]", + "Robensstraße, Aachen [[0, STREET, 3.000, 0.70 km]]", + "Rethelstraße, Aachen [[0, STREET, 3.000, 0.76 km]]", + "Rommelsgasse, Aachen [[0, STREET, 3.000, 0.80 km]]", + "Romaneygasse, Aachen [[0, STREET, 3.000, 0.84 km]]", + "Rehmplatz, Aachen [[0, STREET, 3.000, 0.88 km]]", + "Reimanstraße, Aachen [[0, STREET, 3.000, 0.90 km]]", + "Ritter-Chorus-Straße, Aachen [[0, STREET, 3.000, 0.90 km]]", + "Rudolfstraße (Rehmviertel), Aachen [[0, STREET, 3.000, 0.94 km]]", + "Hans-von-Reutlingen-Gasse, Aachen [[0, STREET, 3.000, 0.99 km]]", + "Reihstraße, Aachen [[0, STREET, 3.000, 0.99 km]]", + "Rennbahn, Aachen [[0, STREET, 3.000, 1.00 km]]", + "6-8, Robensstraße, Aachen [[0, HOUSE, 0.430, 0.64 km]]" + ] + ], + "cities": [ + { + "name": "Aachen", + "names": { + "de": "Aachen", + "ru": "Ахен", + "pt": "Aquisgrão", + "eo": "Aĥeno", + "it": "Aquisgrana", + "fr": "Aix-la-Chapelle", + "es": "Aquisgrán", + "cs": "Cáchy", + "eu": "Akisgran", + "ar": "آخن", + "nb": "Aachen", + "la": "Aquisgranum", + "lb": "Oochen", + "fa": "آخن", + "nds": "Aken", + "pl": "Akwizgran", + "ur": "آخن", + "ca": "Aquisgrà", + "nl": "Aken", + "sr": "Ахен" + }, + "lat": "50.77635", + "lon": "6.08386", + "id": 240041315, + "type": "CITY", + "listOfStreets": [ + { + "name": "Rolandstraße", + "lat": "50.78507", + "lon": "6.09271", + "id": 7074, + "buildings": [ + { + "name": "1", + "lat": "50.78427", + "lon": "6.09091", + "postcode": "52070" + }, + { + "name": "2", + "lat": "50.78232", + "lon": "6.08891", + "postcode": "52070" + }, + { + "name": "2a", + "lat": "50.78243", + "lon": "6.08904", + "postcode": "52070" + }, + { + "name": "3", + "lat": "50.78438", + "lon": "6.09125", + "postcode": "52070" + }, + { + "name": "3a", + "lat": "50.78493", + "lon": "6.09256", + "postcode": "52070" + }, + { + "name": "4", + "lat": "50.78248", + "lon": "6.08926", + "postcode": "52070" + }, + { + "name": "4a", + "lat": "50.78484", + "lon": "6.09278", + "postcode": "52070" + }, + { + "name": "5", + "lat": "50.78445", + "lon": "6.09134", + "postcode": "52070" + }, + { + "name": "6", + "lat": "50.78255", + "lon": "6.08932", + "postcode": "52070" + }, + { + "name": "7", + "lat": "50.78456", + "lon": "6.09162", + "postcode": "52070" + }, + { + "name": "8", + "lat": "50.78259", + "lon": "6.08943", + "postcode": "52070" + }, + { + "name": "9", + "lat": "50.78463", + "lon": "6.09170", + "postcode": "52070" + }, + { + "name": "10", + "lat": "50.78265", + "lon": "6.08954", + "postcode": "52070" + }, + { + "name": "10a", + "lat": "50.78285", + "lon": "6.08962", + "postcode": "52070" + }, + { + "name": "11", + "lat": "50.78469", + "lon": "6.09192", + "postcode": "52070" + }, + { + "name": "12", + "lat": "50.78293", + "lon": "6.08971", + "postcode": "52070" + }, + { + "name": "13", + "lat": "50.78507", + "lon": "6.09271", + "postcode": "52070" + }, + { + "name": "14", + "lat": "50.78285", + "lon": "6.08975", + "postcode": "52070" + }, + { + "name": "15", + "lat": "50.78517", + "lon": "6.09280", + "postcode": "52070" + }, + { + "name": "16", + "lat": "50.78294", + "lon": "6.08986", + "postcode": "52070" + }, + { + "name": "18", + "lat": "50.78300", + "lon": "6.08994", + "postcode": "52070" + }, + { + "name": "20", + "lat": "50.78308", + "lon": "6.09005", + "postcode": "52070" + }, + { + "name": "21", + "lat": "50.78547", + "lon": "6.09299", + "postcode": "52070" + }, + { + "name": "22", + "lat": "50.78311", + "lon": "6.09020", + "postcode": "52070" + }, + { + "name": "23", + "lat": "50.78567", + "lon": "6.09318", + "postcode": "52070" + }, + { + "name": "24", + "lat": "50.78323", + "lon": "6.09022", + "postcode": "52070" + }, + { + "name": "25", + "lat": "50.78574", + "lon": "6.09325", + "postcode": "52070" + }, + { + "name": "26", + "lat": "50.78330", + "lon": "6.09040", + "postcode": "52070" + }, + { + "name": "27", + "lat": "50.78581", + "lon": "6.09331", + "postcode": "52070" + }, + { + "name": "28", + "lat": "50.78341", + "lon": "6.09055", + "postcode": "52070" + }, + { + "name": "29", + "lat": "50.78587", + "lon": "6.09338", + "postcode": "52070" + }, + { + "name": "30", + "lat": "50.78351", + "lon": "6.09070", + "postcode": "52070" + }, + { + "name": "31", + "lat": "50.78600", + "lon": "6.09351", + "postcode": "52070" + }, + { + "name": "32", + "lat": "50.78364", + "lon": "6.09085", + "postcode": "52070" + }, + { + "name": "33", + "lat": "50.78608", + "lon": "6.09357", + "postcode": "52070" + }, + { + "name": "34", + "lat": "50.78373", + "lon": "6.09100", + "postcode": "52070" + }, + { + "name": "35", + "lat": "50.78623", + "lon": "6.09374", + "postcode": "52070" + }, + { + "name": "36", + "lat": "50.78406", + "lon": "6.09134", + "postcode": "52070" + }, + { + "name": "37", + "lat": "50.78630", + "lon": "6.09383", + "postcode": "52070" + }, + { + "name": "38", + "lat": "50.78412", + "lon": "6.09145", + "postcode": "52070" + }, + { + "name": "39", + "lat": "50.78644", + "lon": "6.09398", + "postcode": "52070" + }, + { + "name": "40", + "lat": "50.78421", + "lon": "6.09151", + "postcode": "52070" + }, + { + "name": "41", + "lat": "50.78650", + "lon": "6.09404", + "postcode": "52070" + }, + { + "name": "42", + "lat": "50.78429", + "lon": "6.09166", + "postcode": "52070" + }, + { + "name": "43", + "lat": "50.78665", + "lon": "6.09415", + "postcode": "52070" + }, + { + "name": "44", + "lat": "50.78499", + "lon": "6.09293", + "postcode": "52070" + }, + { + "name": "45", + "lat": "50.78677", + "lon": "6.09432", + "postcode": "52070" + }, + { + "name": "46", + "lat": "50.78507", + "lon": "6.09301", + "postcode": "52070" + }, + { + "name": "47", + "lat": "50.78689", + "lon": "6.09445", + "postcode": "52070" + }, + { + "name": "48", + "lat": "50.78531", + "lon": "6.09338", + "postcode": "52070" + }, + { + "name": "49", + "lat": "50.78703", + "lon": "6.09458", + "postcode": "52070" + }, + { + "name": "50", + "lat": "50.78543", + "lon": "6.09351", + "postcode": "52070" + }, + { + "name": "51", + "lat": "50.78711", + "lon": "6.09462", + "postcode": "52070" + }, + { + "name": "52", + "lat": "50.78555", + "lon": "6.09364", + "postcode": "52070" + }, + { + "name": "53", + "lat": "50.78722", + "lon": "6.09475", + "postcode": "52070" + }, + { + "name": "54", + "lat": "50.78562", + "lon": "6.09370", + "postcode": "52070" + }, + { + "name": "55", + "lat": "50.78729", + "lon": "6.09479", + "postcode": "52070" + }, + { + "name": "56", + "lat": "50.78575", + "lon": "6.09381", + "postcode": "52070" + }, + { + "name": "57", + "lat": "50.78734", + "lon": "6.09482", + "postcode": "52070" + }, + { + "name": "58", + "lat": "50.78582", + "lon": "6.09389", + "postcode": "52070" + }, + { + "name": "59", + "lat": "50.78739", + "lon": "6.09486", + "postcode": "52070" + }, + { + "name": "60", + "lat": "50.78587", + "lon": "6.09394", + "postcode": "52070" + }, + { + "name": "61", + "lat": "50.78745", + "lon": "6.09490", + "postcode": "52070" + }, + { + "name": "62", + "lat": "50.78593", + "lon": "6.09400", + "postcode": "52070" + }, + { + "name": "64", + "lat": "50.78598", + "lon": "6.09406", + "postcode": "52070" + }, + { + "name": "66", + "lat": "50.78613", + "lon": "6.09419", + "postcode": "52070" + }, + { + "name": "68", + "lat": "50.78619", + "lon": "6.09426", + "postcode": "52070" + }, + { + "name": "70", + "lat": "50.78623", + "lon": "6.09430", + "postcode": "52070" + }, + { + "name": "72", + "lat": "50.78625", + "lon": "6.09437", + "postcode": "52070" + }, + { + "name": "74", + "lat": "50.78632", + "lon": "6.09439", + "postcode": "52070" + }, + { + "name": "76", + "lat": "50.78644", + "lon": "6.09452", + "postcode": "52070" + }, + { + "name": "78", + "lat": "50.78657", + "lon": "6.09462", + "postcode": "52070" + }, + { + "name": "80", + "lat": "50.78662", + "lon": "6.09471", + "postcode": "52070" + }, + { + "name": "82", + "lat": "50.78676", + "lon": "6.09486", + "postcode": "52070" + }, + { + "name": "84", + "lat": "50.78689", + "lon": "6.09499", + "postcode": "52070" + }, + { + "name": "86", + "lat": "50.78695", + "lon": "6.09509", + "postcode": "52070" + }, + { + "name": "88", + "lat": "50.78711", + "lon": "6.09516", + "postcode": "52070" + }, + { + "name": "90", + "lat": "50.78716", + "lon": "6.09522", + "postcode": "52070" + }, + { + "name": "92", + "lat": "50.78719", + "lon": "6.09529", + "postcode": "52070" + }, + { + "name": "94", + "lat": "50.78722", + "lon": "6.09537", + "postcode": "52070" + }, + { + "name": "96", + "lat": "50.78723", + "lon": "6.09546", + "postcode": "52070" + } + ], + "intersectedStreets": [ + { + "name": "Rolandplatz", + "lat": "50.78479", + "lon": "6.09256" + }, + { + "name": "Margratenstraße", + "lat": "50.78528", + "lon": "6.09308" + }, + { + "name": "Passstraße", + "lat": "50.78756", + "lon": "6.09529" + }, + { + "name": "Krefelder Straße", + "lat": "50.78335", + "lon": "6.08999" + }, + { + "name": "Pippinstraße", + "lat": "50.78393", + "lon": "6.09097" + }, + { + "name": "Ludwigsallee", + "lat": "50.78221", + "lon": "6.08855" + }, + { + "name": "Monheimsallee", + "lat": "50.78221", + "lon": "6.08855" + } + ] + }, + { + "name": "Hans-von-Reutlingen-Gasse", + "lat": "50.77426", + "lon": "6.08364", + "id": 30018, + "intersectedStreets": [ + { + "name": "Münsterplatz", + "lat": "50.77425", + "lon": "6.08364" + }, + { + "name": "Schmiedstraße", + "lat": "50.77425", + "lon": "6.08364" + } + ] + }, + { + "name": "Romaneygasse", + "lat": "50.77547", + "lon": "6.08454", + "id": 7748, + "buildings": [ + { + "name": "4", + "lat": "50.77547", + "lon": "6.08454", + "postcode": "52062" + } + ], + "intersectedStreets": [ + { + "name": "Hühnermarkt", + "lat": "50.77559", + "lon": "6.08447" + }, + { + "name": "Krämerstraße", + "lat": "50.77556", + "lon": "6.08437" + }, + { + "name": "Hof", + "lat": "50.77544", + "lon": "6.08482" + } + ] + }, + { + "name": "Reihstraße", + "lat": "50.77351", + "lon": "6.08898", + "id": 7687, + "buildings": [ + { + "name": "1", + "lat": "50.77304", + "lon": "6.08866", + "postcode": "52062" + }, + { + "name": "1", + "lat": "50.77308", + "lon": "6.08868", + "postcode": "52062" + }, + { + "name": "2", + "lat": "50.77303", + "lon": "6.08891", + "postcode": "52062" + }, + { + "name": "3", + "lat": "50.77315", + "lon": "6.08870", + "postcode": "52062" + }, + { + "name": "3", + "lat": "50.77315", + "lon": "6.08872", + "postcode": "52062" + }, + { + "name": "4", + "lat": "50.77312", + "lon": "6.08896", + "postcode": "52062" + }, + { + "name": "5", + "lat": "50.77322", + "lon": "6.08868", + "postcode": "52062" + }, + { + "name": "6", + "lat": "50.77322", + "lon": "6.08900", + "postcode": "52062" + }, + { + "name": "7", + "lat": "50.77326", + "lon": "6.08879", + "postcode": "52062" + }, + { + "name": "8", + "lat": "50.77331", + "lon": "6.08907", + "postcode": "52062" + }, + { + "name": "9", + "lat": "50.77332", + "lon": "6.08872", + "postcode": "52062" + }, + { + "name": "10", + "lat": "50.77376", + "lon": "6.08960", + "postcode": "52062" + }, + { + "name": "10", + "lat": "50.77377", + "lon": "6.08962", + "postcode": "52062" + }, + { + "name": "11", + "lat": "50.77338", + "lon": "6.08874", + "postcode": "52062" + }, + { + "name": "13", + "lat": "50.77343", + "lon": "6.08874", + "postcode": "52062" + }, + { + "name": "15", + "lat": "50.77347", + "lon": "6.08887", + "postcode": "52062" + }, + { + "name": "17", + "lat": "50.77351", + "lon": "6.08898", + "postcode": "52062" + }, + { + "name": "19", + "lat": "50.77369", + "lon": "6.08907", + "postcode": "52062" + }, + { + "name": "21", + "lat": "50.77375", + "lon": "6.08915", + "postcode": "52062" + }, + { + "name": "23", + "lat": "50.77380", + "lon": "6.08922", + "postcode": "52062" + }, + { + "name": "25", + "lat": "50.77392", + "lon": "6.08928", + "postcode": "52062" + }, + { + "name": "28", + "lat": "50.77399", + "lon": "6.08988", + "postcode": "52062" + }, + { + "name": "43", + "lat": "50.77446", + "lon": "6.09022", + "postcode": "52062" + }, + { + "name": "46", + "lat": "50.77472", + "lon": "6.09106", + "postcode": "52062" + }, + { + "name": "51", + "lat": "50.77463", + "lon": "6.09059", + "postcode": "52062" + }, + { + "name": "55", + "lat": "50.77476", + "lon": "6.09085", + "postcode": "52062" + }, + { + "name": "61", + "lat": "50.77490", + "lon": "6.09093", + "postcode": "52062" + }, + { + "name": "63", + "lat": "50.77494", + "lon": "6.09102", + "postcode": "52062" + }, + { + "name": "65", + "lat": "50.77501", + "lon": "6.09110", + "postcode": "52062" + }, + { + "name": "67", + "lat": "50.77503", + "lon": "6.09113", + "postcode": "52062" + }, + { + "name": "69", + "lat": "50.77506", + "lon": "6.09119", + "postcode": "52062" + } + ], + "intersectedStreets": [ + { + "name": "Wespienstraße", + "lat": "50.77354", + "lon": "6.08907" + }, + { + "name": "Elisengalerie", + "lat": "50.77354", + "lon": "6.08907" + }, + { + "name": "Wirichsbongardstraße", + "lat": "50.77289", + "lon": "6.08870" + }, + { + "name": "Harscampstraße", + "lat": "50.77499", + "lon": "6.09132" + }, + { + "name": "Siederstraße", + "lat": "50.77446", + "lon": "6.09055" + } + ] + }, + { + "name": "Rochusstraße", + "lat": "50.77963", + "lon": "6.08563", + "id": 5032, + "buildings": [ + { + "name": "1", + "lat": "50.77984", + "lon": "6.08518", + "postcode": "52062" + }, + { + "name": "2-14", + "lat": "50.77973", + "lon": "6.08482", + "postcode": "52062" + }, + { + "name": "3", + "lat": "50.77984", + "lon": "6.08527", + "postcode": "52062" + }, + { + "name": "5", + "lat": "50.77985", + "lon": "6.08542", + "postcode": "52062" + }, + { + "name": "7", + "lat": "50.77984", + "lon": "6.08550", + "postcode": "52062" + }, + { + "name": "9,11", + "lat": "50.77985", + "lon": "6.08561", + "postcode": "52062" + }, + { + "name": "13", + "lat": "50.77988", + "lon": "6.08582", + "postcode": "52062" + }, + { + "name": "15", + "lat": "50.77989", + "lon": "6.08595", + "postcode": "52062" + }, + { + "name": "16", + "lat": "50.77963", + "lon": "6.08563", + "postcode": "52062" + }, + { + "name": "17", + "lat": "50.77992", + "lon": "6.08610", + "postcode": "52062" + }, + { + "name": "18", + "lat": "50.77965", + "lon": "6.08572", + "postcode": "52062" + }, + { + "name": "19", + "lat": "50.77993", + "lon": "6.08619", + "postcode": "52062" + }, + { + "name": "20", + "lat": "50.77966", + "lon": "6.08580", + "postcode": "52062" + }, + { + "name": "21", + "lat": "50.77995", + "lon": "6.08630", + "postcode": "52062" + }, + { + "name": "22,24", + "lat": "50.77985", + "lon": "6.08666", + "postcode": "52062" + }, + { + "name": "23", + "lat": "50.77996", + "lon": "6.08638", + "postcode": "52062" + }, + { + "name": "25", + "lat": "50.77999", + "lon": "6.08647", + "postcode": "52062" + }, + { + "name": "26", + "lat": "50.77988", + "lon": "6.08683", + "postcode": "52062" + }, + { + "name": "27", + "lat": "50.78001", + "lon": "6.08658", + "postcode": "52062" + }, + { + "name": "28", + "lat": "50.77989", + "lon": "6.08696", + "postcode": "52062" + }, + { + "name": "29", + "lat": "50.78001", + "lon": "6.08668", + "postcode": "52062" + }, + { + "name": "30", + "lat": "50.77991", + "lon": "6.08705", + "postcode": "52062" + }, + { + "name": "31", + "lat": "50.78004", + "lon": "6.08677", + "postcode": "52062" + }, + { + "name": "32", + "lat": "50.77993", + "lon": "6.08716", + "postcode": "52062" + }, + { + "name": "33", + "lat": "50.78005", + "lon": "6.08685", + "postcode": "52062" + }, + { + "name": "35", + "lat": "50.78007", + "lon": "6.08696", + "postcode": "52062" + }, + { + "name": "37", + "lat": "50.78010", + "lon": "6.08709", + "postcode": "52062" + }, + { + "name": "38", + "lat": "50.77996", + "lon": "6.08728", + "postcode": "52062" + }, + { + "name": "39", + "lat": "50.78011", + "lon": "6.08720", + "postcode": "52062" + }, + { + "name": "40", + "lat": "50.77997", + "lon": "6.08741", + "postcode": "52062" + }, + { + "name": "41", + "lat": "50.78014", + "lon": "6.08728", + "postcode": "52062" + }, + { + "name": "42", + "lat": "50.78000", + "lon": "6.08754", + "postcode": "52062" + }, + { + "name": "43", + "lat": "50.78014", + "lon": "6.08739", + "postcode": "52062" + }, + { + "name": "44", + "lat": "50.78001", + "lon": "6.08767", + "postcode": "52062" + }, + { + "name": "45", + "lat": "50.78018", + "lon": "6.08765", + "postcode": "52062" + }, + { + "name": "46", + "lat": "50.78004", + "lon": "6.08780", + "postcode": "52062" + }, + { + "name": "47", + "lat": "50.78018", + "lon": "6.08771", + "postcode": "52062" + }, + { + "name": "48", + "lat": "50.78007", + "lon": "6.08795", + "postcode": "52062" + }, + { + "name": "49", + "lat": "50.78031", + "lon": "6.08825", + "postcode": "52062" + }, + { + "name": "51", + "lat": "50.78034", + "lon": "6.08846", + "postcode": "52062" + }, + { + "name": "52", + "lat": "50.77973", + "lon": "6.09016", + "postcode": "52062" + }, + { + "name": "53", + "lat": "50.78035", + "lon": "6.08859", + "postcode": "52062" + }, + { + "name": "54", + "lat": "50.77981", + "lon": "6.09001", + "postcode": "52062" + }, + { + "name": "55", + "lat": "50.78038", + "lon": "6.08870", + "postcode": "52062" + }, + { + "name": "56", + "lat": "50.77993", + "lon": "6.08986", + "postcode": "52062" + }, + { + "name": "57", + "lat": "50.78039", + "lon": "6.08879", + "postcode": "52062" + }, + { + "name": "58", + "lat": "50.78004", + "lon": "6.08979", + "postcode": "52062" + }, + { + "name": "59", + "lat": "50.78042", + "lon": "6.08894", + "postcode": "52062" + }, + { + "name": "60", + "lat": "50.78015", + "lon": "6.08973", + "postcode": "52062" + }, + { + "name": "61", + "lat": "50.78043", + "lon": "6.08907", + "postcode": "52062" + }, + { + "name": "62", + "lat": "50.78024", + "lon": "6.08971", + "postcode": "52062" + }, + { + "name": "63", + "lat": "50.78046", + "lon": "6.08917", + "postcode": "52062" + }, + { + "name": "64", + "lat": "50.78039", + "lon": "6.08999", + "postcode": "52062" + }, + { + "name": "65", + "lat": "50.78053", + "lon": "6.08934", + "postcode": "52062" + }, + { + "name": "66", + "lat": "50.78043", + "lon": "6.09020", + "postcode": "52062" + } + ], + "intersectedStreets": [ + { + "name": "Bergdriesch", + "lat": "50.77981", + "lon": "6.08479" + }, + { + "name": "Bergstraße (Pontviertel)", + "lat": "50.77981", + "lon": "6.08479" + }, + { + "name": "Martinstraße", + "lat": "50.77980", + "lon": "6.08613" + }, + { + "name": "Sandkaulstraße", + "lat": "50.78015", + "lon": "6.08812" + }, + { + "name": "Heinzenstraße", + "lat": "50.77954", + "lon": "6.09037" + }, + { + "name": "Monheimsallee", + "lat": "50.78062", + "lon": "6.09037" + } + ] + }, + { + "name": "Reimanstraße", + "lat": "50.77868", + "lon": "6.10046", + "id": 6665, + "buildings": [ + { + "name": "2", + "lat": "50.77825", + "lon": "6.09960", + "postcode": "52070" + }, + { + "name": "3", + "lat": "50.77835", + "lon": "6.09941", + "postcode": "52070" + }, + { + "name": "4", + "lat": "50.77836", + "lon": "6.09979", + "postcode": "52070" + }, + { + "name": "5", + "lat": "50.77843", + "lon": "6.09956", + "postcode": "52070" + }, + { + "name": "6", + "lat": "50.77847", + "lon": "6.10001", + "postcode": "52070" + }, + { + "name": "7", + "lat": "50.77866", + "lon": "6.09956", + "postcode": "52070" + }, + { + "name": "8", + "lat": "50.77858", + "lon": "6.10022", + "postcode": "52070" + }, + { + "name": "9", + "lat": "50.77859", + "lon": "6.09986", + "postcode": "52070" + }, + { + "name": "10", + "lat": "50.77868", + "lon": "6.10046", + "postcode": "52070" + }, + { + "name": "11", + "lat": "50.77867", + "lon": "6.10001", + "postcode": "52070" + }, + { + "name": "12", + "lat": "50.77879", + "lon": "6.10067", + "postcode": "52070" + }, + { + "name": "13", + "lat": "50.77878", + "lon": "6.10022", + "postcode": "52070" + }, + { + "name": "14", + "lat": "50.77877", + "lon": "6.10080", + "postcode": "52070" + }, + { + "name": "15", + "lat": "50.77887", + "lon": "6.10042", + "postcode": "52070" + }, + { + "name": "16", + "lat": "50.77882", + "lon": "6.10085", + "postcode": "52070" + }, + { + "name": "17", + "lat": "50.77897", + "lon": "6.10061", + "postcode": "52070" + }, + { + "name": "18", + "lat": "50.77886", + "lon": "6.10091", + "postcode": "52070" + }, + { + "name": "19", + "lat": "50.77905", + "lon": "6.10076", + "postcode": "52070" + }, + { + "name": "20", + "lat": "50.77889", + "lon": "6.10100", + "postcode": "52070" + }, + { + "name": "21", + "lat": "50.77911", + "lon": "6.10085", + "postcode": "52070" + }, + { + "name": "22", + "lat": "50.77893", + "lon": "6.10106", + "postcode": "52070" + }, + { + "name": "23", + "lat": "50.77913", + "lon": "6.10093", + "postcode": "52070" + }, + { + "name": "24", + "lat": "50.77896", + "lon": "6.10115", + "postcode": "52070" + }, + { + "name": "25", + "lat": "50.77919", + "lon": "6.10100", + "postcode": "52070" + }, + { + "name": "26", + "lat": "50.77900", + "lon": "6.10121", + "postcode": "52070" + }, + { + "name": "28", + "lat": "50.77904", + "lon": "6.10130", + "postcode": "52070" + } + ], + "intersectedStreets": [ + { + "name": "Blücherplatz", + "lat": "50.77923", + "lon": "6.10138" + }, + { + "name": "Hein-Janssen-Straße", + "lat": "50.77813", + "lon": "6.09921" + } + ] + }, + { + "name": "Rolandplatz", + "lat": "50.78453", + "lon": "6.09284", + "id": 7050, + "buildings": [ + { + "name": "1", + "lat": "50.78480", + "lon": "6.09209", + "postcode": "52070" + }, + { + "name": "2", + "lat": "50.78487", + "lon": "6.09220", + "postcode": "52070" + }, + { + "name": "3", + "lat": "50.78490", + "lon": "6.09235", + "postcode": "52070" + }, + { + "name": "4", + "lat": "50.78474", + "lon": "6.09282", + "postcode": "52070" + }, + { + "name": "5", + "lat": "50.78464", + "lon": "6.09286", + "postcode": "52070" + }, + { + "name": "6", + "lat": "50.78453", + "lon": "6.09284", + "postcode": "52070" + }, + { + "name": "7", + "lat": "50.78437", + "lon": "6.09237", + "postcode": "52070" + }, + { + "name": "8", + "lat": "50.78448", + "lon": "6.09211", + "postcode": "52070" + } + ], + "intersectedStreets": [ + { + "name": "Rolandstraße", + "lat": "50.78479", + "lon": "6.09256" + }, + { + "name": "Chlodwigstraße", + "lat": "50.78452", + "lon": "6.09261" + } + ] + }, + { + "name": "Rethelstraße", + "lat": "50.77617", + "lon": "6.08467", + "id": 25292, + "buildings": [ + { + "name": "1", + "lat": "50.77609", + "lon": "6.08447", + "postcode": "52062" + }, + { + "name": "2", + "lat": "50.77600", + "lon": "6.08467", + "postcode": "52062" + }, + { + "name": "3", + "lat": "50.77619", + "lon": "6.08467", + "postcode": "52062" + }, + { + "name": "4", + "lat": "50.77604", + "lon": "6.08482", + "postcode": "52062" + }, + { + "name": "6", + "lat": "50.77613", + "lon": "6.08488", + "postcode": "52062" + } + ], + "intersectedStreets": [ + { + "name": "Hühnermarkt", + "lat": "50.77604", + "lon": "6.08449" + }, + { + "name": "Krämerstraße", + "lat": "50.77592", + "lon": "6.08428" + }, + { + "name": "Rommelsgasse", + "lat": "50.77597", + "lon": "6.08445" + }, + { + "name": "Büchel", + "lat": "50.77632", + "lon": "6.08488" + } + ] + }, + { + "name": "Rudolfstraße (Rehmviertel)", + "lat": "50.77669", + "lon": "6.09898", + "id": 4276, + "buildings": [ + { + "name": "1-7", + "lat": "50.77862", + "lon": "6.09788", + "postcode": "52070" + }, + { + "name": "6", + "lat": "50.77841", + "lon": "6.09756", + "postcode": "52070" + }, + { + "name": "8", + "lat": "50.77837", + "lon": "6.09758", + "postcode": "52070" + }, + { + "name": "9-11", + "lat": "50.77843", + "lon": "6.09778", + "postcode": "52070" + }, + { + "name": "10", + "lat": "50.77828", + "lon": "6.09763", + "postcode": "52070" + }, + { + "name": "12", + "lat": "50.77822", + "lon": "6.09765", + "postcode": "52070" + }, + { + "name": "13", + "lat": "50.77839", + "lon": "6.09778", + "postcode": "52070" + }, + { + "name": "14", + "lat": "50.77817", + "lon": "6.09767", + "postcode": "52070" + }, + { + "name": "15", + "lat": "50.77825", + "lon": "6.09784", + "postcode": "52070" + }, + { + "name": "16", + "lat": "50.77809", + "lon": "6.09771", + "postcode": "52070" + }, + { + "name": "17", + "lat": "50.77820", + "lon": "6.09786", + "postcode": "52070" + }, + { + "name": "18", + "lat": "50.77798", + "lon": "6.09739", + "postcode": "52070" + }, + { + "name": "19", + "lat": "50.77809", + "lon": "6.09793", + "postcode": "52070" + }, + { + "name": "20", + "lat": "50.77794", + "lon": "6.09771", + "postcode": "52070" + }, + { + "name": "22", + "lat": "50.77786", + "lon": "6.09782", + "postcode": "52070" + }, + { + "name": "23", + "lat": "50.77797", + "lon": "6.09797", + "postcode": "52070" + }, + { + "name": "24-26", + "lat": "50.77772", + "lon": "6.09786", + "postcode": "52070" + }, + { + "name": "27", + "lat": "50.77780", + "lon": "6.09806", + "postcode": "52070" + }, + { + "name": "29", + "lat": "50.77759", + "lon": "6.09823", + "postcode": "52070" + }, + { + "name": "29", + "lat": "50.77761", + "lon": "6.09823", + "postcode": "52070" + }, + { + "name": "30", + "lat": "50.77695", + "lon": "6.09821", + "postcode": "52070" + }, + { + "name": "32", + "lat": "50.77678", + "lon": "6.09829", + "postcode": "52070" + }, + { + "name": "34", + "lat": "50.77673", + "lon": "6.09831", + "postcode": "52070" + }, + { + "name": "35", + "lat": "50.77730", + "lon": "6.09827", + "postcode": "52070" + }, + { + "name": "36", + "lat": "50.77665", + "lon": "6.09836", + "postcode": "52070" + }, + { + "name": "37-39", + "lat": "50.77726", + "lon": "6.09829", + "postcode": "52070" + }, + { + "name": "38", + "lat": "50.77659", + "lon": "6.09838", + "postcode": "52070" + }, + { + "name": "40", + "lat": "50.77653", + "lon": "6.09840", + "postcode": "52070" + }, + { + "name": "41", + "lat": "50.77707", + "lon": "6.09838", + "postcode": "52070" + }, + { + "name": "42", + "lat": "50.77631", + "lon": "6.09851", + "postcode": "52070" + }, + { + "name": "43-45", + "lat": "50.77699", + "lon": "6.09842", + "postcode": "52070" + }, + { + "name": "44", + "lat": "50.77619", + "lon": "6.09814", + "postcode": "52070" + }, + { + "name": "46", + "lat": "50.77620", + "lon": "6.09853", + "postcode": "52070" + }, + { + "name": "47", + "lat": "50.77687", + "lon": "6.09846", + "postcode": "52070" + }, + { + "name": "48", + "lat": "50.77616", + "lon": "6.09857", + "postcode": "52070" + }, + { + "name": "49", + "lat": "50.77684", + "lon": "6.09848", + "postcode": "52070" + }, + { + "name": "50", + "lat": "50.77611", + "lon": "6.09859", + "postcode": "52070" + }, + { + "name": "51", + "lat": "50.77669", + "lon": "6.09898", + "postcode": "52070" + }, + { + "name": "51", + "lat": "50.77674", + "lon": "6.09853", + "postcode": "52070" + }, + { + "name": "52", + "lat": "50.77600", + "lon": "6.09853", + "postcode": "52070" + }, + { + "name": "53", + "lat": "50.77668", + "lon": "6.09855", + "postcode": "52070" + }, + { + "name": "54", + "lat": "50.77594", + "lon": "6.09829", + "postcode": "52070" + }, + { + "name": "55", + "lat": "50.77662", + "lon": "6.09857", + "postcode": "52070" + }, + { + "name": "56-58", + "lat": "50.77585", + "lon": "6.09872", + "postcode": "52070" + }, + { + "name": "59", + "lat": "50.77627", + "lon": "6.09883", + "postcode": "52070" + }, + { + "name": "60-62", + "lat": "50.77574", + "lon": "6.09876", + "postcode": "52070" + }, + { + "name": "61", + "lat": "50.77615", + "lon": "6.09891", + "postcode": "52070" + }, + { + "name": "63", + "lat": "50.77607", + "lon": "6.09894", + "postcode": "52070" + }, + { + "name": "64", + "lat": "50.77565", + "lon": "6.09881", + "postcode": "52070" + }, + { + "name": "65-67", + "lat": "50.77596", + "lon": "6.09898", + "postcode": "52070" + }, + { + "name": "66", + "lat": "50.77555", + "lon": "6.09874", + "postcode": "52070" + }, + { + "name": "68", + "lat": "50.77541", + "lon": "6.09891", + "postcode": "52070" + }, + { + "name": "68a", + "lat": "50.77531", + "lon": "6.09896", + "postcode": "52070" + }, + { + "name": "69", + "lat": "50.77585", + "lon": "6.09898", + "postcode": "52070" + }, + { + "name": "70", + "lat": "50.77521", + "lon": "6.09900", + "postcode": "52070" + }, + { + "name": "71", + "lat": "50.77578", + "lon": "6.09904", + "postcode": "52070" + }, + { + "name": "72-74", + "lat": "50.77512", + "lon": "6.09904", + "postcode": "52070" + }, + { + "name": "73", + "lat": "50.77570", + "lon": "6.09915", + "postcode": "52070" + }, + { + "name": "75", + "lat": "50.77560", + "lon": "6.09911", + "postcode": "52070" + }, + { + "name": "76", + "lat": "50.77498", + "lon": "6.09911", + "postcode": "52070" + }, + { + "name": "77", + "lat": "50.77554", + "lon": "6.09913", + "postcode": "52070" + }, + { + "name": "78", + "lat": "50.77489", + "lon": "6.09915", + "postcode": "52070" + }, + { + "name": "79-81", + "lat": "50.77546", + "lon": "6.09921", + "postcode": "52070" + }, + { + "name": "80", + "lat": "50.77484", + "lon": "6.09917", + "postcode": "52070" + }, + { + "name": "83", + "lat": "50.77536", + "lon": "6.09928", + "postcode": "52070" + }, + { + "name": "85", + "lat": "50.77527", + "lon": "6.09928", + "postcode": "52070" + }, + { + "name": "87", + "lat": "50.77514", + "lon": "6.09934", + "postcode": "52070" + } + ], + "intersectedStreets": [ + { + "name": "Steinkaulstraße", + "lat": "50.77494", + "lon": "6.09924" + }, + { + "name": "Rehmplatz", + "lat": "50.77712", + "lon": "6.09825" + }, + { + "name": "Adalbertsteinweg (Kaiserplatz)", + "lat": "50.77464", + "lon": "6.09934" + }, + { + "name": "Sigmundstraße", + "lat": "50.77742", + "lon": "6.09810" + }, + { + "name": "Jülicher Straße", + "lat": "50.77885", + "lon": "6.09748" + } + ] + }, + { + "name": "Rommelsgasse", + "lat": "50.77582", + "lon": "6.08484", + "id": 34452, + "buildings": [ + { + "name": "2-3", + "lat": "50.77584", + "lon": "6.08503", + "postcode": "52062" + }, + { + "name": "4", + "lat": "50.77589", + "lon": "6.08497", + "postcode": "52062" + }, + { + "name": "5", + "lat": "50.77589", + "lon": "6.08488", + "postcode": "52062" + } + ], + "intersectedStreets": [ + { + "name": "Hühnermarkt", + "lat": "50.77581", + "lon": "6.08477" + }, + { + "name": "Körbergasse", + "lat": "50.77575", + "lon": "6.08512" + }, + { + "name": "Hof", + "lat": "50.77574", + "lon": "6.08514" + }, + { + "name": "Krämerstraße", + "lat": "50.77603", + "lon": "6.08426" + }, + { + "name": "Rethelstraße", + "lat": "50.77594", + "lon": "6.08445" + } + ] + }, + { + "name": "Rehmplatz", + "lat": "50.77711", + "lon": "6.09827", + "id": 27833, + "buildings": [ + { + "name": "1", + "lat": "50.77741", + "lon": "6.09737", + "postcode": "52070" + }, + { + "name": "3", + "lat": "50.77744", + "lon": "6.09750", + "postcode": "52070" + }, + { + "name": "4-6", + "lat": "50.77684", + "lon": "6.09737", + "postcode": "52070" + }, + { + "name": "5", + "lat": "50.77746", + "lon": "6.09761", + "postcode": "52070" + }, + { + "name": "7", + "lat": "50.77748", + "lon": "6.09771", + "postcode": "52070" + }, + { + "name": "8", + "lat": "50.77684", + "lon": "6.09750", + "postcode": "52070" + }, + { + "name": "9", + "lat": "50.77757", + "lon": "6.09793", + "postcode": "52070" + }, + { + "name": "10", + "lat": "50.77688", + "lon": "6.09763", + "postcode": "52070" + }, + { + "name": "12", + "lat": "50.77691", + "lon": "6.09773", + "postcode": "52070" + }, + { + "name": "14", + "lat": "50.77693", + "lon": "6.09786", + "postcode": "52070" + }, + { + "name": "16", + "lat": "50.77696", + "lon": "6.09795", + "postcode": "52070" + }, + { + "name": "18", + "lat": "50.77697", + "lon": "6.09803", + "postcode": "52070" + }, + { + "name": "20", + "lat": "50.77695", + "lon": "6.09821", + "postcode": "52070" + } + ], + "intersectedStreets": [ + { + "name": "Ottostraße (Kaiserplatz)", + "lat": "50.77688", + "lon": "6.09700" + }, + { + "name": "Rudolfstraße (Rehmviertel)", + "lat": "50.77711", + "lon": "6.09827" + }, + { + "name": "Sigmundstraße", + "lat": "50.77742", + "lon": "6.09810" + } + ] + }, + { + "name": "Robensstraße", + "lat": "50.78083", + "lon": "6.09866", + "id": 27706, + "buildings": [ + { + "name": "1", + "lat": "50.77889", + "lon": "6.09593", + "postcode": "52070" + }, + { + "name": "2", + "lat": "50.77901", + "lon": "6.09653", + "postcode": "52070" + }, + { + "name": "3", + "lat": "50.77896", + "lon": "6.09585", + "postcode": "52070" + }, + { + "name": "3a", + "lat": "50.77898", + "lon": "6.09608", + "postcode": "52070" + }, + { + "name": "4", + "lat": "50.77909", + "lon": "6.09655", + "postcode": "52070" + }, + { + "name": "5", + "lat": "50.77906", + "lon": "6.09625", + "postcode": "52070" + }, + { + "name": "6-8", + "lat": "50.77920", + "lon": "6.09655", + "postcode": "52070" + }, + { + "name": "7", + "lat": "50.77920", + "lon": "6.09630", + "postcode": "52070" + }, + { + "name": "10", + "lat": "50.77929", + "lon": "6.09660", + "postcode": "52070" + }, + { + "name": "11", + "lat": "50.77932", + "lon": "6.09634", + "postcode": "52070" + }, + { + "name": "12", + "lat": "50.77935", + "lon": "6.09662", + "postcode": "52070" + }, + { + "name": "13-15", + "lat": "50.77940", + "lon": "6.09636", + "postcode": "52070" + }, + { + "name": "14", + "lat": "50.77943", + "lon": "6.09664", + "postcode": "52070" + }, + { + "name": "16", + "lat": "50.77953", + "lon": "6.09664", + "postcode": "52070" + }, + { + "name": "17", + "lat": "50.77948", + "lon": "6.09638", + "postcode": "52070" + }, + { + "name": "18", + "lat": "50.77958", + "lon": "6.09668", + "postcode": "52070" + }, + { + "name": "19", + "lat": "50.78011", + "lon": "6.09589", + "postcode": "52070" + }, + { + "name": "20-22", + "lat": "50.77966", + "lon": "6.09679", + "postcode": "52070" + }, + { + "name": "23", + "lat": "50.77969", + "lon": "6.09638", + "postcode": "52070" + }, + { + "name": "24", + "lat": "50.77981", + "lon": "6.09692", + "postcode": "52070" + }, + { + "name": "27", + "lat": "50.77982", + "lon": "6.09651", + "postcode": "52070" + }, + { + "name": "28", + "lat": "50.77988", + "lon": "6.09703", + "postcode": "52070" + }, + { + "name": "30", + "lat": "50.77993", + "lon": "6.09711", + "postcode": "52070" + }, + { + "name": "31", + "lat": "50.77993", + "lon": "6.09660", + "postcode": "52070" + }, + { + "name": "32", + "lat": "50.77997", + "lon": "6.09720", + "postcode": "52070" + }, + { + "name": "33", + "lat": "50.78000", + "lon": "6.09668", + "postcode": "52070" + }, + { + "name": "34", + "lat": "50.78000", + "lon": "6.09728", + "postcode": "52070" + }, + { + "name": "35", + "lat": "50.78004", + "lon": "6.09679", + "postcode": "52070" + }, + { + "name": "36", + "lat": "50.78004", + "lon": "6.09735", + "postcode": "52070" + }, + { + "name": "37", + "lat": "50.78010", + "lon": "6.09688", + "postcode": "52070" + }, + { + "name": "38", + "lat": "50.78008", + "lon": "6.09743", + "postcode": "52070" + }, + { + "name": "39", + "lat": "50.78015", + "lon": "6.09696", + "postcode": "52070" + }, + { + "name": "40", + "lat": "50.78014", + "lon": "6.09750", + "postcode": "52070" + }, + { + "name": "41", + "lat": "50.78020", + "lon": "6.09705", + "postcode": "52070" + }, + { + "name": "42", + "lat": "50.78018", + "lon": "6.09758", + "postcode": "52070" + }, + { + "name": "43", + "lat": "50.78046", + "lon": "6.09660", + "postcode": "52070" + }, + { + "name": "44", + "lat": "50.78020", + "lon": "6.09767", + "postcode": "52070" + }, + { + "name": "46", + "lat": "50.78023", + "lon": "6.09778", + "postcode": "52070" + }, + { + "name": "48", + "lat": "50.78029", + "lon": "6.09786", + "postcode": "52070" + }, + { + "name": "49", + "lat": "50.78041", + "lon": "6.09730", + "postcode": "52070" + }, + { + "name": "50", + "lat": "50.78037", + "lon": "6.09799", + "postcode": "52070" + }, + { + "name": "51", + "lat": "50.78090", + "lon": "6.09722", + "postcode": "52070" + }, + { + "name": "52", + "lat": "50.78081", + "lon": "6.09891", + "postcode": "52070" + }, + { + "name": "54", + "lat": "50.78087", + "lon": "6.09902", + "postcode": "52070" + }, + { + "name": "56", + "lat": "50.78092", + "lon": "6.09913", + "postcode": "52070" + }, + { + "name": "57", + "lat": "50.78077", + "lon": "6.09840", + "postcode": "52070" + }, + { + "name": "58", + "lat": "50.78103", + "lon": "6.09936", + "postcode": "52070" + }, + { + "name": "59", + "lat": "50.78080", + "lon": "6.09846", + "postcode": "52070" + }, + { + "name": "60", + "lat": "50.78129", + "lon": "6.09984", + "postcode": "52070" + }, + { + "name": "61", + "lat": "50.78091", + "lon": "6.09853", + "postcode": "52070" + }, + { + "name": "62", + "lat": "50.78137", + "lon": "6.10001", + "postcode": "52070" + }, + { + "name": "63", + "lat": "50.78098", + "lon": "6.09868", + "postcode": "52070" + }, + { + "name": "65", + "lat": "50.78103", + "lon": "6.09876", + "postcode": "52070" + }, + { + "name": "67", + "lat": "50.78106", + "lon": "6.09885", + "postcode": "52070" + }, + { + "name": "69", + "lat": "50.78110", + "lon": "6.09896", + "postcode": "52070" + }, + { + "name": "71", + "lat": "50.78121", + "lon": "6.09917", + "postcode": "52070" + }, + { + "name": "73", + "lat": "50.78141", + "lon": "6.09949", + "postcode": "52070" + }, + { + "name": "75", + "lat": "50.78157", + "lon": "6.09979", + "postcode": "52070" + } + ], + "intersectedStreets": [ + { + "name": "Thomashofstraße", + "lat": "50.78118", + "lon": "6.09934" + }, + { + "name": "Passstraße", + "lat": "50.78056", + "lon": "6.09808" + }, + { + "name": "Jülicher Straße", + "lat": "50.77864", + "lon": "6.09623" + }, + { + "name": "Ottostraße (Kaiserplatz)", + "lat": "50.77864", + "lon": "6.09623" + } + ] + }, + { + "name": "Rennbahn", + "lat": "50.77464", + "lon": "6.08216", + "id": 11036, + "buildings": [ + { + "name": "1", + "lat": "50.77464", + "lon": "6.08216", + "postcode": "52062" + }, + { + "name": "1", + "lat": "50.77463", + "lon": "6.08213", + "postcode": "52062" + }, + { + "name": "3", + "lat": "50.77467", + "lon": "6.08203", + "postcode": "52062" + }, + { + "name": "5,7", + "lat": "50.77465", + "lon": "6.08190", + "postcode": "52062" + }, + { + "name": "9,11", + "lat": "50.77457", + "lon": "6.08181", + "postcode": "52062" + }, + { + "name": "13", + "lat": "50.77456", + "lon": "6.08166", + "postcode": "52062" + }, + { + "name": "13a", + "lat": "50.77452", + "lon": "6.08151", + "postcode": "52062" + } + ], + "intersectedStreets": [ + { + "name": "Klappergasse", + "lat": "50.77464", + "lon": "6.08151" + }, + { + "name": "Bendelstraße", + "lat": "50.77464", + "lon": "6.08151" + }, + { + "name": "Fischmarkt", + "lat": "50.77475", + "lon": "6.08239" + }, + { + "name": "Schmiedstraße", + "lat": "50.77476", + "lon": "6.08265" + }, + { + "name": "Domhof", + "lat": "50.77476", + "lon": "6.08265" + }, + { + "name": "Johannes-Paul-II.-Straße", + "names": { + "old_name": "Klostergasse" + }, + "lat": "50.77476", + "lon": "6.08265" + } + ] + }, + { + "name": "Ritter-Chorus-Straße", + "lat": "50.77537", + "lon": "6.08280", + "id": 4926, + "buildings": [ + { + "name": "1,3", + "lat": "50.77546", + "lon": "6.08346", + "postcode": "52062" + }, + { + "name": "1-4", + "lat": "50.77536", + "lon": "6.08304", + "postcode": "52062" + }, + { + "name": "5", + "lat": "50.77537", + "lon": "6.08304", + "postcode": "52062" + }, + { + "name": "6", + "lat": "50.77556", + "lon": "6.08269", + "postcode": "52062" + }, + { + "name": "7", + "lat": "50.77537", + "lon": "6.08280", + "postcode": "52062" + } + ], + "intersectedStreets": [ + { + "name": "Johannes-Paul-II.-Straße", + "names": { + "old_name": "Klostergasse" + }, + "lat": "50.77546", + "lon": "6.08250" + }, + { + "name": "Katschhof", + "lat": "50.77548", + "lon": "6.08349" + } + ] + } + ], + "init": 1, + "matchStreet": 1 + } + ] +} \ No newline at end of file diff --git a/OsmAnd-java/src/test/resources/search/spring_street.json b/OsmAnd-java/src/test/resources/search/spring_street.json index b8f10d139a..d489ddc6d2 100644 --- a/OsmAnd-java/src/test/resources/search/spring_street.json +++ b/OsmAnd-java/src/test/resources/search/spring_street.json @@ -11,161 +11,168 @@ }, "phrase": "spring street", "results": [ - "Spring (Natural)", - "Spring (Spring / Natural)", - "Spring (Ice rink / Sport)", - "Spring (Bridge / Transport construction)", - "Spring Street, South Nyack", - "Spring Street, Tomkins Cove", - "Spring Street, Southfields", - "Spring Street, Hastings-on-Hudson", - "Spring Street, Pleasantville", - "Spring Street (Mount Pleasant), Hawthorne", - "Spring Street, Durland", - "Spring Street, Warwick", - "Spring Street, Nelsonville", - "Spring Street, Goshen", - "Spring Street (Little Italy), Manhattan", - "Spring Street, Maybrook", - "West Spring Street, Maybrook", - "Spring Street, South Salem", - "Spring Street, Groveville", - "Spring Street, East Middletown", - "Spring Street, Montgomery", - "Spring Street, Chelsea", - "Spring Street, Wappingers Falls", - "Spring Street, Cold Spring Harbor", - "Spring Street, Staten Island", - "Spring Street, East Meadow", - "Spring Street, Inwood", - "Spring Street, Port Jervis", - "Spring Street, Roosevelt", - "Spring Street, Pawling", - "Spring Street, Fairview", - "Spring Street (Wyandanch), Wheatley Heights", - "Spring Street, Wyandanch", - "Spring Street, East Massapequa", - "Spring Street, Ellenville", - "Spring Street, Monticello", - "Spring Street, Tillson", - "Spring Street, Port Jefferson", - "Spring Street (Smallwood), Bethel", - "Spring Street, Liberty", - "Spring Street (Livingston Manor), Rockland", - "Spring Street, Livingston Manor", - "Market Street, Cold Spring", - "New Street, Cold Spring", - "West Street, Cold Spring", - "Fish Street, Cold Spring", - "North Street, Cold Spring", - "Rock Street, Cold Spring", - "Stone Street, Cold Spring", - "Wall Street, Cold Spring", - "Cross Street, Cold Spring", - "Main Street, Cold Spring", - "Chestnut Street, Cold Spring", - "Furnace Street, Cold Spring", - "Garden Street, Cold Spring", - "Church Street, Cold Spring", - "Oak Street, Cold Spring", - "Cherry Street, Cold Spring", - "High Street, Cold Spring", - "Academy Street, Cold Spring", - "Haldane Street, Cold Spring", - "West Bank Street, Cold Spring", - "B Street, Cold Spring", - "West Belvedere Street, Cold Spring", - "Parrot Street, Cold Spring", - "Bank Street, Cold Spring", - "Orchard Street, Cold Spring", - "East Belvedere Street, Cold Spring", - "Pine Street, Cold Spring", - "Parsonage Street, Cold Spring", - "Hamilton Street, Cold Spring", - "Fair Street, Cold Spring", - "Cedar Street, Cold Spring", - "Flora Street, Cold Spring Harbor", - "West Main Street, Cold Spring Harbor", - "Grove Street, Cold Spring Harbor", - "Midland Street, Cold Spring Harbor", - "Rusco Street, Cold Spring Harbor", - "Main Street, Cold Spring Harbor", - "Chestnut Street, Cold Spring Harbor", - "Spring Street", - "Spring Street", - "Spring Street", - "Spring Street", - "Spring Street", - "Spring Street", - "Spring Street", - "Spring Street", - "Spring Street", - "Spring Street", - "Spring Street", - "Academy Street, Cold Spring", - "Bank Street, Cold Spring", - "B Street, Cold Spring", - "Cedar Street, Cold Spring", - "Cherry Street, Cold Spring", - "Chestnut Street, Cold Spring", - "Church Street, Cold Spring", - "Cross Street, Cold Spring", - "East Belvedere Street, Cold Spring", - "Fair Street, Cold Spring", - "Fish Street, Cold Spring", - "Furnace Street, Cold Spring", - "Garden Street, Cold Spring", - "Haldane Street, Cold Spring", - "Hamilton Street, Cold Spring", - "High Street, Cold Spring", - "Main Street, Cold Spring", - "Market Street, Cold Spring", - "New Street, Cold Spring", - "North Street, Cold Spring", - "Oak Street, Cold Spring", - "Orchard Street, Cold Spring", - "Parrot Street, Cold Spring", - "Parsonage Street, Cold Spring", - "Pine Street, Cold Spring", - "Rock Street, Cold Spring", - "Stone Street, Cold Spring", - "Wall Street, Cold Spring", - "West Bank Street, Cold Spring", - "West Belvedere Street, Cold Spring", - "West Street, Cold Spring", - "Chestnut Street, Cold Spring Harbor", - "Flora Street, Cold Spring Harbor", - "Grove Street, Cold Spring Harbor", - "Main Street, Cold Spring Harbor", - "Midland Street, Cold Spring Harbor", - "Rusco Street, Cold Spring Harbor", - "Spring Street, Cold Spring Harbor", - "West Main Street, Cold Spring Harbor", - "Kraw Street, Spring Glen", - "Munro Street, Cold Spring", - "State Street, Cold Spring", - "Spring Street Salt Shed", - "6th Avenue & Spring Street", - "Spring Street Park", - "Broadway & Spring Street", - "Broadway/Spring Street", - "Spring Street Station (6) - Downtown", - "Spring Street Station (6) - Uptown & The Bronx", - "Richmond Road & Spring Street", - "West Spring Street School", - "Spring Street Gallery", - "Spring Street Apartments", - "Spring Street", - "Spring Street", - "Spring Street", - "Spring Street", - "Spring Street", - "Spring Street", - "Spring Street", - "Spring Street", - "Spring Street", - "Spring Street", - "Spring Street", + "Spring (Natural) [[1, POI_TYPE, 1.000, 0.00 km]]", + "Spring Street, South Nyack [[2, STREET, 3.000, 10.57 km]]", + "Spring Street, Tomkins Cove [[2, STREET, 3.000, 16.77 km]]", + "Spring Street, Southfields [[2, STREET, 3.000, 18.10 km]]", + "Spring Street, Hastings-on-Hudson [[2, STREET, 3.000, 18.94 km]]", + "Spring Street, Pleasantville [[2, STREET, 3.000, 20.89 km]]", + "Spring Street (Mount Pleasant), Hawthorne [[2, STREET, 3.000, 21.20 km]]", + "Spring Street, Durland [[2, STREET, 3.000, 28.46 km]]", + "Spring Street, Warwick [[2, STREET, 3.000, 30.94 km]]", + "Spring Street, Nelsonville [[2, STREET, 3.000, 35.60 km]]", + "Spring Street, Goshen [[2, STREET, 3.000, 40.16 km]]", + "Spring Street (Little Italy), Manhattan [[2, STREET, 3.000, 43.76 km]]", + "Spring Street, Maybrook [[2, STREET, 3.000, 43.78 km]]", + "West Spring Street, Maybrook [[2, STREET, 3.000, 43.83 km]]", + "Spring Street, South Salem [[2, STREET, 3.000, 44.74 km]]", + "Spring Street, Groveville [[2, STREET, 3.000, 45.81 km]]", + "Spring Street, East Middletown [[2, STREET, 3.000, 47.95 km]]", + "Spring Street, Montgomery [[2, STREET, 3.000, 48.53 km]]", + "Spring Street, Chelsea [[2, STREET, 3.000, 49.19 km]]", + "Spring Street, Wappingers Falls [[2, STREET, 3.000, 55.17 km]]", + "Spring Street, Cold Spring Harbor [[2, STREET, 3.000, 56.10 km]]", + "Spring Street, Staten Island [[2, STREET, 3.000, 56.86 km]]", + "Spring Street, East Meadow [[2, STREET, 3.000, 59.81 km]]", + "Spring Street, Inwood [[2, STREET, 3.000, 60.63 km]]", + "Spring Street, Port Jervis [[2, STREET, 3.000, 61.24 km]]", + "Spring Street, Roosevelt [[2, STREET, 3.000, 61.89 km]]", + "Spring Street, Pawling [[2, STREET, 3.000, 62.39 km]]", + "Spring Street, Fairview [[2, STREET, 3.000, 68.69 km]]", + "Spring Street (Wyandanch), Wheatley Heights [[2, STREET, 3.000, 69.75 km]]", + "Spring Street, Wyandanch [[2, STREET, 3.000, 69.95 km]]", + "Spring Street, East Massapequa [[2, STREET, 3.000, 71.81 km]]", + "Spring Street, Ellenville [[2, STREET, 3.000, 73.53 km]]", + "Spring Street, Monticello [[2, STREET, 3.000, 79.96 km]]", + "Spring Street, Tillson [[2, STREET, 3.000, 80.56 km]]", + "Spring Street, Port Jefferson [[2, STREET, 3.000, 84.37 km]]", + "Spring Street (Smallwood), Bethel [[2, STREET, 3.000, 88.85 km]]", + "Spring Street, Liberty [[2, STREET, 3.000, 95.92 km]]", + "Spring Street (Livingston Manor), Rockland [[2, STREET, 3.000, 108.88 km]]", + "Spring Street, Livingston Manor [[2, STREET, 3.000, 108.88 km]]", + "Spring Street Salt Shed [[2, POI, 2.000, 43.18 km]]", + "6th Avenue & Spring Street [[2, POI, 2.000, 43.25 km]]", + "Spring Street [[2, POI, 2.000, 43.25 km]]", + "Spring Street [[2, POI, 2.000, 43.25 km]]", + "Spring Street [[2, POI, 2.000, 43.31 km]]", + "Spring Street Park [[2, POI, 2.000, 43.32 km]]", + "Broadway & Spring Street [[2, POI, 2.000, 43.60 km]]", + "Broadway/Spring Street [[2, POI, 2.000, 43.61 km]]", + "Spring Street Station (6) - Downtown [[2, POI, 2.000, 43.65 km]]", + "Spring Street [[2, POI, 2.000, 43.67 km]]", + "Spring Street Station (6) - Uptown & The Bronx [[2, POI, 2.000, 43.68 km]]", + "Richmond Road & Spring Street [[2, POI, 2.000, 56.88 km]]", + "Spring Street [[2, POI, 2.000, 183.80 km]]", + "West Spring Street School [[2, POI, 2.000, 204.27 km]]", + "Spring Street [[2, POI, 2.000, 208.18 km]]", + "Spring Street [[2, POI, 2.000, 217.24 km]]", + "Spring Street Gallery [[2, POI, 2.000, 219.70 km]]", + "Spring Street [[2, POI, 2.000, 220.16 km]]", + "Spring Street [[2, POI, 2.000, 252.77 km]]", + "Spring Street [[2, POI, 2.000, 267.17 km]]", + "Spring Street Apartments [[2, POI, 2.000, 279.20 km]]", + "Spring Street [[2, POI, 2.000, 414.96 km]]", + "Spring Street Salt Shed [[2, POI, 2.000, 43.18 km]]", + "6th Avenue & Spring Street [[2, POI, 2.000, 43.25 km]]", + "Spring Street [[2, POI, 2.000, 43.25 km]]", + "Spring Street [[2, POI, 2.000, 43.25 km]]", + "Spring Street [[2, POI, 2.000, 43.31 km]]", + "Spring Street Park [[2, POI, 2.000, 43.32 km]]", + "Broadway & Spring Street [[2, POI, 2.000, 43.60 km]]", + "Broadway/Spring Street [[2, POI, 2.000, 43.61 km]]", + "Spring Street Station (6) - Downtown [[2, POI, 2.000, 43.65 km]]", + "Spring Street [[2, POI, 2.000, 43.67 km]]", + "Spring Street Station (6) - Uptown & The Bronx [[2, POI, 2.000, 43.68 km]]", + "Richmond Road & Spring Street [[2, POI, 2.000, 56.88 km]]", + "Spring Street [[2, POI, 2.000, 183.80 km]]", + "West Spring Street School [[2, POI, 2.000, 204.27 km]]", + "Spring Street [[2, POI, 2.000, 208.18 km]]", + "Spring Street [[2, POI, 2.000, 217.24 km]]", + "Spring Street Gallery [[2, POI, 2.000, 219.70 km]]", + "Spring Street [[2, POI, 2.000, 220.16 km]]", + "Spring Street [[2, POI, 2.000, 252.77 km]]", + "Spring Street [[2, POI, 2.000, 267.17 km]]", + "Spring Street Apartments [[2, POI, 2.000, 279.20 km]]", + "Spring Street [[2, POI, 2.000, 414.96 km]]", + "Academy Street, Cold Spring [[2, STREET, 0.310, 35.00 km]]", + "Bank Street, Cold Spring [[2, STREET, 0.310, 35.19 km]]", + "B Street, Cold Spring [[2, STREET, 0.310, 35.11 km]]", + "Cedar Street, Cold Spring [[2, STREET, 0.310, 35.36 km]]", + "Cherry Street, Cold Spring [[2, STREET, 0.310, 34.92 km]]", + "Chestnut Street, Cold Spring [[2, STREET, 0.310, 34.79 km]]", + "Church Street, Cold Spring [[2, STREET, 0.310, 34.84 km]]", + "Cross Street, Cold Spring [[2, STREET, 0.310, 34.75 km]]", + "East Belvedere Street, Cold Spring [[2, STREET, 0.310, 35.24 km]]", + "Fair Street, Cold Spring [[2, STREET, 0.310, 35.35 km]]", + "Fish Street, Cold Spring [[2, STREET, 0.310, 34.51 km]]", + "Furnace Street, Cold Spring [[2, STREET, 0.310, 34.81 km]]", + "Garden Street, Cold Spring [[2, STREET, 0.310, 34.84 km]]", + "Haldane Street, Cold Spring [[2, STREET, 0.310, 35.00 km]]", + "Hamilton Street, Cold Spring [[2, STREET, 0.310, 35.31 km]]", + "High Street, Cold Spring [[2, STREET, 0.310, 34.95 km]]", + "Main Street, Cold Spring [[2, STREET, 0.310, 34.78 km]]", + "Market Street, Cold Spring [[2, STREET, 0.310, 34.29 km]]", + "New Street, Cold Spring [[2, STREET, 0.310, 34.40 km]]", + "North Street, Cold Spring [[2, STREET, 0.310, 34.51 km]]", + "Oak Street, Cold Spring [[2, STREET, 0.310, 34.89 km]]", + "Orchard Street, Cold Spring [[2, STREET, 0.310, 35.20 km]]", + "Parrot Street, Cold Spring [[2, STREET, 0.310, 35.18 km]]", + "Parsonage Street, Cold Spring [[2, STREET, 0.310, 35.31 km]]", + "Pine Street, Cold Spring [[2, STREET, 0.310, 35.28 km]]", + "Rock Street, Cold Spring [[2, STREET, 0.310, 34.63 km]]", + "Stone Street, Cold Spring [[2, STREET, 0.310, 34.67 km]]", + "Wall Street, Cold Spring [[2, STREET, 0.310, 34.74 km]]", + "West Bank Street, Cold Spring [[2, STREET, 0.310, 35.05 km]]", + "West Belvedere Street, Cold Spring [[2, STREET, 0.310, 35.15 km]]", + "West Street, Cold Spring [[2, STREET, 0.310, 34.48 km]]", + "Chestnut Street, Cold Spring Harbor [[2, STREET, 0.310, 58.45 km]]", + "Flora Street, Cold Spring Harbor [[2, STREET, 0.310, 56.16 km]]", + "Grove Street, Cold Spring Harbor [[2, STREET, 0.310, 56.67 km]]", + "Main Street, Cold Spring Harbor [[2, STREET, 0.310, 58.23 km]]", + "Midland Street, Cold Spring Harbor [[2, STREET, 0.310, 57.04 km]]", + "Rusco Street, Cold Spring Harbor [[2, STREET, 0.310, 57.95 km]]", + "Spring Street, Cold Spring Harbor [[2, STREET, 0.310, 56.10 km]]", + "West Main Street, Cold Spring Harbor [[2, STREET, 0.310, 56.26 km]]", + "Kraw Street, Spring Glen [[2, STREET, 0.310, 69.40 km]]", + "Munro Street, Cold Spring [[2, STREET, 0.310, 292.27 km]]", + "State Street, Cold Spring [[2, STREET, 0.310, 292.31 km]]", + "Market Street, Cold Spring [[2, STREET, 0.310, 34.29 km]]", + "New Street, Cold Spring [[2, STREET, 0.310, 34.40 km]]", + "Fish Street, Cold Spring [[2, STREET, 0.310, 34.51 km]]", + "North Street, Cold Spring [[2, STREET, 0.310, 34.51 km]]", + "Rock Street, Cold Spring [[2, STREET, 0.310, 34.63 km]]", + "Stone Street, Cold Spring [[2, STREET, 0.310, 34.67 km]]", + "Wall Street, Cold Spring [[2, STREET, 0.310, 34.74 km]]", + "Cross Street, Cold Spring [[2, STREET, 0.310, 34.75 km]]", + "Main Street, Cold Spring [[2, STREET, 0.310, 34.78 km]]", + "Chestnut Street, Cold Spring [[2, STREET, 0.310, 34.79 km]]", + "Furnace Street, Cold Spring [[2, STREET, 0.310, 34.81 km]]", + "Garden Street, Cold Spring [[2, STREET, 0.310, 34.84 km]]", + "Church Street, Cold Spring [[2, STREET, 0.310, 34.84 km]]", + "Oak Street, Cold Spring [[2, STREET, 0.310, 34.89 km]]", + "Cherry Street, Cold Spring [[2, STREET, 0.310, 34.92 km]]", + "High Street, Cold Spring [[2, STREET, 0.310, 34.95 km]]", + "Academy Street, Cold Spring [[2, STREET, 0.310, 35.00 km]]", + "Haldane Street, Cold Spring [[2, STREET, 0.310, 35.00 km]]", + "West Bank Street, Cold Spring [[2, STREET, 0.310, 35.05 km]]", + "B Street, Cold Spring [[2, STREET, 0.310, 35.11 km]]", + "West Belvedere Street, Cold Spring [[2, STREET, 0.310, 35.15 km]]", + "Parrot Street, Cold Spring [[2, STREET, 0.310, 35.18 km]]", + "Bank Street, Cold Spring [[2, STREET, 0.310, 35.19 km]]", + "Orchard Street, Cold Spring [[2, STREET, 0.310, 35.20 km]]", + "East Belvedere Street, Cold Spring [[2, STREET, 0.310, 35.24 km]]", + "Pine Street, Cold Spring [[2, STREET, 0.310, 35.28 km]]", + "Parsonage Street, Cold Spring [[2, STREET, 0.310, 35.31 km]]", + "Hamilton Street, Cold Spring [[2, STREET, 0.310, 35.31 km]]", + "Fair Street, Cold Spring [[2, STREET, 0.310, 35.35 km]]", + "Cedar Street, Cold Spring [[2, STREET, 0.310, 35.36 km]]", + "Flora Street, Cold Spring Harbor [[2, STREET, 0.310, 56.16 km]]", + "West Main Street, Cold Spring Harbor [[2, STREET, 0.310, 56.26 km]]", + "Grove Street, Cold Spring Harbor [[2, STREET, 0.310, 56.67 km]]", + "Midland Street, Cold Spring Harbor [[2, STREET, 0.310, 57.04 km]]", + "Rusco Street, Cold Spring Harbor [[2, STREET, 0.310, 57.95 km]]", + "Main Street, Cold Spring Harbor [[2, STREET, 0.310, 58.23 km]]", + "Chestnut Street, Cold Spring Harbor [[2, STREET, 0.310, 58.45 km]]" ], "amenities": [ { diff --git a/OsmAnd-java/src/test/resources/search/starbucks.json b/OsmAnd-java/src/test/resources/search/starbucks.json index bd4e1f75b9..827cbb1cd0 100644 --- a/OsmAnd-java/src/test/resources/search/starbucks.json +++ b/OsmAnd-java/src/test/resources/search/starbucks.json @@ -11,241 +11,286 @@ }, "phrase": "starbucks coffee", "results": [ - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks coffee", - "STARBUCKS COFFEE", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks Coffee", - "Starbucks", - "Starbucks", - "Starbucks", - "Starbucks", - "Starbucks", - "Starbucks", - "Starbucks", - "Starbucks", - "Starbucks", - "Starbucks Coffee สาขา The X-Place", - "Starbucks" + "Starbucks Coffee [[2, POI, 2.000, 1.74 km]]", + "Starbucks Coffee [[2, POI, 2.000, 3.47 km]]", + "Starbucks Coffee [[2, POI, 2.000, 3.47 km]]", + "Starbucks Coffee [[2, POI, 2.000, 92.61 km]]", + "Starbucks Coffee [[2, POI, 2.000, 92.61 km]]", + "Starbucks [[2, POI, 2.000, 212.95 km]]", + "Starbucks [[2, POI, 2.000, 212.95 km]]", + "Starbucks [[2, POI, 2.000, 263.64 km]]", + "Starbucks [[2, POI, 2.000, 263.65 km]]", + "Starbucks [[2, POI, 2.000, 263.67 km]]", + "Starbucks [[2, POI, 2.000, 263.75 km]]", + "Starbucks [[2, POI, 2.000, 263.75 km]]", + "Starbucks [[2, POI, 2.000, 264.13 km]]", + "Starbucks [[2, POI, 2.000, 264.13 km]]", + "Starbucks Coffee [[2, POI, 2.000, 268.90 km]]", + "Starbucks Coffee [[2, POI, 2.000, 268.90 km]]", + "Starbucks Coffee [[2, POI, 2.000, 285.39 km]]", + "Starbucks Coffee [[2, POI, 2.000, 285.39 km]]", + "Starbucks Coffee [[2, POI, 2.000, 285.43 km]]", + "Starbucks Coffee [[2, POI, 2.000, 285.43 km]]", + "Starbucks Coffee [[2, POI, 2.000, 336.54 km]]", + "Starbucks Coffee [[2, POI, 2.000, 336.54 km]]", + "Starbucks Coffee [[2, POI, 2.000, 337.99 km]]", + "Starbucks Coffee [[2, POI, 2.000, 337.99 km]]", + "Starbucks Coffee [[2, POI, 2.000, 374.87 km]]", + "Starbucks Coffee [[2, POI, 2.000, 374.87 km]]", + "Starbucks Coffee [[2, POI, 2.000, 376.98 km]]", + "Starbucks Coffee [[2, POI, 2.000, 376.98 km]]", + "Starbucks Coffee [[2, POI, 2.000, 388.39 km]]", + "Starbucks Coffee [[2, POI, 2.000, 388.39 km]]", + "Starbucks Coffee [[2, POI, 2.000, 388.97 km]]", + "Starbucks Coffee [[2, POI, 2.000, 388.97 km]]", + "Starbucks Coffee [[2, POI, 2.000, 389.07 km]]", + "Starbucks Coffee [[2, POI, 2.000, 389.07 km]]", + "Starbucks Coffee [[2, POI, 2.000, 389.13 km]]", + "Starbucks Coffee [[2, POI, 2.000, 389.13 km]]", + "Starbucks Coffee [[2, POI, 2.000, 389.68 km]]", + "Starbucks Coffee [[2, POI, 2.000, 389.68 km]]", + "Starbucks Coffee [[2, POI, 2.000, 389.91 km]]", + "Starbucks Coffee [[2, POI, 2.000, 389.91 km]]", + "Starbucks Coffee [[2, POI, 2.000, 406.19 km]]", + "Starbucks Coffee [[2, POI, 2.000, 406.19 km]]", + "Starbucks Coffee [[2, POI, 2.000, 416.04 km]]", + "Starbucks Coffee [[2, POI, 2.000, 416.04 km]]", + "Starbucks Coffee [[2, POI, 2.000, 417.21 km]]", + "Starbucks Coffee [[2, POI, 2.000, 417.21 km]]", + "Starbucks Coffee [[2, POI, 2.000, 435.35 km]]", + "Starbucks Coffee [[2, POI, 2.000, 435.35 km]]", + "Starbucks Coffee [[2, POI, 2.000, 449.89 km]]", + "Starbucks Coffee [[2, POI, 2.000, 449.89 km]]", + "Starbucks Coffee [[2, POI, 2.000, 454.97 km]]", + "Starbucks Coffee [[2, POI, 2.000, 454.97 km]]", + "Starbucks Coffee [[2, POI, 2.000, 458.16 km]]", + "Starbucks Coffee [[2, POI, 2.000, 458.16 km]]", + "Starbucks Coffee [[2, POI, 2.000, 458.29 km]]", + "Starbucks Coffee [[2, POI, 2.000, 458.29 km]]", + "Starbucks Coffee [[2, POI, 2.000, 458.45 km]]", + "Starbucks Coffee [[2, POI, 2.000, 458.45 km]]", + "Starbucks Coffee [[2, POI, 2.000, 459.18 km]]", + "Starbucks Coffee [[2, POI, 2.000, 459.18 km]]", + "Starbucks Coffee [[2, POI, 2.000, 461.51 km]]", + "Starbucks Coffee [[2, POI, 2.000, 461.51 km]]", + "Starbucks Coffee [[2, POI, 2.000, 462.03 km]]", + "Starbucks Coffee [[2, POI, 2.000, 462.03 km]]", + "Starbucks Coffee [[2, POI, 2.000, 462.97 km]]", + "Starbucks Coffee [[2, POI, 2.000, 462.97 km]]", + "Starbucks Coffee [[2, POI, 2.000, 464.01 km]]", + "Starbucks Coffee [[2, POI, 2.000, 464.01 km]]", + "Starbucks Coffee [[2, POI, 2.000, 464.11 km]]", + "Starbucks Coffee [[2, POI, 2.000, 464.11 km]]", + "Starbucks Coffee สาขา The X-Place [[2, POI, 2.000, 464.70 km]]", + "Starbucks Coffee [[2, POI, 2.000, 464.75 km]]", + "Starbucks Coffee [[2, POI, 2.000, 464.75 km]]", + "Starbucks Coffee [[2, POI, 2.000, 466.89 km]]", + "Starbucks Coffee [[2, POI, 2.000, 466.89 km]]", + "Starbucks Coffee [[2, POI, 2.000, 466.89 km]]", + "Starbucks Coffee [[2, POI, 2.000, 466.89 km]]", + "Starbucks Coffee [[2, POI, 2.000, 466.93 km]]", + "Starbucks Coffee [[2, POI, 2.000, 466.93 km]]", + "Starbucks Coffee [[2, POI, 2.000, 466.99 km]]", + "Starbucks Coffee [[2, POI, 2.000, 466.99 km]]", + "Starbucks Coffee [[2, POI, 2.000, 467.24 km]]", + "Starbucks Coffee [[2, POI, 2.000, 467.24 km]]", + "Starbucks Coffee [[2, POI, 2.000, 467.36 km]]", + "Starbucks Coffee [[2, POI, 2.000, 467.36 km]]", + "Starbucks Coffee [[2, POI, 2.000, 467.58 km]]", + "Starbucks Coffee [[2, POI, 2.000, 467.58 km]]", + "Starbucks Coffee [[2, POI, 2.000, 467.75 km]]", + "Starbucks Coffee [[2, POI, 2.000, 467.75 km]]", + "Starbucks [[2, POI, 2.000, 468.46 km]]", + "Starbucks [[2, POI, 2.000, 468.46 km]]", + "Starbucks [[2, POI, 2.000, 468.53 km]]", + "Starbucks [[2, POI, 2.000, 468.53 km]]", + "Starbucks Coffee [[2, POI, 2.000, 468.69 km]]", + "Starbucks Coffee [[2, POI, 2.000, 468.69 km]]", + "Starbucks Coffee [[2, POI, 2.000, 468.95 km]]", + "Starbucks Coffee [[2, POI, 2.000, 468.95 km]]", + "Starbucks [[2, POI, 2.000, 468.96 km]]", + "Starbucks [[2, POI, 2.000, 468.96 km]]", + "Starbucks Coffee [[2, POI, 2.000, 469.17 km]]", + "Starbucks Coffee [[2, POI, 2.000, 469.17 km]]", + "Starbucks [[2, POI, 2.000, 469.19 km]]", + "Starbucks Coffee [[2, POI, 2.000, 469.27 km]]", + "Starbucks Coffee [[2, POI, 2.000, 469.27 km]]", + "Starbucks Coffee [[2, POI, 2.000, 469.27 km]]", + "Starbucks Coffee [[2, POI, 2.000, 469.54 km]]", + "Starbucks Coffee [[2, POI, 2.000, 469.54 km]]", + "สตาร์บัคส์ [[2, POI, 2.000, 469.55 km]]", + "Starbucks Coffee [[2, POI, 2.000, 469.59 km]]", + "Starbucks Coffee [[2, POI, 2.000, 469.59 km]]", + "Starbucks Coffee [[2, POI, 2.000, 469.70 km]]", + "Starbucks Coffee [[2, POI, 2.000, 469.70 km]]", + "Starbucks Coffee [[2, POI, 2.000, 469.72 km]]", + "Starbucks Coffee [[2, POI, 2.000, 469.72 km]]", + "Starbucks [[2, POI, 2.000, 469.72 km]]", + "Starbucks Coffee [[2, POI, 2.000, 469.78 km]]", + "Starbucks Coffee [[2, POI, 2.000, 469.78 km]]", + "Starbucks Coffee [[2, POI, 2.000, 469.84 km]]", + "Starbucks Coffee [[2, POI, 2.000, 469.84 km]]", + "Starbucks Coffee [[2, POI, 2.000, 469.90 km]]", + "Starbucks Coffee [[2, POI, 2.000, 469.90 km]]", + "Starbucks Coffee [[2, POI, 2.000, 470.05 km]]", + "Starbucks Coffee [[2, POI, 2.000, 470.05 km]]", + "สตาร์บัคส์ [[2, POI, 2.000, 470.32 km]]", + "Starbucks Coffee [[2, POI, 2.000, 470.35 km]]", + "Starbucks Coffee [[2, POI, 2.000, 470.35 km]]", + "Starbucks Coffee [[2, POI, 2.000, 470.54 km]]", + "Starbucks Coffee [[2, POI, 2.000, 470.54 km]]", + "สตาร์บัคส์ [[2, POI, 2.000, 470.57 km]]", + "สตาร์บัคส์ [[2, POI, 2.000, 470.64 km]]", + "Starbucks [[2, POI, 2.000, 470.66 km]]", + "Starbucks [[2, POI, 2.000, 470.77 km]]", + "Starbucks Coffee [[2, POI, 2.000, 470.83 km]]", + "Starbucks Coffee [[2, POI, 2.000, 470.83 km]]", + "สตาร์บัคส์ [[2, POI, 2.000, 470.83 km]]", + "Starbucks [[2, POI, 2.000, 471.00 km]]", + "Starbucks Coffee [[2, POI, 2.000, 471.04 km]]", + "Starbucks Coffee [[2, POI, 2.000, 471.04 km]]", + "Starbucks [[2, POI, 2.000, 471.06 km]]", + "Starbucks [[2, POI, 2.000, 471.13 km]]", + "Starbucks [[2, POI, 2.000, 471.13 km]]", + "สตาร์บัคส์ [[2, POI, 2.000, 471.15 km]]", + "สตาร์บัคส์ [[2, POI, 2.000, 471.24 km]]", + "Starbucks [[2, POI, 2.000, 471.25 km]]", + "Starbucks [[2, POI, 2.000, 471.26 km]]", + "Starbucks Coffee [[2, POI, 2.000, 471.33 km]]", + "Starbucks [[2, POI, 2.000, 471.47 km]]", + "สตาร์บัคส์ [[2, POI, 2.000, 471.59 km]]", + "Starbucks [[2, POI, 2.000, 471.62 km]]", + "Starbucks [[2, POI, 2.000, 471.62 km]]", + "Starbucks Coffee [[2, POI, 2.000, 471.66 km]]", + "Starbucks Coffee [[2, POI, 2.000, 471.66 km]]", + "Starbucks [[2, POI, 2.000, 471.67 km]]", + "Starbucks Coffee [[2, POI, 2.000, 471.69 km]]", + "Starbucks Coffee [[2, POI, 2.000, 471.69 km]]", + "Starbucks [[2, POI, 2.000, 471.69 km]]", + "Starbucks [[2, POI, 2.000, 471.70 km]]", + "Starbucks Coffee [[2, POI, 2.000, 471.75 km]]", + "Starbucks Coffee [[2, POI, 2.000, 471.75 km]]", + "สตาร์บัคส์ [[2, POI, 2.000, 471.75 km]]", + "Starbucks [[2, POI, 2.000, 471.75 km]]", + "สตาร์บัคส์ [[2, POI, 2.000, 471.83 km]]", + "Starbucks [[2, POI, 2.000, 471.83 km]]", + "Starbucks [[2, POI, 2.000, 471.84 km]]", + "สตาร์บัคส์ [[2, POI, 2.000, 471.85 km]]", + "Starbucks Coffee [[2, POI, 2.000, 471.89 km]]", + "Starbucks [[2, POI, 2.000, 471.89 km]]", + "สตาร์บัคส์ [[2, POI, 2.000, 471.90 km]]", + "Starbucks [[2, POI, 2.000, 471.91 km]]", + "สตาร์บัคส์ [[2, POI, 2.000, 471.94 km]]", + "Starbucks Coffee [[2, POI, 2.000, 471.97 km]]", + "Starbucks [[2, POI, 2.000, 472.01 km]]", + "Starbucks Coffee [[2, POI, 2.000, 472.03 km]]", + "Starbucks Coffee [[2, POI, 2.000, 472.03 km]]", + "Starbucks Coffee [[2, POI, 2.000, 472.03 km]]", + "สตาร์บัคส์ [[2, POI, 2.000, 472.06 km]]", + "Starbucks [[2, POI, 2.000, 472.17 km]]", + "Starbucks Coffee [[2, POI, 2.000, 472.24 km]]", + "Starbucks Coffee [[2, POI, 2.000, 472.24 km]]", + "Starbucks [[2, POI, 2.000, 472.32 km]]", + "Starbucks [[2, POI, 2.000, 472.39 km]]", + "Starbucks [[2, POI, 2.000, 472.39 km]]", + "Starbucks Coffee [[2, POI, 2.000, 472.40 km]]", + "Starbucks Coffee [[2, POI, 2.000, 472.40 km]]", + "สตาร์บัคส์ [[2, POI, 2.000, 472.45 km]]", + "Starbucks Coffee [[2, POI, 2.000, 472.60 km]]", + "Starbucks Coffee [[2, POI, 2.000, 472.60 km]]", + "Starbucks Coffee [[2, POI, 2.000, 472.60 km]]", + "Starbucks Coffee [[2, POI, 2.000, 472.60 km]]", + "Starbucks Coffee [[2, POI, 2.000, 472.69 km]]", + "Starbucks Coffee [[2, POI, 2.000, 472.69 km]]", + "Starbucks Coffee [[2, POI, 2.000, 472.76 km]]", + "Starbucks Coffee [[2, POI, 2.000, 472.76 km]]", + "Starbucks [[2, POI, 2.000, 472.90 km]]", + "Starbucks Coffee [[2, POI, 2.000, 472.92 km]]", + "Starbucks Coffee [[2, POI, 2.000, 472.93 km]]", + "Starbucks Coffee [[2, POI, 2.000, 473.14 km]]", + "Starbucks Coffee [[2, POI, 2.000, 473.14 km]]", + "Starbucks Coffee [[2, POI, 2.000, 473.53 km]]", + "Starbucks Coffee [[2, POI, 2.000, 473.53 km]]", + "Starbucks [[2, POI, 2.000, 473.55 km]]", + "Starbucks [[2, POI, 2.000, 474.53 km]]", + "Starbucks Coffee [[2, POI, 2.000, 474.60 km]]", + "Starbucks Coffee [[2, POI, 2.000, 474.60 km]]", + "Starbucks Coffee [[2, POI, 2.000, 474.63 km]]", + "Starbucks Coffee [[2, POI, 2.000, 474.63 km]]", + "Starbucks Coffee [[2, POI, 2.000, 474.73 km]]", + "Starbucks Coffee [[2, POI, 2.000, 474.73 km]]", + "Starbucks [[2, POI, 2.000, 475.43 km]]", + "Starbucks [[2, POI, 2.000, 475.64 km]]", + "Starbucks Coffee [[2, POI, 2.000, 475.68 km]]", + "Starbucks Coffee [[2, POI, 2.000, 475.68 km]]", + "Starbucks Coffee [[2, POI, 2.000, 475.83 km]]", + "Starbucks [[2, POI, 2.000, 476.09 km]]", + "Starbucks Coffee [[2, POI, 2.000, 476.89 km]]", + "Starbucks Coffee [[2, POI, 2.000, 476.89 km]]", + "Starbucks Coffee [[2, POI, 2.000, 477.21 km]]", + "Starbucks Coffee [[2, POI, 2.000, 477.21 km]]", + "Starbucks Coffee [[2, POI, 2.000, 479.00 km]]", + "Starbucks Coffee [[2, POI, 2.000, 479.00 km]]", + "Starbucks Coffee [[2, POI, 2.000, 479.29 km]]", + "Starbucks Coffee [[2, POI, 2.000, 479.29 km]]", + "Starbucks Coffee [[2, POI, 2.000, 479.96 km]]", + "Starbucks Coffee [[2, POI, 2.000, 479.96 km]]", + "Starbucks Coffee [[2, POI, 2.000, 480.08 km]]", + "Starbucks Coffee [[2, POI, 2.000, 480.08 km]]", + "Starbucks Coffee [[2, POI, 2.000, 480.20 km]]", + "Starbucks Coffee [[2, POI, 2.000, 480.20 km]]", + "Starbucks Coffee [[2, POI, 2.000, 481.18 km]]", + "Starbucks Coffee [[2, POI, 2.000, 481.18 km]]", + "Starbucks Coffee [[2, POI, 2.000, 481.20 km]]", + "Starbucks Coffee [[2, POI, 2.000, 481.20 km]]", + "Starbucks Coffee [[2, POI, 2.000, 481.33 km]]", + "Starbucks Coffee [[2, POI, 2.000, 481.33 km]]", + "Starbucks Coffee [[2, POI, 2.000, 482.21 km]]", + "Starbucks Coffee [[2, POI, 2.000, 482.21 km]]", + "Starbucks Coffee [[2, POI, 2.000, 482.55 km]]", + "Starbucks Coffee [[2, POI, 2.000, 482.55 km]]", + "Starbucks Coffee [[2, POI, 2.000, 482.59 km]]", + "Starbucks Coffee [[2, POI, 2.000, 482.59 km]]", + "Starbucks Coffee [[2, POI, 2.000, 482.73 km]]", + "Starbucks Coffee [[2, POI, 2.000, 482.73 km]]", + "Starbucks Coffee [[2, POI, 2.000, 482.80 km]]", + "Starbucks Coffee [[2, POI, 2.000, 482.80 km]]", + "Starbucks Coffee [[2, POI, 2.000, 484.02 km]]", + "Starbucks Coffee [[2, POI, 2.000, 484.02 km]]", + "Starbucks Coffee [[2, POI, 2.000, 486.63 km]]", + "Starbucks Coffee [[2, POI, 2.000, 486.63 km]]", + "Starbucks Coffee [[2, POI, 2.000, 486.83 km]]", + "Starbucks Coffee [[2, POI, 2.000, 486.83 km]]", + "Starbucks Coffee [[2, POI, 2.000, 487.90 km]]", + "Starbucks Coffee [[2, POI, 2.000, 487.90 km]]", + "Starbucks Coffee [[2, POI, 2.000, 488.50 km]]", + "Starbucks Coffee [[2, POI, 2.000, 488.50 km]]", + "Starbucks Coffee [[2, POI, 2.000, 489.17 km]]", + "Starbucks Coffee [[2, POI, 2.000, 489.17 km]]", + "Starbucks Coffee [[2, POI, 2.000, 490.48 km]]", + "Starbucks Coffee [[2, POI, 2.000, 490.48 km]]", + "Starbucks Coffee [[2, POI, 2.000, 490.58 km]]", + "Starbucks Coffee [[2, POI, 2.000, 490.62 km]]", + "Starbucks Coffee [[2, POI, 2.000, 490.62 km]]", + "Starbucks Coffee [[2, POI, 2.000, 490.64 km]]", + "Starbucks Coffee [[2, POI, 2.000, 490.64 km]]", + "Starbucks Coffee [[2, POI, 2.000, 490.67 km]]", + "Starbucks Coffee [[2, POI, 2.000, 490.77 km]]", + "Starbucks Coffee [[2, POI, 2.000, 490.77 km]]", + "Starbucks Coffee [[2, POI, 2.000, 491.42 km]]", + "Starbucks Coffee [[2, POI, 2.000, 491.42 km]]", + "Starbucks Coffee [[2, POI, 2.000, 491.69 km]]", + "Starbucks Coffee [[2, POI, 2.000, 491.69 km]]", + "Starbucks coffee [[2, POI, 2.000, 508.65 km]]", + "STARBUCKS COFFEE [[2, POI, 2.000, 508.65 km]]", + "Starbucks Coffee [[2, POI, 2.000, 537.88 km]]", + "Starbucks Coffee [[2, POI, 2.000, 645.39 km]]", + "Starbucks Coffee [[2, POI, 2.000, 645.39 km]]", + "Starbucks [[2, POI, 2.000, 825.00 km]]", + "Starbucks [[2, POI, 2.000, 924.99 km]]", + "Starbucks [[2, POI, 2.000, 925.57 km]]", + "Starbucks Coffee [[2, POI, 2.000, 972.63 km]]", + "Starbucks Coffee [[2, POI, 2.000, 972.63 km]]" ], "amenities": [ { diff --git a/OsmAnd-java/src/test/resources/search/street_komsomolskaya.json b/OsmAnd-java/src/test/resources/search/street_komsomolskaya.json index 525aee1b12..a07ea43d06 100644 --- a/OsmAnd-java/src/test/resources/search/street_komsomolskaya.json +++ b/OsmAnd-java/src/test/resources/search/street_komsomolskaya.json @@ -11,13 +11,18 @@ }, "phrase": "комсомольская", "results": [ - "Комсомольская улица, Заинск", - "Комсомольская улица, Чукмарлы", - "Комсомольская улица, Русский Акташ", - "Комсомольская улица, Альметьевск", - "Комсомольская набережная, Набережные Челны", - "Комсомольская улица, Новое Надырово", - "Комсомольская улица, Тарловка" + "Комсомольская улица, Заинск [[1, STREET, 3.000, 0.77 km]]", + "Комсомольская улица, Чукмарлы [[1, STREET, 3.000, 26.83 km]]", + "Комсомольская улица, Русский Акташ [[1, STREET, 3.000, 28.18 km]]", + "Комсомольская улица, Альметьевск [[1, STREET, 3.000, 46.40 km]]", + "Комсомольская набережная, Набережные Челны [[1, STREET, 3.000, 48.55 km]]", + "Комсомольская улица, Новое Надырово [[1, STREET, 3.000, 52.30 km]]", + "Комсомольская улица, Тарловка [[1, STREET, 3.000, 55.76 km]]", + "Комсомольская улица, Мамадыш [[1, STREET, 3.000, 61.75 km]]", + "Комсомольская улица, Кузкеево [[1, STREET, 3.000, 73.57 km]]", + "Комсомольская улица, Актюбинский [[1, STREET, 3.000, 73.90 km]]", + "улица Комсомольская, Малтабарово [[1, STREET, 3.000, 74.71 km]]", + "Комсомольская улица, Карабаш [[1, STREET, 3.000, 75.32 km]]" ], "amenities": [ { diff --git a/OsmAnd-java/src/test/resources/search/street_lenina_30.json b/OsmAnd-java/src/test/resources/search/street_lenina_30.json index 2c510ea1e0..7dfef867f8 100644 --- a/OsmAnd-java/src/test/resources/search/street_lenina_30.json +++ b/OsmAnd-java/src/test/resources/search/street_lenina_30.json @@ -11,15 +11,71 @@ }, "phrase": "ленина 30", "results": [ - "30А, улица Ленина, Заинск", - "30Б, улица Ленина, Заинск", - "30, улица Ленина, Сарманово", - "30, улица Ленина, Большое Афанасово", - "30, улица Ленина, Альметьевск", - "30А, улица Ленина, Альметьевск", - "улица Ленина, Заинск", - "улица Ленина, Аксарино", - "улица Ленина, Светлое Озеро" + "30А, улица Ленина, Заинск [[2, HOUSE, 0.430, 1.33 km]]", + "30Б, улица Ленина, Заинск [[2, HOUSE, 0.430, 1.25 km]]", + "30, улица Ленина, Сарманово [[2, HOUSE, 0.430, 37.20 km]]", + "30, улица Ленина, Большое Афанасово [[2, HOUSE, 0.430, 38.21 km]]", + "30, улица Ленина, Альметьевск [[2, HOUSE, 0.430, 46.58 km]]", + "30А, улица Ленина, Альметьевск [[2, HOUSE, 0.430, 46.52 km]]", + "улица Ленина, Заинск [[1, STREET, 3.000, 0.42 km]]", + "улица Ленина, Аксарино [[1, STREET, 3.000, 8.83 km]]", + "улица Ленина, Светлое Озеро [[1, STREET, 3.000, 11.98 km]]", + "улица Ленина, Старый Токмак [[1, STREET, 3.000, 12.32 km]]", + "улица Ленина, Имянлебаш [[1, STREET, 3.000, 13.62 km]]", + "улица Ленина, Верхняя Уратьма [[1, STREET, 3.000, 16.97 km]]", + "улица Ленина, Красная Кадка [[1, STREET, 3.000, 19.92 km]]", + "улица Ленина, Большие Аты [[1, STREET, 3.000, 20.94 km]]", + "улица Ленина, Бегишево [[1, STREET, 3.000, 22.37 km]]", + "улица Ленина, Туба [[1, STREET, 3.000, 26.21 km]]", + "улица Ленина, Русский Акташ [[1, STREET, 3.000, 27.38 km]]", + "улица Ленина, Шингальчи [[1, STREET, 3.000, 27.74 km]]", + "улица Ленина, Болгар [[1, STREET, 3.000, 29.55 km]]", + "улица Ленина, Петровский Завод [[1, STREET, 3.000, 31.18 km]]", + "улица Ленина, Мусабай-Завод [[1, STREET, 3.000, 35.32 km]]", + "улица Ленина, Сарманово [[1, STREET, 3.000, 36.68 km]]", + "улица Ленина, Большое Афанасово [[1, STREET, 3.000, 38.36 km]]", + "улица Ленина, Старое Клянчино [[1, STREET, 3.000, 38.42 km]]", + "улица Ленина, Подгорный Дрюш [[1, STREET, 3.000, 41.91 km]]", + "Ленина, Альметьевск [[1, STREET, 3.000, 44.87 km]]", + "улица Ленина, Альметьевск [[1, STREET, 3.000, 46.35 km]]", + "улица Ленина, Старые Челны [[1, STREET, 3.000, 49.78 km]]", + "улица Ленина, Набережные Челны [[1, STREET, 3.000, 49.78 km]]", + "улица Ленина, Маметьево [[1, STREET, 3.000, 52.24 km]]", + "улица Ленина, Кармалы [[1, STREET, 3.000, 52.25 km]]", + "улица Ленина, Орловка [[1, STREET, 3.000, 53.37 km]]", + "улица Ленина, Буденовец [[1, STREET, 3.000, 54.44 km]]", + "улица Ленина, Джалиль [[1, STREET, 3.000, 54.97 km]]", + "улица Ленина, Чупаево [[1, STREET, 3.000, 55.17 km]]", + "улица Ленина, Новошешминск [[1, STREET, 3.000, 55.87 km]]", + "улица Ленина, Саклов-Баш [[1, STREET, 3.000, 56.28 km]]", + "улица В. И. Ленина, Мамадыш [[1, STREET, 3.000, 60.36 km]]", + "улица Ленина, Красная Горка [[1, STREET, 3.000, 61.68 km]]", + "улица Ленина, Малая Шильна [[1, STREET, 3.000, 66.26 km]]", + "улица Ленина, Актюбинский [[1, STREET, 3.000, 73.22 km]]", + "улица Ленина, Карабаш [[1, STREET, 3.000, 75.67 km]]", + "совхоза имени Ленина [[1, POI, 2.000, 899.76 km]]", + "Леніна [[1, POI, 2.000, 1163.27 km]]", + "улица Ленина [[1, POI, 2.000, 16.46 km]]", + "улица Ленина [[1, POI, 2.000, 27.74 km]]", + "улица Ленина [[1, POI, 2.000, 46.74 km]]", + "улица Ленина [[1, POI, 2.000, 46.74 km]]", + "Ул Ленина [[1, POI, 2.000, 74.29 km]]", + "улица Ленина [[1, POI, 2.000, 108.41 km]]", + "улица Ленина [[1, POI, 2.000, 120.26 km]]", + "Парк Ленина [[1, POI, 2.000, 122.09 km]]", + "улица Ленина [[1, POI, 2.000, 130.70 km]]", + "улица Ленина [[1, POI, 2.000, 138.27 km]]", + "улица Ленина [[1, POI, 2.000, 149.67 km]]", + "Ленина 148 [[1, POI, 2.000, 161.65 km]]", + "Дом-музей В.И.Ленина [[1, POI, 2.000, 188.81 km]]", + "Культурно-досуговый комплекс им. В.И.Ленина [[1, POI, 2.000, 194.07 km]]", + "ДК им.Ленина [[1, POI, 2.000, 194.10 km]]", + "ДК им.Ленина [[1, POI, 2.000, 194.16 km]]", + "НПО им. Ленина [[1, POI, 2.000, 207.90 km]]", + "НПО им. Ленина [[1, POI, 2.000, 207.94 km]]", + "Ленина [[1, POI, 2.000, 218.83 km]]", + "улица Ленина [[1, POI, 2.000, 230.77 km]]", + "Санаторий имени В.И. Ленина [[1, POI, 2.000, 242.65 km]]" ], "amenities": [ { diff --git a/OsmAnd-java/src/test/resources/search/street_rue_emile.json b/OsmAnd-java/src/test/resources/search/street_rue_emile.json index 74c6541b34..c233d6f1fe 100644 --- a/OsmAnd-java/src/test/resources/search/street_rue_emile.json +++ b/OsmAnd-java/src/test/resources/search/street_rue_emile.json @@ -11,18 +11,140 @@ }, "phrase": "rue émile", "results": [ - "Rue Émile Gérard, Liège", - "Rue Emile Vandervelde, Liège", - "Rue Emile Vandervelde - Rue Sainte-Marguerite, Liège", - "Rue Émile Zola (Laveu), Liège", - "Rue Émile Collard, Liège", - "Rue Emile Vandervelde, Vottem", - "Rue Emile Vandervelde (Vottem), Herstal", - "Rue Émile Verhaeren, Liège", - "Rue Émile Jeanne, Saint-Nicolas", - "Rue Emile Muraille, Herstal", - "Rue Emile Verhaeren, Grâce-Hollogne", - "Rue Emile Vinck, Herstal" + "Rue Émile Gérard, Liège [[2, STREET, 3.000, 1.42 km]]", + "Rue Emile Vandervelde, Liège [[2, STREET, 3.000, 1.66 km]]", + "Rue Emile Vandervelde - Rue Sainte-Marguerite, Liège [[2, STREET, 3.000, 1.74 km]]", + "Rue Émile Zola (Laveu), Liège [[2, STREET, 3.000, 1.98 km]]", + "Rue Émile Collard, Liège [[2, STREET, 3.000, 2.49 km]]", + "Rue Emile Vandervelde, Vottem [[2, STREET, 3.000, 3.22 km]]", + "Rue Emile Vandervelde (Vottem), Herstal [[2, STREET, 3.000, 3.23 km]]", + "Rue Émile Verhaeren, Liège [[2, STREET, 3.000, 3.58 km]]", + "Rue Émile Jeanne, Saint-Nicolas [[2, STREET, 3.000, 4.03 km]]", + "Rue Emile Muraille, Herstal [[2, STREET, 3.000, 4.70 km]]", + "Rue Emile Verhaeren, Grâce-Hollogne [[2, STREET, 3.000, 4.71 km]]", + "Rue Emile Vinck, Herstal [[2, STREET, 3.000, 4.72 km]]", + "Rue Emile Wiket, Grâce-Hollogne [[2, STREET, 3.000, 4.74 km]]", + "Rue Émile Zola, Grâce-Berleur [[2, STREET, 3.000, 5.15 km]]", + "Rue Émile Zola (Grâce-Berleur), Grâce-Hollogne [[2, STREET, 3.000, 5.15 km]]", + "Rue Emile Vandervelde (Loncin), Ans [[2, STREET, 3.000, 5.17 km]]", + "Rue Emile Tilman, Herstal [[2, STREET, 3.000, 5.19 km]]", + "Rue Émile Lerousseau, Liers [[2, STREET, 3.000, 5.45 km]]", + "Rue du Couvent - Rue Emile Vandervelde, Liège [[2, STREET, 3.000, 5.74 km]]", + "Rue Émile Lerousseau (Liers), Herstal [[2, STREET, 3.000, 5.85 km]]", + "Rue Émile Vandervelde (Vaux-sous-Chèvremont), Chaudfontaine [[2, STREET, 3.000, 6.60 km]]", + "Rue Emile Royer (Jemeppe-Sur-Meuse), Seraing [[2, STREET, 3.000, 6.76 km]]", + "Rue Emile Vandervelde, Queue-du-Bois [[2, STREET, 3.000, 7.32 km]]", + "Rue Paul Emile Janson, Awans [[2, STREET, 3.000, 7.33 km]]", + "Rue Emile Vandevelde, Fléron [[2, STREET, 3.000, 7.52 km]]", + "Rue Paul-Emile Janson, Flémalle [[2, STREET, 3.000, 8.25 km]]", + "Rue Emile Vandervelde (Vivegnis), Oupeye [[2, STREET, 3.000, 8.34 km]]", + "Rue Emile Vinck, Oupeye [[2, STREET, 3.000, 8.53 km]]", + "Rue Emile Vandervelde, Flémalle [[2, STREET, 3.000, 8.67 km]]", + "Rue Émile Zola, Seraing [[2, STREET, 3.000, 8.76 km]]", + "Rue Emile de Laveleye, Hermalle-sous-Argenteau [[2, STREET, 3.000, 9.67 km]]", + "Rue Emile de Laveleye, Oupeye [[2, STREET, 3.000, 9.84 km]]", + "Rue Emile Grisard, Juprelle [[2, STREET, 3.000, 10.19 km]]", + "Rue Emile Verhaeren, Visé [[2, STREET, 3.000, 13.02 km]]", + "Rue Emile Delcour, Saint-Georges-sur-Meuse [[2, STREET, 3.000, 14.96 km]]", + "Rue Émile Fairon, Pepinster [[2, STREET, 3.000, 18.91 km]]", + "Rue Emile Vandervelde, Comblain-au-Pont [[2, STREET, 3.000, 19.17 km]]", + "Rue Emile Vandervelde (Wegnez), Pepinster [[2, STREET, 3.000, 19.34 km]]", + "Rue Emile Vandervelde, Amay [[2, STREET, 3.000, 20.84 km]]", + "Rue Emile Lelarge, Verviers [[2, STREET, 3.000, 22.80 km]]", + "Rue Émile Vandervelde, Borlez [[2, STREET, 3.000, 23.23 km]]", + "Rue Emile Hallet, Waremme [[2, STREET, 3.000, 23.40 km]]", + "Rue Docteur Emile Neuville, Villers-le-Bouillet [[2, STREET, 3.000, 23.80 km]]", + "Rue Emile Marchoul, Waremme [[2, STREET, 3.000, 24.21 km]]", + "Rue Emile Vandervelde (Vinalmont), Wanze [[2, STREET, 3.000, 25.91 km]]", + "Rue Émile Colette, Limbourg [[2, STREET, 3.000, 25.94 km]]", + "Rue Emile Vandervelde, Vinalmont [[2, STREET, 3.000, 25.97 km]]", + "Rue Émile Muselle, Berloz [[2, STREET, 3.000, 26.33 km]]", + "Rue Emile Delperée, Huy [[2, STREET, 3.000, 26.70 km]]", + "Rue Emile Rorive, Wanze [[2, STREET, 3.000, 27.17 km]]", + "Rue Emile Lejeune, Geer [[2, STREET, 3.000, 28.34 km]]", + "Rue Emile Schmuck, Baelen [[2, STREET, 3.000, 28.49 km]]", + "Rue Emile Roder, Hannut [[2, STREET, 3.000, 31.34 km]]", + "Rue Emile Vandervelde, Marchin [[2, STREET, 3.000, 31.59 km]]", + "Rue Emile Vandervelde, Gives [[2, STREET, 3.000, 33.42 km]]", + "Rue Emile Vandervelde (Gives), Huy [[2, STREET, 3.000, 33.42 km]]", + "Rue Emile Goedert, Francorchamps [[2, STREET, 3.000, 34.14 km]]", + "Rue Emile Martin, Hannut [[2, STREET, 3.000, 34.89 km]]", + "Rue Emile Godfrind, Andenne [[2, STREET, 3.000, 38.07 km]]", + "Rue Emile Godfrind, Seilles [[2, STREET, 3.000, 38.35 km]]", + "Rue Emile Duchesne, Grand-Hallet [[2, STREET, 3.000, 38.66 km]]", + "Rue Emile Looze (Maret), Orp-Jauche [[2, STREET, 3.000, 41.20 km]]", + "Rue Emile Looze (Pellaines), Lincent [[2, STREET, 3.000, 41.24 km]]", + "Rue Emile Tromme, Vielsalm [[2, STREET, 3.000, 42.94 km]]", + "Rue Emile Landeut, Orp-Jauche [[2, STREET, 3.000, 43.71 km]]", + "Rue Emile Parfonry, Hotton [[2, STREET, 3.000, 43.75 km]]", + "Rue Emile Vandervelde (Namêche), Andenne [[2, STREET, 3.000, 44.87 km]]", + "Rue Emile Dupont, Rendeux [[2, STREET, 3.000, 45.98 km]]", + "Rue Émile Demelenne, Marche-en-Famenne [[2, STREET, 3.000, 48.54 km]]", + "Rue Emile Marnach, Vedrin [[2, STREET, 3.000, 52.19 km]]", + "Rue Emile Masset, Perwez [[2, STREET, 3.000, 53.07 km]]", + "Rue Émile Crebeyck, Perwez [[2, STREET, 3.000, 53.41 km]]", + "Rue Emile de Brabant, Perwez [[2, STREET, 3.000, 53.59 km]]", + "Rue Émile Cuvelier, Namur [[2, STREET, 3.000, 53.92 km]]", + "Rue Emile Melchior, Saint-Servais [[2, STREET, 3.000, 55.31 km]]", + "Rue Emile Herman, Marche-en-Famenne [[2, STREET, 3.000, 56.87 km]]", + "Rue Emile Dessenius, Namur [[2, STREET, 3.000, 57.52 km]]", + "Rue Emile Vandervelde (Flawinne), Namur [[2, STREET, 3.000, 58.18 km]]", + "Rue Emile Vandervelde, Flawinne [[2, STREET, 3.000, 58.18 km]]", + "Rue Emile Mazy (Flawinne), Namur [[2, STREET, 3.000, 58.85 km]]", + "Rue Emile Mazy, Flawinne [[2, STREET, 3.000, 58.85 km]]", + "Rue Emile Mahaux, Bois-de-Villers [[2, STREET, 3.000, 60.14 km]]", + "Rue Emile Mahaux, Profondeville [[2, STREET, 3.000, 60.14 km]]", + "Rue Emile Dewez (Beuzet), Gembloux [[2, STREET, 3.000, 60.65 km]]", + "Rue Emile Mazy (Bois-de-Villers), Profondeville [[2, STREET, 3.000, 61.08 km]]", + "Rue Emile Mazy, Bois-de-Villers [[2, STREET, 3.000, 61.08 km]]", + "Rue Emile Marchal, Isnes [[2, STREET, 3.000, 62.58 km]]", + "Rue Émile Lorent, Floreffe [[2, STREET, 3.000, 62.66 km]]", + "Rue Emile Lessire, Floreffe [[2, STREET, 3.000, 62.67 km]]", + "Rue Emile Vandervelde, Nethen [[2, STREET, 3.000, 64.04 km]]", + "Rue Emile Vandervelde (Nethen), Grez-Doiceau [[2, STREET, 3.000, 64.04 km]]", + "Rue Émile Somville, Grand-Manil [[2, STREET, 3.000, 64.11 km]]", + "Rue Émile Labarre, Ernage [[2, STREET, 3.000, 64.11 km]]", + "Rue Emile Tréfois, Mornimont [[2, STREET, 3.000, 64.86 km]]", + "Rue Emile Tréfois, Jemeppe-sur-Sambre [[2, STREET, 3.000, 64.86 km]]", + "Rue Émile Pirson, Mazy [[2, STREET, 3.000, 65.34 km]]", + "Rue Émile Pirson, Gembloux [[2, STREET, 3.000, 65.34 km]]", + "Rue Emile Wauthy, Dinant [[2, STREET, 3.000, 65.92 km]]", + "Rue Emile Matelart (Saint-Martin), Jemeppe-sur-Sambre [[2, STREET, 3.000, 67.02 km]]", + "Rue Emile Francqui, Corbais [[2, STREET, 3.000, 67.03 km]]", + "Rue Emile Francqui (Corbais), Mont-Saint-Guibert [[2, STREET, 3.000, 67.03 km]]", + "Rue Emile Matelart, Saint-Martin [[2, STREET, 3.000, 67.18 km]]", + "Rue Emile Vandervelde, Ham-sur-Sambre [[2, STREET, 3.000, 67.22 km]]", + "Rue Émile Goes (Biéreau), Louvain-la-Neuve [[2, STREET, 3.000, 67.43 km]]", + "Rue Emile Pirson, Sombreffe [[2, STREET, 3.000, 68.64 km]]", + "Rue Émile Mathéi, Limelette [[2, STREET, 3.000, 70.90 km]]", + "Rue Émile Mathéi, Ottignies-Louvain-la-Neuve [[2, STREET, 3.000, 70.90 km]]", + "Rue Émile Henricot, Court-Saint-Etienne [[2, STREET, 3.000, 70.99 km]]", + "Rue Emile Toussaint, Onhaye [[2, STREET, 3.000, 71.25 km]]", + "Rue Emile Toussaint, Serville [[2, STREET, 3.000, 71.25 km]]", + "Rue Emile Duculot, Sambreville [[2, STREET, 3.000, 72.06 km]]", + "Rue Emile Duculot, Tamines [[2, STREET, 3.000, 72.06 km]]", + "Rue Émile Zola (Keumiée), Sambreville [[2, STREET, 3.000, 72.35 km]]", + "Rue Émile Vandervelde (Ligny), Sombreffe [[2, STREET, 3.000, 72.64 km]]", + "Rue Emile Collard, Onhaye [[2, STREET, 3.000, 73.26 km]]", + "Rue Emile Collard, Anthée [[2, STREET, 3.000, 73.26 km]]", + "Rue Émile Vandervelde (Moignelée), Sambreville [[2, STREET, 3.000, 73.61 km]]", + "Rue Emile Leger, Villers-la-Ville [[2, STREET, 3.000, 74.22 km]]", + "Rue Emile Vandervelde, Fleurus [[2, STREET, 3.000, 74.70 km]]", + "Rue Emile Hautem, Fleurus [[2, STREET, 3.000, 74.81 km]]", + "Rue Emile Hautem, Lambusart [[2, STREET, 3.000, 74.81 km]]", + "rue Emile de Clercq, Mettet [[2, STREET, 3.000, 76.79 km]]", + "Rue Émile Vandervelde (Pironchamps), Farciennes [[2, STREET, 3.000, 77.70 km]]", + "Rue Emile Genard, Gerpinnes [[2, STREET, 3.000, 81.14 km]]", + "Rue Émile Montreuil, Gedinne [[2, STREET, 3.000, 87.18 km]]", + "Rue Émile Montreuil, Rienne [[2, STREET, 3.000, 87.42 km]]", + "Glain Rue Emile Vandervelde [[2, POI, 2.000, 1.81 km]]", + "Rue Emile Vandervelde [[2, POI, 2.000, 2.03 km]]", + "Orp-le-Grand Rue Emile Vandervelde [[2, POI, 2.000, 41.51 km]]", + "Namur Rue Émile Cuvelier [[2, POI, 2.000, 53.85 km]]", + "Soye Rue Émile Lorent 252 [[2, POI, 2.000, 62.77 km]]", + "Soye Rue Émile Lorent 252 [[2, POI, 2.000, 62.81 km]]", + "Rue Émile Pirson [[2, POI, 2.000, 65.74 km]]", + "Fleurus Rue Emile Vandervelde [[2, POI, 2.000, 74.90 km]]" ], "amenities": [ { diff --git a/OsmAnd-java/src/test/resources/search/street_santa_clara.json b/OsmAnd-java/src/test/resources/search/street_santa_clara.json index 48d7643a62..3c5b50324a 100644 --- a/OsmAnd-java/src/test/resources/search/street_santa_clara.json +++ b/OsmAnd-java/src/test/resources/search/street_santa_clara.json @@ -11,29 +11,60 @@ }, "phrase": "santa clara", "results": [ - "Carrer de Santa Clara, Sant Pol de Mar", - "Santa Clara, Sant Pol de Mar", - "Carrer Santa Clara, Sant Pol de Mar", - "Plaça Santa Clara, Santa Coloma de Farners", - "Carrer del Comte de Santa Clara, Barcelona", - "Carrer del Comte de Santa Clara, la Barceloneta", - "Passatge de Santa Clara, Barcelona", - "Passatge de Santa Clara, Barri Gòtic", - "Baixada de Santa Clara, Barcelona", - "Baixada de Santa Clara, Barri Gòtic", - "Carrer de Santa Clara, Girona", - "Plaça de Santa Clara, Vic", - "Carrer de Santa Clara, Poble Nou", - "Carrer de Santa Clara (Poble Nou), Sant Vicenç dels Horts", - "Carrer Vell de Santa Clara, Manresa", - "Carrer Nou de Santa Clara, Centre Històric", - "Carrer Nou de Santa Clara (Les Escodines), Manresa", - "Carrer de Santa Clara, Masquefa", - "Carrer Santa Clara, Castelló d'Empúries", - "Carrer de Santa Clara, Vilafranca del Penedès", - "Carrer de Santa Clara, Castelló d'Empúries", - "Carrer Clara Campoamor, Santa Coloma de Gramenet" + "Carrer de Santa Clara, Sant Pol de Mar [[2, STREET, 3.000, 0.03 km]]", + "Santa Clara, Sant Pol de Mar [[2, STREET, 3.000, 0.06 km]]", + "Carrer Santa Clara, Sant Pol de Mar [[2, STREET, 3.000, 0.12 km]]", + "Plaça Santa Clara, Santa Coloma de Farners [[2, STREET, 3.000, 29.76 km]]", + "Carrer del Comte de Santa Clara, Barcelona [[2, STREET, 3.000, 43.84 km]]", + "Carrer del Comte de Santa Clara, la Barceloneta [[2, STREET, 3.000, 43.84 km]]", + "Passatge de Santa Clara, Barcelona [[2, STREET, 3.000, 44.32 km]]", + "Passatge de Santa Clara, Barri Gòtic [[2, STREET, 3.000, 44.32 km]]", + "Baixada de Santa Clara, Barcelona [[2, STREET, 3.000, 44.33 km]]", + "Baixada de Santa Clara, Barri Gòtic [[2, STREET, 3.000, 44.33 km]]", + "Carrer de Santa Clara, Girona [[2, STREET, 3.000, 45.73 km]]", + "Plaça de Santa Clara, Vic [[2, STREET, 3.000, 47.62 km]]", + "Carrer de Santa Clara, Poble Nou [[2, STREET, 3.000, 56.25 km]]", + "Carrer de Santa Clara (Poble Nou), Sant Vicenç dels Horts [[2, STREET, 3.000, 56.25 km]]", + "Carrer Vell de Santa Clara, Manresa [[2, STREET, 3.000, 66.96 km]]", + "Carrer Nou de Santa Clara, Centre Històric [[2, STREET, 3.000, 67.15 km]]", + "Carrer Nou de Santa Clara (Les Escodines), Manresa [[2, STREET, 3.000, 67.15 km]]", + "Carrer de Santa Clara, Masquefa [[2, STREET, 3.000, 68.25 km]]", + "Carrer Santa Clara, Castelló d'Empúries [[2, STREET, 3.000, 81.65 km]]", + "Carrer de Santa Clara, Vilafranca del Penedès [[2, STREET, 3.000, 81.86 km]]", + "Carrer de Santa Clara, Castelló d'Empúries [[2, STREET, 3.000, 81.93 km]]", + "Santa Clara [[2, POI, 2.000, 7784.16 km]]", + "Santa Clara [[2, POI, 2.000, 30.97 km]]", + "Santa Clara [[2, POI, 2.000, 8583.12 km]]", + "Santa Clara [[2, POI, 2.000, 44.32 km]]", + "Pastisseria Santa Clara [[2, POI, 2.000, 44.34 km]]", + "Escola Santa Clara [[2, POI, 2.000, 44.69 km]]", + "Santa Clara [[2, POI, 2.000, 45.45 km]]", + "L11 - Santa Clara [[2, POI, 2.000, 45.52 km]]", + "Santa Clara [[2, POI, 2.000, 9114.25 km]]", + "CAP SANTA CLARA [[2, POI, 2.000, 45.64 km]]", + "CAP Santa Clara [[2, POI, 2.000, 45.64 km]]", + "L11 - Santa Clara [[2, POI, 2.000, 45.74 km]]", + "Plaça de Santa Clara [[2, POI, 2.000, 47.62 km]]", + "Pl. Santa Clara [[2, POI, 2.000, 47.62 km]]", + "Santa Clara de Olimar [[2, POI, 2.000, 10164.87 km]]", + "Claverol / Santa Clara [[2, POI, 2.000, 56.34 km]]", + "Monestir de Santa Clara [[2, POI, 2.000, 66.71 km]]", + "Santa Clara [[2, POI, 2.000, 66.75 km]]", + "La Sínia de Santa Clara [[2, POI, 2.000, 66.81 km]]", + "Restaurant Santa Clara [[2, POI, 2.000, 69.76 km]]", + "Hostal Santa Clara [[2, POI, 2.000, 69.77 km]]", + "Santa Maria del Castell de Claramunt [[2, POI, 2.000, 79.46 km]]", + "Monestir de Santa Clara [[2, POI, 2.000, 81.26 km]]", + "Santa Clara / Muralla de Sant Magí [[2, POI, 2.000, 81.86 km]]", + "Convent de Santa Clara [[2, POI, 2.000, 82.15 km]]", + "Convent de Santa Clara [[2, POI, 2.000, 137.22 km]]", + "Santa Clara del Mullol [[2, POI, 2.000, 137.89 km]]", + "Plaça de la Mare Santa Clara [[2, POI, 2.000, 166.36 km]]", + "Pujada de Santa Clara [[2, POI, 2.000, 196.30 km]]", + "Carrer Nou de Santa Clara [[2, POI, 2.000, 196.39 km]]", + "Carrer Clara Campoamor, Santa Coloma de Gramenet [[2, STREET, 0.310, 39.00 km]]" ], + "amenities": [ { "name": "Pastisseria Santa Clara", diff --git a/OsmAnd/res/drawable-hdpi/ic_bg_point_circle_top.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_circle_top.png index b615c7f238..d36fb08fe1 100644 Binary files a/OsmAnd/res/drawable-hdpi/ic_bg_point_circle_top.png and b/OsmAnd/res/drawable-hdpi/ic_bg_point_circle_top.png differ diff --git a/OsmAnd/res/drawable-hdpi/ic_bg_point_circle_top_small.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_circle_top_small.png index 2809823cf3..0ef9642381 100644 Binary files a/OsmAnd/res/drawable-hdpi/ic_bg_point_circle_top_small.png and b/OsmAnd/res/drawable-hdpi/ic_bg_point_circle_top_small.png differ diff --git a/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_bottom.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_bottom.png new file mode 100644 index 0000000000..3c9399bf3e Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_bottom.png differ diff --git a/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_bottom_small.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_bottom_small.png new file mode 100644 index 0000000000..f91e3dd324 Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_bottom_small.png differ diff --git a/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_center.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_center.png new file mode 100644 index 0000000000..5129540170 Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_center.png differ diff --git a/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_center_small.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_center_small.png new file mode 100644 index 0000000000..44732ca907 Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_center_small.png differ diff --git a/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_top.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_top.png new file mode 100644 index 0000000000..f968e14194 Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_top.png differ diff --git a/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_top_small.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_top_small.png new file mode 100644 index 0000000000..4ac04f094b Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_top_small.png differ diff --git a/OsmAnd/res/drawable-hdpi/ic_bg_point_octagon_top.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_octagon_top.png index a65fd59720..3b51758a24 100644 Binary files a/OsmAnd/res/drawable-hdpi/ic_bg_point_octagon_top.png and b/OsmAnd/res/drawable-hdpi/ic_bg_point_octagon_top.png differ diff --git a/OsmAnd/res/drawable-hdpi/ic_bg_point_octagon_top_small.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_octagon_top_small.png index 734414193b..323c5981ef 100644 Binary files a/OsmAnd/res/drawable-hdpi/ic_bg_point_octagon_top_small.png and b/OsmAnd/res/drawable-hdpi/ic_bg_point_octagon_top_small.png differ diff --git a/OsmAnd/res/drawable-hdpi/ic_bg_point_square_top.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_square_top.png index f8bbe4588b..76f7ec7ea2 100644 Binary files a/OsmAnd/res/drawable-hdpi/ic_bg_point_square_top.png and b/OsmAnd/res/drawable-hdpi/ic_bg_point_square_top.png differ diff --git a/OsmAnd/res/drawable-hdpi/ic_bg_point_square_top_small.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_square_top_small.png index 9a4a3ccbed..02d6d253d0 100644 Binary files a/OsmAnd/res/drawable-hdpi/ic_bg_point_square_top_small.png and b/OsmAnd/res/drawable-hdpi/ic_bg_point_square_top_small.png differ diff --git a/OsmAnd/res/drawable-hdpi/map_compass.png b/OsmAnd/res/drawable-hdpi/map_compass.png deleted file mode 100644 index e852a4db1d..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_compass.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_compass_bearing.png b/OsmAnd/res/drawable-hdpi/map_compass_bearing.png deleted file mode 100644 index 525fec8476..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_compass_bearing.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_compass_bearing_white.png b/OsmAnd/res/drawable-hdpi/map_compass_bearing_white.png deleted file mode 100644 index dff3bbb54a..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_compass_bearing_white.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_compass_niu.png b/OsmAnd/res/drawable-hdpi/map_compass_niu.png deleted file mode 100644 index 3ae3157990..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_compass_niu.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_compass_niu_white.png b/OsmAnd/res/drawable-hdpi/map_compass_niu_white.png deleted file mode 100644 index 6f91322c2a..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_compass_niu_white.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_compass_white.png b/OsmAnd/res/drawable-hdpi/map_compass_white.png deleted file mode 100644 index 347709b624..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_compass_white.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/ic_bg_point_circle_top.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_circle_top.png index cb5600c796..60a7749e57 100644 Binary files a/OsmAnd/res/drawable-mdpi/ic_bg_point_circle_top.png and b/OsmAnd/res/drawable-mdpi/ic_bg_point_circle_top.png differ diff --git a/OsmAnd/res/drawable-mdpi/ic_bg_point_circle_top_small.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_circle_top_small.png index bde62f99ea..67b6398406 100644 Binary files a/OsmAnd/res/drawable-mdpi/ic_bg_point_circle_top_small.png and b/OsmAnd/res/drawable-mdpi/ic_bg_point_circle_top_small.png differ diff --git a/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_bottom.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_bottom.png new file mode 100644 index 0000000000..96a5ef7fa7 Binary files /dev/null and b/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_bottom.png differ diff --git a/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_bottom_small.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_bottom_small.png new file mode 100644 index 0000000000..5d61d42fea Binary files /dev/null and b/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_bottom_small.png differ diff --git a/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_center.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_center.png new file mode 100644 index 0000000000..df0bbaddfe Binary files /dev/null and b/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_center.png differ diff --git a/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_center_small.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_center_small.png new file mode 100644 index 0000000000..b916e0e73a Binary files /dev/null and b/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_center_small.png differ diff --git a/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_top.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_top.png new file mode 100644 index 0000000000..f52f622e9c Binary files /dev/null and b/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_top.png differ diff --git a/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_top_small.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_top_small.png new file mode 100644 index 0000000000..a268192785 Binary files /dev/null and b/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_top_small.png differ diff --git a/OsmAnd/res/drawable-mdpi/ic_bg_point_octagon_top.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_octagon_top.png index f99116ef61..2a673dc01e 100644 Binary files a/OsmAnd/res/drawable-mdpi/ic_bg_point_octagon_top.png and b/OsmAnd/res/drawable-mdpi/ic_bg_point_octagon_top.png differ diff --git a/OsmAnd/res/drawable-mdpi/ic_bg_point_octagon_top_small.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_octagon_top_small.png index 421431696b..30b1a327de 100644 Binary files a/OsmAnd/res/drawable-mdpi/ic_bg_point_octagon_top_small.png and b/OsmAnd/res/drawable-mdpi/ic_bg_point_octagon_top_small.png differ diff --git a/OsmAnd/res/drawable-mdpi/ic_bg_point_square_top.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_square_top.png index e93346d3d3..ee2ce66822 100644 Binary files a/OsmAnd/res/drawable-mdpi/ic_bg_point_square_top.png and b/OsmAnd/res/drawable-mdpi/ic_bg_point_square_top.png differ diff --git a/OsmAnd/res/drawable-mdpi/ic_bg_point_square_top_small.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_square_top_small.png index 71ea46aee0..9f7a960cad 100644 Binary files a/OsmAnd/res/drawable-mdpi/ic_bg_point_square_top_small.png and b/OsmAnd/res/drawable-mdpi/ic_bg_point_square_top_small.png differ diff --git a/OsmAnd/res/drawable-mdpi/map_compass.png b/OsmAnd/res/drawable-mdpi/map_compass.png deleted file mode 100644 index 82ee8e66f6..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_compass.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_compass_bearing.png b/OsmAnd/res/drawable-mdpi/map_compass_bearing.png deleted file mode 100644 index 4617da83fa..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_compass_bearing.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_compass_bearing_white.png b/OsmAnd/res/drawable-mdpi/map_compass_bearing_white.png deleted file mode 100644 index 680be485dd..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_compass_bearing_white.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_compass_niu.png b/OsmAnd/res/drawable-mdpi/map_compass_niu.png deleted file mode 100644 index 5207161498..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_compass_niu.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_compass_niu_white.png b/OsmAnd/res/drawable-mdpi/map_compass_niu_white.png deleted file mode 100644 index e88b091f95..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_compass_niu_white.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_compass_white.png b/OsmAnd/res/drawable-mdpi/map_compass_white.png deleted file mode 100644 index c7adab646f..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_compass_white.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/ic_bg_point_circle_top.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_circle_top.png index b5eb13fbe8..12dbd1759c 100644 Binary files a/OsmAnd/res/drawable-xhdpi/ic_bg_point_circle_top.png and b/OsmAnd/res/drawable-xhdpi/ic_bg_point_circle_top.png differ diff --git a/OsmAnd/res/drawable-xhdpi/ic_bg_point_circle_top_small.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_circle_top_small.png index 924a6c0f0d..2602b8b38d 100644 Binary files a/OsmAnd/res/drawable-xhdpi/ic_bg_point_circle_top_small.png and b/OsmAnd/res/drawable-xhdpi/ic_bg_point_circle_top_small.png differ diff --git a/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_bottom.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_bottom.png new file mode 100644 index 0000000000..d57b33db0b Binary files /dev/null and b/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_bottom.png differ diff --git a/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_bottom_small.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_bottom_small.png new file mode 100644 index 0000000000..752c7bbca5 Binary files /dev/null and b/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_bottom_small.png differ diff --git a/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_center.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_center.png new file mode 100644 index 0000000000..77d10f16e8 Binary files /dev/null and b/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_center.png differ diff --git a/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_center_small.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_center_small.png new file mode 100644 index 0000000000..a69d014d6d Binary files /dev/null and b/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_center_small.png differ diff --git a/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_top.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_top.png new file mode 100644 index 0000000000..e5ed5773ce Binary files /dev/null and b/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_top.png differ diff --git a/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_top_small.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_top_small.png new file mode 100644 index 0000000000..1db52d031d Binary files /dev/null and b/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_top_small.png differ diff --git a/OsmAnd/res/drawable-xhdpi/ic_bg_point_octagon_top.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_octagon_top.png index 9d42a43c6e..c15422ecb1 100644 Binary files a/OsmAnd/res/drawable-xhdpi/ic_bg_point_octagon_top.png and b/OsmAnd/res/drawable-xhdpi/ic_bg_point_octagon_top.png differ diff --git a/OsmAnd/res/drawable-xhdpi/ic_bg_point_octagon_top_small.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_octagon_top_small.png index 673a722517..229b918d75 100644 Binary files a/OsmAnd/res/drawable-xhdpi/ic_bg_point_octagon_top_small.png and b/OsmAnd/res/drawable-xhdpi/ic_bg_point_octagon_top_small.png differ diff --git a/OsmAnd/res/drawable-xhdpi/ic_bg_point_square_top.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_square_top.png index 19c2217e26..052388a276 100644 Binary files a/OsmAnd/res/drawable-xhdpi/ic_bg_point_square_top.png and b/OsmAnd/res/drawable-xhdpi/ic_bg_point_square_top.png differ diff --git a/OsmAnd/res/drawable-xhdpi/ic_bg_point_square_top_small.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_square_top_small.png index 2bfbf6896e..422129d4f5 100644 Binary files a/OsmAnd/res/drawable-xhdpi/ic_bg_point_square_top_small.png and b/OsmAnd/res/drawable-xhdpi/ic_bg_point_square_top_small.png differ diff --git a/OsmAnd/res/drawable-xhdpi/map_compass.png b/OsmAnd/res/drawable-xhdpi/map_compass.png deleted file mode 100644 index d953bc4d09..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_compass.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_compass_bearing.png b/OsmAnd/res/drawable-xhdpi/map_compass_bearing.png deleted file mode 100644 index ef302192a3..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_compass_bearing.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_compass_bearing_white.png b/OsmAnd/res/drawable-xhdpi/map_compass_bearing_white.png deleted file mode 100644 index d8d2dd9fa7..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_compass_bearing_white.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_compass_niu.png b/OsmAnd/res/drawable-xhdpi/map_compass_niu.png deleted file mode 100644 index 05f8351357..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_compass_niu.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_compass_niu_white.png b/OsmAnd/res/drawable-xhdpi/map_compass_niu_white.png deleted file mode 100644 index b77d248b8e..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_compass_niu_white.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_compass_white.png b/OsmAnd/res/drawable-xhdpi/map_compass_white.png deleted file mode 100644 index 63c1221700..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_compass_white.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_circle_top.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_circle_top.png index fe261a17ca..20f5771f6f 100644 Binary files a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_circle_top.png and b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_circle_top.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_circle_top_small.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_circle_top_small.png index 985bfa329e..0d2ec3b548 100644 Binary files a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_circle_top_small.png and b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_circle_top_small.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_bottom.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_bottom.png new file mode 100644 index 0000000000..daf34de9d8 Binary files /dev/null and b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_bottom.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_bottom_small.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_bottom_small.png new file mode 100644 index 0000000000..5736f0c108 Binary files /dev/null and b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_bottom_small.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_center.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_center.png new file mode 100644 index 0000000000..296e09de63 Binary files /dev/null and b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_center.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_center_small.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_center_small.png new file mode 100644 index 0000000000..a17ea9bdef Binary files /dev/null and b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_center_small.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_top.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_top.png new file mode 100644 index 0000000000..0c5f7b291e Binary files /dev/null and b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_top.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_top_small.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_top_small.png new file mode 100644 index 0000000000..ba93ed3bf4 Binary files /dev/null and b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_top_small.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_octagon_top.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_octagon_top.png index 1a99ecac96..afe65a2748 100644 Binary files a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_octagon_top.png and b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_octagon_top.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_octagon_top_small.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_octagon_top_small.png index 61387a7e84..4c0e82c247 100644 Binary files a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_octagon_top_small.png and b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_octagon_top_small.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_square_top.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_square_top.png index 89f3c26163..167d461b1d 100644 Binary files a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_square_top.png and b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_square_top.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_square_top_small.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_square_top_small.png index c291eef12e..23649eb031 100644 Binary files a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_square_top_small.png and b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_square_top_small.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_compass.png b/OsmAnd/res/drawable-xxhdpi/map_compass.png deleted file mode 100644 index f6ab0bcc4f..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_compass.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_compass_bearing.png b/OsmAnd/res/drawable-xxhdpi/map_compass_bearing.png deleted file mode 100644 index 639449d194..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_compass_bearing.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_compass_bearing_white.png b/OsmAnd/res/drawable-xxhdpi/map_compass_bearing_white.png deleted file mode 100644 index ec3ad49afd..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_compass_bearing_white.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_compass_niu.png b/OsmAnd/res/drawable-xxhdpi/map_compass_niu.png deleted file mode 100644 index 1e039c7f47..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_compass_niu.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_compass_niu_white.png b/OsmAnd/res/drawable-xxhdpi/map_compass_niu_white.png deleted file mode 100644 index e1452ce13f..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_compass_niu_white.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_compass_white.png b/OsmAnd/res/drawable-xxhdpi/map_compass_white.png deleted file mode 100644 index b10a7c7aea..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_compass_white.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_circle_top.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_circle_top.png index f8ac0e7d5f..6202ce2692 100644 Binary files a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_circle_top.png and b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_circle_top.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_circle_top_small.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_circle_top_small.png index 0180214981..07ee7683af 100644 Binary files a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_circle_top_small.png and b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_circle_top_small.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_bottom.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_bottom.png new file mode 100644 index 0000000000..0823b74a20 Binary files /dev/null and b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_bottom.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_bottom_small.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_bottom_small.png new file mode 100644 index 0000000000..95b7cf6d4a Binary files /dev/null and b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_bottom_small.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_center.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_center.png new file mode 100644 index 0000000000..a4734e15d3 Binary files /dev/null and b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_center.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_center_small.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_center_small.png new file mode 100644 index 0000000000..bae7db9bc6 Binary files /dev/null and b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_center_small.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_top.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_top.png new file mode 100644 index 0000000000..63fa61faa6 Binary files /dev/null and b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_top.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_top_small.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_top_small.png new file mode 100644 index 0000000000..3b31a920b8 Binary files /dev/null and b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_top_small.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_octagon_top.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_octagon_top.png index ac7c4f2b2a..ca446bd684 100644 Binary files a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_octagon_top.png and b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_octagon_top.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_octagon_top_small.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_octagon_top_small.png index 7a26915c60..1818905ac0 100644 Binary files a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_octagon_top_small.png and b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_octagon_top_small.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_square_top.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_square_top.png index 4e4941781d..03e8bb2f12 100644 Binary files a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_square_top.png and b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_square_top.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_square_top_small.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_square_top_small.png index 5f8a6d7cc7..4638a93611 100644 Binary files a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_square_top_small.png and b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_square_top_small.png differ diff --git a/OsmAnd/res/drawable/ic_action_add.xml b/OsmAnd/res/drawable/ic_action_add.xml index a78016c8bf..7794767cf2 100644 --- a/OsmAnd/res/drawable/ic_action_add.xml +++ b/OsmAnd/res/drawable/ic_action_add.xml @@ -4,7 +4,7 @@ android:viewportWidth="24" android:viewportHeight="24"> + android:pathData="M8.2929,8.2929C8.6834,7.9024 9.3166,7.9024 9.7071,8.2929L12,10.5858L14.2929,8.2929C14.6834,7.9024 15.3166,7.9024 15.7071,8.2929C16.0976,8.6834 16.0976,9.3166 15.7071,9.7071L13.4142,12L15.7071,14.2929C16.0976,14.6834 16.0976,15.3166 15.7071,15.7071C15.3166,16.0976 14.6834,16.0976 14.2929,15.7071L12,13.4142L9.7071,15.7071C9.3166,16.0976 8.6834,16.0976 8.2929,15.7071C7.9024,15.3166 7.9024,14.6834 8.2929,14.2929L10.5858,12L8.2929,9.7071C7.9024,9.3166 7.9024,8.6834 8.2929,8.2929Z" + android:fillColor="#ffffff" + android:fillType="evenOdd"/> diff --git a/OsmAnd/res/drawable/ic_action_delete_item.xml b/OsmAnd/res/drawable/ic_action_delete_item.xml new file mode 100644 index 0000000000..7ef403c609 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_delete_item.xml @@ -0,0 +1,18 @@ + + + + + diff --git a/OsmAnd/res/drawable/ic_action_remove.xml b/OsmAnd/res/drawable/ic_action_remove.xml index 47ec79b234..c12e46d25f 100644 --- a/OsmAnd/res/drawable/ic_action_remove.xml +++ b/OsmAnd/res/drawable/ic_action_remove.xml @@ -4,7 +4,7 @@ android:viewportWidth="24" android:viewportHeight="24"> + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/bottom_sheet_item_edit_with_recyclerview.xml b/OsmAnd/res/layout/bottom_sheet_item_edit_with_recyclerview.xml new file mode 100644 index 0000000000..53ada3c475 --- /dev/null +++ b/OsmAnd/res/layout/bottom_sheet_item_edit_with_recyclerview.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OsmAnd/res/layout/global_preferences_toolbar_with_switch.xml b/OsmAnd/res/layout/global_preferences_toolbar_with_switch.xml index ae100060b2..413ee0d87d 100644 --- a/OsmAnd/res/layout/global_preferences_toolbar_with_switch.xml +++ b/OsmAnd/res/layout/global_preferences_toolbar_with_switch.xml @@ -36,18 +36,42 @@ + + + + + + diff --git a/OsmAnd/res/layout/point_editor_fragment_new.xml b/OsmAnd/res/layout/point_editor_fragment_new.xml index 2e590da39a..972d6bbb5f 100644 --- a/OsmAnd/res/layout/point_editor_fragment_new.xml +++ b/OsmAnd/res/layout/point_editor_fragment_new.xml @@ -75,7 +75,7 @@ android:layout_height="wrap_content" android:layout_weight="1" android:hint="@string/shared_string_name" - app:boxBackgroundColor="@color/input_layout_bg_color"> + app:boxBackgroundColor="@color/material_text_input_layout_bg"> + app:boxBackgroundColor="@color/material_text_input_layout_bg"> + android:layout_marginLeft="@dimen/content_padding" + android:layout_marginStart="@dimen/content_padding" + android:orientation="vertical"> - + + + android:layout_height="1dp" + android:visibility="gone" + android:background="?attr/dashboard_divider" /> diff --git a/OsmAnd/res/layout/quick_action_add_dialog.xml b/OsmAnd/res/layout/quick_action_add_dialog.xml deleted file mode 100644 index 69d9436aba..0000000000 --- a/OsmAnd/res/layout/quick_action_add_dialog.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - -