From 3c9d940fbbb0be194b3f06d75e4151ab8a0b9913 Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Thu, 4 Jun 2020 14:47:59 +0200 Subject: [PATCH] Fix spring street --- .../osmand/search/core/SearchCoreFactory.java | 57 ++- .../net/osmand/search/core/SearchPhrase.java | 42 +-- .../net/osmand/search/core/SearchResult.java | 2 +- .../test/resources/search/spring_street.json | 324 +++++++++--------- 4 files changed, 234 insertions(+), 191 deletions(-) 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 2b9a6437e8..78eee8a6f5 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 @@ -141,18 +141,51 @@ public class SearchCoreFactory { protected void subSearchApiOrPublish(SearchPhrase phrase, SearchResultMatcher resultMatcher, SearchResult res, SearchBaseAPI api) throws IOException { phrase.countUnknownWordsMatchMainResult(res); - // TODO select word & delete found words - List ws = phrase.getUnknownSearchWords(res.otherWordsMatch); - if (!res.firstUnknownWordMatches) { - ws.add(phrase.getFirstUnknownSearchWord()); + 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 = cityResult.firstUnknownWordMatches; + if (cityResult.firstUnknownWordMatches) { + firstUnknownWordMatches = true; + } + if (cityResult.otherWordsMatch != null) { + match = match || leftUnknownSearchWords.removeAll(cityResult.otherWordsMatch); + } + 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); } } @@ -452,10 +485,6 @@ public class SearchCoreFactory { r.searchAddressDataByName(req); for (SearchResult res : immediateResults) { 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), 0); subSearchApiOrPublish(phrase, resultMatcher, res, streetsApi); } else { subSearchApiOrPublish(phrase, resultMatcher, res, cityApi); @@ -852,7 +881,7 @@ public class SearchCoreFactory { int mwords = phrase.countWords(foundName) ; if (csm.matches(phrase.getUnknownSearchPhrase()) && countExtraWords < mwords) { countExtraWords = phrase.countWords(foundName); - List otherSearchWords = phrase.getUnknownSearchWords(null); + List otherSearchWords = phrase.getUnknownSearchWords(); nameFilter = null; if (countExtraWords - 1 < otherSearchWords.size()) { nameFilter = ""; 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 83958f46a6..e9d34bd255 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 @@ -41,9 +41,11 @@ public class SearchPhrase { // 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 List words = new ArrayList<>(); private String firstUnknownSearchWord = ""; private List otherUnknownWords = new ArrayList<>(); private boolean lastUnknownSearchWordComplete; @@ -306,17 +308,8 @@ public class SearchPhrase { return otherUnknownWords.size() > 0; } - public List getUnknownSearchWords(Collection exclude) { - if(exclude == null || otherUnknownWords.size() == 0 || exclude.size() == 0) { - return otherUnknownWords; - } - List l = new ArrayList<>(); - for(String uw : otherUnknownWords) { - if(exclude == null || !exclude.contains(uw)) { - l.add(uw); - } - } - return l; + public List getUnknownSearchWords() { + return otherUnknownWords; } @@ -752,20 +745,21 @@ public class SearchPhrase { } - public void countUnknownWordsMatchMainResult(SearchResult sr) { - countUnknownWordsMatch(sr, sr.localeName, sr.otherNames, 0); + public int countUnknownWordsMatchMainResult(SearchResult sr) { + return countUnknownWordsMatch(sr, sr.localeName, sr.otherNames, 0); } - public void countUnknownWordsMatchMainResult(SearchResult sr, int startsWith) { - countUnknownWordsMatch(sr, sr.localeName, sr.otherNames, startsWith); + public int countUnknownWordsMatchMainResult(SearchResult sr, int amountMatchingWords) { + return countUnknownWordsMatch(sr, sr.localeName, sr.otherNames, amountMatchingWords); } - public void countUnknownWordsMatch(SearchResult sr, String localeName, Collection otherNames, int startWith) { + 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 < startWith - 1) { + if (i < amountMatchingWords - 1) { match = true; } else { NameStringMatcher ms = getUnknownNameStringMatcher(i); @@ -778,17 +772,23 @@ public class SearchPhrase { sr.otherWordsMatch = new TreeSet<>(); } sr.otherWordsMatch.add(otherUnknownWords.get(i)); + r++; } } } - if (startWith > 0) { + if (amountMatchingWords > 0) { sr.firstUnknownWordMatches = true; + r++; } else { - sr.firstUnknownWordMatches = localeName.equals(getFirstUnknownSearchWord()) + boolean match = localeName.equals(getFirstUnknownSearchWord()) || getFirstUnknownNameStringMatcher().matches(localeName) || getFirstUnknownNameStringMatcher().matches(otherNames); + if(match) { + r++; + } + sr.firstUnknownWordMatches = match || sr.firstUnknownWordMatches; } - + return r; } 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 b93a4f640b..028b3706bb 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 @@ -20,7 +20,7 @@ public class SearchResult { // internal package fields (used for sorting) public SearchResult parentSearchResult; String wordsSpan ; - boolean firstUnknownWordMatches = true; + boolean firstUnknownWordMatches; Collection otherWordsMatch = null; diff --git a/OsmAnd-java/src/test/resources/search/spring_street.json b/OsmAnd-java/src/test/resources/search/spring_street.json index b8f10d139a..a5dfdc530c 100644 --- a/OsmAnd-java/src/test/resources/search/spring_street.json +++ b/OsmAnd-java/src/test/resources/search/spring_street.json @@ -11,161 +11,175 @@ }, "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 (Spring / Natural) [[1, POI_TYPE, 1.000, 0.00 km]]", + "Spring (Ice rink / Sport) [[1, POI_TYPE, 1.000, 0.00 km]]", + "Spring (Bridge / Transport construction) [[1, POI_TYPE, 1.000, 0.00 km]]", + "Spring Street, Cold Spring Harbor [[3, STREET, 0.310, 56.10 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, 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]]", + "Cold Spring, Cold Spring [[2, STREET, 0.310, 34.42 km]]", + "Spring Hill Road, Cold Spring Harbor [[2, STREET, 0.310, 55.96 km]]", + "Spring, Cold Spring Harbor [[2, STREET, 0.310, 56.22 km]]", + "Spring Road, Cold Spring Harbor [[2, STREET, 0.310, 56.79 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": [ {