reimplement search postal_code (now it is similar to specify city)

git-svn-id: https://osmand.googlecode.com/svn/trunk@178 e29c36b1-1cfa-d876-8d93-3434fc2bb7b8
This commit is contained in:
Victor Shcherb 2010-06-19 21:39:03 +00:00
parent f23475ad1b
commit 38831b822a
17 changed files with 301 additions and 160 deletions

View file

@ -24,15 +24,19 @@ public class ToDoConstants {
// TODO ANDROID // TODO ANDROID
// 31. Translation. // 31. Translation.
// DONE : partially olga // DONE : partially olga
// TODO : everywhere put non-nls, check all translated into russian [swing could not be translated] // TODO : everywhere put non-nls, check all translated into russian [swing could not be translated]
// 34. Suppport navigation for calculated route (example of get route from internet is in swing app).
// DONE : MiniMap done, Routing settings done, RouteLayer done, RoutingHelper done.
// TODO : Test again?
// 37. Get rid of exit button (!). Think about when notification should go & how clear resources if it is necessary
// DONE :
// TODO : add to app settings preference (Refresh indexes).
// 42. Revise UI (icons/layouts). Support different devices. Add inactive/focus(!) icon versions. // 42. Revise UI (icons/layouts). Support different devices. Add inactive/focus(!) icon versions.
// Some icons are not fine (as back menu from map - it is blured). // Some icons are not fine (as back menu from map - it is blured).
// 37. Get rid of exit button (!). Think about when notification should go & how clear resources if it is necessary
// DONE :
// TODO : add to app settings preference (Refresh indexes).
// 32. Introduce POI predefined filters (car filter(other-fuel, transportation-car_wash, show-car) and others) // 32. Introduce POI predefined filters (car filter(other-fuel, transportation-car_wash, show-car) and others)
// DONE : back end (POI filter object, save, delete, read) // DONE : back end (POI filter object, save, delete, read)
// TODO : activity to create/edit new index, activity to read both user defined/osm standard, add actions to remove/create // TODO : activity to create/edit new index, activity to read both user defined/osm standard, add actions to remove/create
@ -42,9 +46,6 @@ public class ToDoConstants {
// DONE: Load transport routes in swing. // DONE: Load transport routes in swing.
// TODO: Create transport index, create transport activity // TODO: Create transport index, create transport activity
// 34. Suppport navigation for calculated route (example of get route from internet is in swing app).
// DONE : MiniMap done, Routing settings done, RouteLayer done, RoutingHelper done.
// TODO : Test again?
// FUTURE RELEASES // FUTURE RELEASES
@ -56,16 +57,16 @@ public class ToDoConstants {
// (would you like to use internet for that operation - if using internet is not checked). // (would you like to use internet for that operation - if using internet is not checked).
// Internet using now for : edit POI osm, show osm bugs layer, download tiles. // Internet using now for : edit POI osm, show osm bugs layer, download tiles.
// 47. Internet connectivity could be checked before trying to use // 47. Internet connectivity could be checked before trying to use
// 48. Implement console application that prepare indexes to upload on server...
// 0) run in background 1) download from internet 2) generates indices for Europe (take care about memory) 3) upload?
// 46. Implement downloading strategy for tiles (do not load 17 zoom, load only 16 for example) - try to scale 15 zoom for 17 (?) // 46. Implement downloading strategy for tiles (do not load 17 zoom, load only 16 for example) - try to scale 15 zoom for 17 (?)
// 40. Support simple vector road rendering (require new index file) (?) // 40. Support simple vector road rendering (require new index file) (?)
// 26. Show the whole street on map (when it is chosen in search activity). Possibly extend that story to show layer with streets. (?) // 26. Show the whole street on map (when it is chosen in search activity). Possibly extend that story to show layer with streets. (?)
// BUGS Android // BUGS Android
// 6. Improvement postal_code search : replace search city <-> postal_code (show streets for postal_code)
// 5. Improvement : Implement caching files existing on FS, implement specific method in RM // 5. Improvement : Implement caching files existing on FS, implement specific method in RM
// Introducing cache of file names that are on disk (creating new File() consumes a lot of memory) // Introducing cache of file names that are on disk (creating new File() consumes a lot of memory)
// 7. Update map is duplicated in target & in update menu (context menu)
// TODO swing // TODO swing

View file

@ -3,9 +3,7 @@ package com.osmand.data;
import java.text.Collator; import java.text.Collator;
import java.util.Collection; import java.util.Collection;
import java.util.Map; import java.util.Map;
import java.util.SortedSet;
import java.util.TreeMap; import java.util.TreeMap;
import java.util.TreeSet;
import com.osmand.Algoritms; import com.osmand.Algoritms;
import com.osmand.osm.Entity; import com.osmand.osm.Entity;
@ -48,7 +46,6 @@ public class City extends MapObject {
private CityType type = null; private CityType type = null;
// Be attentive ! Working with street names ignoring case // Be attentive ! Working with street names ignoring case
private Map<String, Street> streets = new TreeMap<String, Street>(Collator.getInstance()); private Map<String, Street> streets = new TreeMap<String, Street>(Collator.getInstance());
private SortedSet<String> postcodes = new TreeSet<String>();
public City(Node el){ public City(Node el){
super(el); super(el);
@ -99,15 +96,11 @@ public class City extends MapObject {
return registerStreet(street, false); return registerStreet(street, false);
} }
public Street registerBuilding(Entity e){ public Building registerBuilding(Entity e){
String number = e.getTag(OSMTagKey.ADDR_HOUSE_NUMBER); String number = e.getTag(OSMTagKey.ADDR_HOUSE_NUMBER);
String street = e.getTag(OSMTagKey.ADDR_STREET); String street = e.getTag(OSMTagKey.ADDR_STREET);
if( street != null && number != null){ if( street != null && number != null){
Building building = registerStreet(street).registerBuilding(e); return registerStreet(street).registerBuilding(e);
if (building.getPostcode() != null) {
postcodes.add(building.getPostcode());
}
return streets.get(street.toLowerCase());
} }
return null; return null;
} }

View file

@ -0,0 +1,35 @@
package com.osmand.data;
import java.text.Collator;
import java.util.Collection;
import java.util.Map;
import java.util.TreeMap;
public class PostCode extends MapObject {
private Map<String, Street> streets = new TreeMap<String, Street>(Collator.getInstance());
public PostCode(String name){
setName(name);
setEnName(name);
setId(-1L);
}
public boolean isEmptyWithStreets(){
return streets.isEmpty();
}
public Street getStreet(String name){
return streets.get(name);
}
public Collection<Street> getStreets() {
return streets.values();
}
public Street registerStreet(Street street, boolean useEnglishNames){
String name = street.getName(useEnglishNames);
streets.put(name, street);
return street;
}
}

View file

@ -1,14 +0,0 @@
package com.osmand.data;
public class PostcodeBasedStreet extends Street {
public PostcodeBasedStreet(City city, String postcode) {
super(city, postcode);
}
@Override
public Long getId() {
return -1l;
}
}

View file

@ -63,7 +63,7 @@ public class Street extends MapObject {
} }
public boolean isRegisteredInCity(){ public boolean isRegisteredInCity(){
return city.getStreet(getName()) == this; return city != null && city.getStreet(getName()) == this;
} }
@Override @Override
@ -71,7 +71,7 @@ public class Street extends MapObject {
if (name.equals(getName())) { if (name.equals(getName())) {
return; return;
} }
if (city.getStreet(getName()) == this) { if (city != null && city.getStreet(getName()) == this) {
city.unregisterStreet(getName()); city.unregisterStreet(getName());
super.setName(name); super.setName(name);
Street s = city.registerStreet(this); Street s = city.registerStreet(this);
@ -92,8 +92,8 @@ public class Street extends MapObject {
public City getCity() { public City getCity() {
return city; return city;
} }
public void doDataPreparation() { public void sortBuildings(){
Collections.sort(buildings, new Comparator<Building>(){ Collections.sort(buildings, new Comparator<Building>(){
@Override @Override
public int compare(Building o1, Building o2) { public int compare(Building o1, Building o2) {
@ -102,6 +102,10 @@ public class Street extends MapObject {
return i1 - i2; return i1 - i2;
} }
}); });
}
public void doDataPreparation() {
sortBuildings();
calculateCenter(); calculateCenter();
if(location == null){ if(location == null){
List<LatLon> nodes = new ArrayList<LatLon>(); List<LatLon> nodes = new ArrayList<LatLon>();

View file

@ -115,24 +115,39 @@ public class DataExtraction {
protected class DataExtractionOsmFilter implements IOsmStorageFilter { protected class DataExtractionOsmFilter implements IOsmStorageFilter {
final ArrayList<Node> places; ArrayList<Node> places = new ArrayList<Node>();
final ArrayList<Entity> buildings; ArrayList<Entity> buildings = new ArrayList<Entity>();
final ArrayList<Entity> amenities; ArrayList<Entity> amenities = new ArrayList<Entity>();
final ArrayList<Way> ways; ArrayList<Way> ways = new ArrayList<Way>();
final ArrayList<Relation> transport; ArrayList<Relation> transport = new ArrayList<Relation>();
Map<Long, String> postalCodes = new LinkedHashMap<Long, String>();
int currentCount = 0; int currentCount = 0;
private Connection conn; private Connection conn;
private PreparedStatement prep; private PreparedStatement prep;
public DataExtractionOsmFilter(ArrayList<Entity> amenities, ArrayList<Entity> buildings, ArrayList<Node> places, public DataExtractionOsmFilter() {
ArrayList<Way> ways, ArrayList<Relation> transport) { }
this.amenities = amenities;
this.buildings = buildings; public ArrayList<Node> getPlaces() {
this.places = places; return places;
this.ways = ways; }
this.transport = transport; public ArrayList<Entity> getBuildings() {
return buildings;
}
public ArrayList<Entity> getAmenities() {
return amenities;
}
public ArrayList<Way> getWays() {
return ways;
}
public ArrayList<Relation> getTransport() {
return transport;
}
public Map<Long, String> getPostalCodes() {
return postalCodes;
} }
public void initDatabase() throws SQLException { public void initDatabase() throws SQLException {
@ -232,6 +247,15 @@ public class DataExtraction {
ways.add((Way) e); ways.add((Way) e);
processed = true; processed = true;
} }
if(e instanceof Relation){
if(e.getTag(OSMTagKey.POSTAL_CODE) != null){
String tag = e.getTag(OSMTagKey.POSTAL_CODE);
for(Long l : ((Relation)e).getMemberIds()){
postalCodes.put(l, tag);
}
}
// do not need to mark processed
}
} }
if(indexTransport){ if(indexTransport){
if(e instanceof Relation && e.getTag(OSMTagKey.ROUTE) != null){ if(e instanceof Relation && e.getTag(OSMTagKey.ROUTE) != null){
@ -314,12 +338,7 @@ public class DataExtraction {
public Region readCountry(String path, IProgress progress, IOsmStorageFilter addFilter) throws IOException, SAXException, SQLException{ public Region readCountry(String path, IProgress progress, IOsmStorageFilter addFilter) throws IOException, SAXException, SQLException{
// data to load & index
final ArrayList<Node> places = new ArrayList<Node>();
final ArrayList<Entity> buildings = new ArrayList<Entity>();
final ArrayList<Entity> amenities = new ArrayList<Entity>();
final ArrayList<Way> ways = new ArrayList<Way>();
final ArrayList<Relation> transport = new ArrayList<Relation>();
File f = new File(path); File f = new File(path);
InputStream stream = new FileInputStream(f); InputStream stream = new FileInputStream(f);
@ -342,7 +361,14 @@ public class DataExtraction {
storage.getFilters().add(addFilter); storage.getFilters().add(addFilter);
} }
DataExtractionOsmFilter filter = new DataExtractionOsmFilter(amenities, buildings, places, ways, transport); DataExtractionOsmFilter filter = new DataExtractionOsmFilter();
// data to load & index
final ArrayList<Node> places = filter.getPlaces();
final ArrayList<Entity> buildings = filter.getBuildings();
final ArrayList<Entity> amenities = filter.getAmenities();
final ArrayList<Way> ways = filter.getWays();
final ArrayList<Relation> transport = filter.getTransport();
Map<Long, String> postalCodes = filter.getPostalCodes();
storage.getFilters().add(filter); storage.getFilters().add(filter);
// 0. Loading osm file // 0. Loading osm file
try { try {
@ -393,7 +419,7 @@ public class DataExtraction {
// 5. reading buildings // 5. reading buildings
progress.setGeneralProgress("[95 of 100]"); progress.setGeneralProgress("[95 of 100]");
readingBuildings(progress, buildings, country); readingBuildings(progress, buildings, country, postalCodes);
} }
progress.setGeneralProgress("[100 of 100]"); progress.setGeneralProgress("[100 of 100]");
@ -451,7 +477,7 @@ public class DataExtraction {
} }
private void readingBuildings(IProgress progress, final ArrayList<Entity> buildings, Region country) { private void readingBuildings(IProgress progress, final ArrayList<Entity> buildings, Region country, Map<Long, String> postalCodes) {
// found buildings (index addresses) // found buildings (index addresses)
progress.startTask("Indexing buildings...", buildings.size()); progress.startTask("Indexing buildings...", buildings.size());
for(Entity b : buildings){ for(Entity b : buildings){
@ -470,7 +496,10 @@ public class DataExtraction {
city = country.getClosestCity(center); city = country.getClosestCity(center);
} }
if (city != null) { if (city != null) {
city.registerBuilding(b); Building building = city.registerBuilding(b);
if(postalCodes.containsKey(building.getId()) ){
building.setPostcode(postalCodes.get(building.getId()));
}
} }
} }
} }
@ -664,12 +693,6 @@ public class DataExtraction {
// Performance testing methods // Performance testing methods
public static void main(String[] args) throws IOException, SAXException, SQLException, ParserConfigurationException { public static void main(String[] args) throws IOException, SAXException, SQLException, ParserConfigurationException {
ArrayList<Entity> amenities = new ArrayList<Entity>();
ArrayList<Entity> buildings = new ArrayList<Entity>();
ArrayList<Node> places = new ArrayList<Node>();
ArrayList<Relation> transport = new ArrayList<Relation>();
ArrayList<Way> ways = new ArrayList<Way>();
long time = System.currentTimeMillis(); long time = System.currentTimeMillis();
OsmBaseStorage storage = new OsmBaseStorage(); OsmBaseStorage storage = new OsmBaseStorage();
String path = "E:\\Information\\OSM maps\\belarus_2010_06_02.osm"; String path = "E:\\Information\\OSM maps\\belarus_2010_06_02.osm";
@ -704,7 +727,7 @@ public class DataExtraction {
}); });
DataExtraction e = new DataExtraction(true, true, true, true, false, true, new File(wDir)); DataExtraction e = new DataExtraction(true, true, true, true, false, true, new File(wDir));
DataExtractionOsmFilter filter = e.new DataExtractionOsmFilter(amenities, buildings, places, ways, transport); DataExtractionOsmFilter filter = e.new DataExtractionOsmFilter();
filter.initDatabase(); filter.initDatabase();
storage.getFilters().add(filter); storage.getFilters().add(filter);
@ -715,7 +738,7 @@ public class DataExtraction {
storage.parseOSM(stream, new ConsoleProgressImplementation(), streamFile, true); storage.parseOSM(stream, new ConsoleProgressImplementation(), streamFile, true);
System.out.println("Total mem: " + Runtime.getRuntime().totalMemory() + " free : " + Runtime.getRuntime().freeMemory()); System.out.println("Total mem: " + Runtime.getRuntime().totalMemory() + " free : " + Runtime.getRuntime().freeMemory());
System.out.println("All time " + (System.currentTimeMillis() - time) + " ms"); // System.out.println("All time " + (System.currentTimeMillis() - time) + " ms"); //
System.out.println(amenities.size() + " " + buildings.size() + " " + places.size() + " " + ways.size()); // System.out.println(amenities.size() + " " + buildings.size() + " " + places.size() + " " + ways.size());
} }
} }

View file

@ -8,6 +8,7 @@ public class OSMSettings {
// ways // ways
HIGHWAY("highway"), //$NON-NLS-1$ HIGHWAY("highway"), //$NON-NLS-1$
BUILDING("building"), //$NON-NLS-1$ BUILDING("building"), //$NON-NLS-1$
POSTAL_CODE("postal_code"), //$NON-NLS-1$
// transport // transport
ROUTE("route"), //$NON-NLS-1$ ROUTE("route"), //$NON-NLS-1$
OPERATOR("operator"), //$NON-NLS-1$ OPERATOR("operator"), //$NON-NLS-1$

View file

@ -1,5 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="use_online_routing_descr">Использовать интернет для расчета маршрута</string>
<string name="use_online_routing">Online маршрутизация</string>
<string name="user_password_descr">Указать пароль для работы с OSM</string> <string name="user_password_descr">Указать пароль для работы с OSM</string>
<string name="user_password">Пароль</string> <string name="user_password">Пароль</string>
<string name="osm_settings_descr">Упраление слоем open street bugs, установка osm логина </string> <string name="osm_settings_descr">Упраление слоем open street bugs, установка osm логина </string>
@ -75,7 +77,7 @@
<color name="color_red">#FF0000</color> <color name="color_red">#FF0000</color>
<string name="searchpoi_activity">Выберите poi</string> <string name="searchpoi_activity">Выберите poi</string>
<string name="search_POI_level_btn">Найти еще</string> <string name="search_POI_level_btn">Найти еще</string>
<string name="incremental_search_city">Выберите город. Чтобы найти дереавню введите как минимум 3 первых буквы.</string> <string name="incremental_search_city">Выберите город. Введите 3 первых буквы, чтобы найти деревню, 2 цифры - индекс.</string>
<string name="incremental_search_street">Выберите улицу</string> <string name="incremental_search_street">Выберите улицу</string>
<string name="incremental_search_building">Выберите здание</string> <string name="incremental_search_building">Выберите здание</string>
<string name="choose_available_region">Выберите регион</string> <string name="choose_available_region">Выберите регион</string>

View file

@ -77,7 +77,7 @@
<color name="color_red">#FF0000</color> <color name="color_red">#FF0000</color>
<string name="searchpoi_activity">Choose poi</string> <string name="searchpoi_activity">Choose poi</string>
<string name="search_POI_level_btn">Find more</string> <string name="search_POI_level_btn">Find more</string>
<string name="incremental_search_city">Search city incrementally. In order to find villages input more than 3 first symbols.</string> <string name="incremental_search_city">Search city incrementally. In order to find villages/postcodes input more than 3 first symbols.</string>
<string name="incremental_search_street">Search street incrementally</string> <string name="incremental_search_street">Search street incrementally</string>
<string name="incremental_search_building">Search building incrementally</string> <string name="incremental_search_building">Search building incrementally</string>
<string name="choose_available_region">Choose region</string> <string name="choose_available_region">Choose region</string>

View file

@ -290,6 +290,7 @@ public class OsmandSettings {
public static final String LAST_SEARCHED_REGION = "last_searched_region"; //$NON-NLS-1$ public static final String LAST_SEARCHED_REGION = "last_searched_region"; //$NON-NLS-1$
public static final String LAST_SEARCHED_CITY = "last_searched_city"; //$NON-NLS-1$ public static final String LAST_SEARCHED_CITY = "last_searched_city"; //$NON-NLS-1$
public static final String lAST_SEARCHED_POSTCODE= "last_searched_postcode"; //$NON-NLS-1$
public static final String LAST_SEARCHED_STREET = "last_searched_street"; //$NON-NLS-1$ public static final String LAST_SEARCHED_STREET = "last_searched_street"; //$NON-NLS-1$
public static final String LAST_SEARCHED_BUILDING = "last_searched_building"; //$NON-NLS-1$ public static final String LAST_SEARCHED_BUILDING = "last_searched_building"; //$NON-NLS-1$
public static final String LAST_SEARCHED_INTERSECTED_STREET = "last_searched_intersected_street"; //$NON-NLS-1$ public static final String LAST_SEARCHED_INTERSECTED_STREET = "last_searched_intersected_street"; //$NON-NLS-1$
@ -308,6 +309,21 @@ public class OsmandSettings {
} }
return edit.commit(); return edit.commit();
} }
public static String getLastSearchedPostcode(Context ctx){
SharedPreferences prefs = ctx.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_WORLD_READABLE);
return prefs.getString(lAST_SEARCHED_POSTCODE, null);
}
public static boolean setLastSearchedPostcode(Context ctx, String postcode){
SharedPreferences prefs = ctx.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_WORLD_READABLE);
Editor edit = prefs.edit().putLong(LAST_SEARCHED_CITY, -1).putString(LAST_SEARCHED_STREET, "").putString( //$NON-NLS-1$
LAST_SEARCHED_BUILDING, "").putString(lAST_SEARCHED_POSTCODE, postcode); //$NON-NLS-1$
if(prefs.contains(LAST_SEARCHED_INTERSECTED_STREET)){
edit.putString(LAST_SEARCHED_INTERSECTED_STREET, ""); //$NON-NLS-1$
}
return edit.commit();
}
public static Long getLastSearchedCity(Context ctx) { public static Long getLastSearchedCity(Context ctx) {
SharedPreferences prefs = ctx.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_WORLD_READABLE); SharedPreferences prefs = ctx.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_WORLD_READABLE);
@ -318,6 +334,7 @@ public class OsmandSettings {
SharedPreferences prefs = ctx.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_WORLD_READABLE); SharedPreferences prefs = ctx.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_WORLD_READABLE);
Editor edit = prefs.edit().putLong(LAST_SEARCHED_CITY, cityId).putString(LAST_SEARCHED_STREET, "").putString( //$NON-NLS-1$ Editor edit = prefs.edit().putLong(LAST_SEARCHED_CITY, cityId).putString(LAST_SEARCHED_STREET, "").putString( //$NON-NLS-1$
LAST_SEARCHED_BUILDING, ""); //$NON-NLS-1$ LAST_SEARCHED_BUILDING, ""); //$NON-NLS-1$
edit.remove(lAST_SEARCHED_POSTCODE);
if(prefs.contains(LAST_SEARCHED_INTERSECTED_STREET)){ if(prefs.contains(LAST_SEARCHED_INTERSECTED_STREET)){
edit.putString(LAST_SEARCHED_INTERSECTED_STREET, ""); //$NON-NLS-1$ edit.putString(LAST_SEARCHED_INTERSECTED_STREET, ""); //$NON-NLS-1$
} }

View file

@ -11,7 +11,7 @@ import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.SortedSet; import java.util.TreeMap;
import java.util.TreeSet; import java.util.TreeSet;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
@ -21,7 +21,8 @@ import android.database.sqlite.SQLiteDatabase;
import com.osmand.data.Building; import com.osmand.data.Building;
import com.osmand.data.City; import com.osmand.data.City;
import com.osmand.data.PostcodeBasedStreet; import com.osmand.data.MapObject;
import com.osmand.data.PostCode;
import com.osmand.data.Region; import com.osmand.data.Region;
import com.osmand.data.Street; import com.osmand.data.Street;
import com.osmand.data.City.CityType; import com.osmand.data.City.CityType;
@ -41,7 +42,7 @@ public class RegionAddressRepository {
private LinkedHashMap<Long, City> cities = new LinkedHashMap<Long, City>(); private LinkedHashMap<Long, City> cities = new LinkedHashMap<Long, City>();
private Map<CityType, List<City>> cityTypes = new HashMap<CityType, List<City>>(); private Map<CityType, List<City>> cityTypes = new HashMap<CityType, List<City>>();
private SortedSet<String> postCodes = new TreeSet<String>(Collator.getInstance()); private Map<String, PostCode> postCodes = new TreeMap<String, PostCode>(Collator.getInstance());
private boolean useEnglishNames = false; private boolean useEnglishNames = false;
@ -86,6 +87,14 @@ public class RegionAddressRepository {
return !cities.isEmpty(); return !cities.isEmpty();
} }
public PostCode getPostcode(String name){
if(name == null){
return null;
}
preloadPostcodes();
return postCodes.get(name.toUpperCase());
}
public City getCityById(Long id){ public City getCityById(Long id){
if(id == -1){ if(id == -1){
// do not preload cities for that case // do not preload cities for that case
@ -95,18 +104,14 @@ public class RegionAddressRepository {
return cities.get(id); return cities.get(id);
} }
public Street getStreetByName(City city, String name){
if(city.isEmptyWithStreets()){ public Street getStreetByName(MapObject city, String name) {
preloadStreets(city); preloadStreets(city);
if (city instanceof City) {
return ((City) city).getStreet(name);
} else {
return ((PostCode) city).getStreet(name);
} }
if (postCodes.isEmpty()) {
preloadPostcodes();
}
Street street = city.getStreet(name);
if (street == null) {
street = postCodes.contains(name.toUpperCase()) ? new PostcodeBasedStreet(city, name) : null;
}
return street;
} }
public Building getBuildingByName(Street street, String name){ public Building getBuildingByName(Street street, String name){
@ -148,15 +153,22 @@ public class RegionAddressRepository {
} }
} }
public void fillWithSuggestedBuildings(Street street, String name, List<Building> buildingsToFill){ public void fillWithSuggestedBuildings(PostCode postcode, Street street, String name, List<Building> buildingsToFill){
preloadBuildings(street); preloadBuildings(street);
name = name.toLowerCase(); name = name.toLowerCase();
int ind = 0; int ind = 0;
if(name.length() == 0){ boolean empty = name.length() == 0;
if(empty && postcode == null){
buildingsToFill.addAll(street.getBuildings()); buildingsToFill.addAll(street.getBuildings());
return; return;
} }
for (Building building : street.getBuildings()) { for (Building building : street.getBuildings()) {
if(postcode != null && !postcode.getName().equals(building.getPostcode())){
continue;
} else if(empty){
buildingsToFill.add(building);
continue;
}
String bName = useEnglishNames ? building.getEnName() : building.getName(); String bName = useEnglishNames ? building.getEnName() : building.getName();
String lowerCase = bName.toLowerCase(); String lowerCase = bName.toLowerCase();
if (lowerCase.startsWith(name)) { if (lowerCase.startsWith(name)) {
@ -193,30 +205,21 @@ public class RegionAddressRepository {
} }
public void fillWithSuggestedStreets(City c, String name, List<Street> streetsToFill){ public void fillWithSuggestedStreets(MapObject o, String name, List<Street> streetsToFill){
preloadStreets(c); assert o instanceof PostCode || o instanceof City;
preloadPostcodes(); City city = (City) (o instanceof City ? o : null);
PostCode post = (PostCode) (o instanceof PostCode ? o : null);
preloadStreets(o);
name = name.toLowerCase(); name = name.toLowerCase();
Collection<Street> streets = post == null ? city.getStreets() : post.getStreets() ;
int ind = 0; int ind = 0;
if(name.length() == 0){ if(name.length() == 0){
streetsToFill.addAll(c.getStreets()); streetsToFill.addAll(streets);
return; return;
} else if (name.length() >= 2 &&
Character.isDigit(name.charAt(0)) &&
Character.isDigit(name.charAt(1))) {
// also try to identify postcodes
for (String code : postCodes) {
code = code.toLowerCase();
if (code.startsWith(name)) {
streetsToFill.add(ind++,new PostcodeBasedStreet(c, code));
} else {
streetsToFill.add(new PostcodeBasedStreet(c, code));
}
}
} }
ind = 0; ind = 0;
for (Street s : c.getStreets()) { for (Street s : streets) {
String sName = useEnglishNames ? s.getEnName() : s.getName(); String sName = useEnglishNames ? s.getEnName() : s.getName();
String lowerCase = sName.toLowerCase(); String lowerCase = sName.toLowerCase();
if (lowerCase.startsWith(name)) { if (lowerCase.startsWith(name)) {
@ -228,7 +231,7 @@ public class RegionAddressRepository {
} }
} }
public void fillWithSuggestedCities(String name, List<City> citiesToFill){ public void fillWithSuggestedCities(String name, List<MapObject> citiesToFill){
preloadCities(); preloadCities();
// essentially index is created that cities towns are first in cities map // essentially index is created that cities towns are first in cities map
int ind = 0; int ind = 0;
@ -236,18 +239,13 @@ public class RegionAddressRepository {
Character.isDigit(name.charAt(0)) && Character.isDigit(name.charAt(0)) &&
Character.isDigit(name.charAt(1))) { Character.isDigit(name.charAt(1))) {
preloadPostcodes(); preloadPostcodes();
name = name.toLowerCase();
// also try to identify postcodes // also try to identify postcodes
for (String code : postCodes) { String uName = name.toUpperCase();
String lcode = code.toLowerCase(); for (String code : postCodes.keySet()) {
// TODO postcode if (code.startsWith(uName)) {
City c = new City(CityType.CITY); citiesToFill.add(ind++, postCodes.get(code));
c.setName(code); } else if(code.contains(uName)){
c.setEnName(code); citiesToFill.add(postCodes.get(code));
if (lcode.startsWith(name)) {
citiesToFill.add(ind++,c);
} else if(lcode.contains(name)){
citiesToFill.add(c);
} }
} }
@ -346,7 +344,7 @@ public class RegionAddressRepository {
do { do {
String postcode = query.getString(0); String postcode = query.getString(0);
if (postcode != null) { if (postcode != null) {
postCodes.add(postcode); postCodes.put(postcode, new PostCode(postcode));
} }
} while (query.moveToNext()); } while (query.moveToNext());
} }
@ -357,15 +355,8 @@ public class RegionAddressRepository {
public void preloadBuildings(Street street){ public void preloadBuildings(Street street){
if (street.getBuildings().isEmpty()) { if (street.getBuildings().isEmpty()) {
Cursor query = null; Cursor query = db.query(IndexBuildingTable.getTable(), IndexConstants.generateColumnNames(IndexBuildingTable.values()), "? = street", //$NON-NLS-1$
if (street instanceof PostcodeBasedStreet) {
// this is postcode
query = db.query(IndexBuildingTable.getTable(), IndexConstants.generateColumnNames(IndexBuildingTable.values()), "? = postcode", //$NON-NLS-1$
new String[] { street.getName().toUpperCase()}, null, null, null);
} else {
query = db.query(IndexBuildingTable.getTable(), IndexConstants.generateColumnNames(IndexBuildingTable.values()), "? = street", //$NON-NLS-1$
new String[] { street.getId() + "" }, null, null, null); //$NON-NLS-1$ new String[] { street.getId() + "" }, null, null, null); //$NON-NLS-1$
}
log.debug("Start loading buildings for " + street.getName()); //$NON-NLS-1$ log.debug("Start loading buildings for " + street.getName()); //$NON-NLS-1$
if (query.moveToFirst()) { if (query.moveToFirst()) {
do { do {
@ -375,16 +366,21 @@ public class RegionAddressRepository {
.ordinal())); .ordinal()));
building.setName(query.getString(IndexBuildingTable.NAME.ordinal())); building.setName(query.getString(IndexBuildingTable.NAME.ordinal()));
building.setEnName(query.getString(IndexBuildingTable.NAME_EN.ordinal())); building.setEnName(query.getString(IndexBuildingTable.NAME_EN.ordinal()));
building.setPostcode(query.getString(IndexBuildingTable.POSTCODE.ordinal()));
street.registerBuilding(building); street.registerBuilding(building);
} while (query.moveToNext()); } while (query.moveToNext());
street.sortBuildings();
} }
query.close(); query.close();
log.debug("Loaded " + street.getBuildings().size() + " buildings"); //$NON-NLS-1$ //$NON-NLS-2$ log.debug("Loaded " + street.getBuildings().size() + " buildings"); //$NON-NLS-1$ //$NON-NLS-2$
} }
} }
public void preloadStreets(City city){ public void preloadStreets(MapObject o){
if (city.isEmptyWithStreets()) { assert o instanceof PostCode || o instanceof City;
City city = (City) (o instanceof City ? o : null);
PostCode post = (PostCode) (o instanceof PostCode ? o : null);
if (city != null && city.isEmptyWithStreets()) {
log.debug("Start loading streets for " + city.getName()); //$NON-NLS-1$ log.debug("Start loading streets for " + city.getName()); //$NON-NLS-1$
Cursor query = db.query(IndexStreetTable.getTable(), IndexConstants.generateColumnNames(IndexStreetTable.values()), "? = city", //$NON-NLS-1$ Cursor query = db.query(IndexStreetTable.getTable(), IndexConstants.generateColumnNames(IndexStreetTable.values()), "? = city", //$NON-NLS-1$
new String[] { city.getId() + "" }, null, null, null); //$NON-NLS-1$ new String[] { city.getId() + "" }, null, null, null); //$NON-NLS-1$
@ -401,6 +397,33 @@ public class RegionAddressRepository {
} }
query.close(); query.close();
log.debug("Loaded " + city.getStreets().size() + " streets"); //$NON-NLS-1$ //$NON-NLS-2$ log.debug("Loaded " + city.getStreets().size() + " streets"); //$NON-NLS-1$ //$NON-NLS-2$
} else if(post != null && post.isEmptyWithStreets()){
log.debug("Start loading streets for " + post.getName()); //$NON-NLS-1$
Cursor query = db.rawQuery("SELECT B.CITY, B.ID,B.LATITUDE, B.LONGITUDE, B.NAME, B.NAME_EN FROM building A JOIN street B ON A.street = B.ID WHERE A.postcode = ?", //$NON-NLS-1$
new String[] { post.getName() + "" }); //$NON-NLS-1$
if (query.moveToFirst()) {
do {
city = getCityById(query.getLong(0));
Street street = null;
if(city != null){
preloadStreets(city);
street = city.getStreet(useEnglishNames ? query.getString(5) : query.getString(4));
}
if(street == null){
street = new Street(city);
street.setId(query.getLong(1));
street.setLocation(query.getDouble(2), query.getDouble(3));
street.setName(query.getString(4));
street.setEnName(query.getString(5));
if(city != null){
city.registerStreet(street, useEnglishNames);
}
}
post.registerStreet(street, useEnglishNames);
} while (query.moveToNext());
}
query.close();
log.debug("Loaded " +post.getStreets().size() + " streets"); //$NON-NLS-1$ //$NON-NLS-2$
} }
} }

View file

@ -194,7 +194,7 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
float fx = mapView.calcDiffTileX(dx, dy); float fx = mapView.calcDiffTileX(dx, dy);
double latitude = MapUtils.getLatitudeFromTile(mapView.getZoom(), mapView.getYTile() + fy); double latitude = MapUtils.getLatitudeFromTile(mapView.getZoom(), mapView.getYTile() + fy);
double longitude = MapUtils.getLongitudeFromTile(mapView.getZoom(), mapView.getXTile() + fx); double longitude = MapUtils.getLongitudeFromTile(mapView.getZoom(), mapView.getXTile() + fx);
contextMenuPoint(latitude, longitude); contextMenuPoint(latitude, longitude, false);
return true; return true;
} }
@ -508,7 +508,7 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
startActivity(settings); startActivity(settings);
return true; return true;
} else if (item.getItemId() == R.id.map_mark_point) { } else if (item.getItemId() == R.id.map_mark_point) {
contextMenuPoint(mapView.getLatitude(), mapView.getLongitude()); contextMenuPoint(mapView.getLatitude(), mapView.getLongitude(), true);
return true; return true;
} else if (item.getItemId() == R.id.map_reload_tile) { } else if (item.getItemId() == R.id.map_reload_tile) {
reloadTile(mapView.getZoom(), mapView.getLatitude(), mapView.getLongitude()); reloadTile(mapView.getZoom(), mapView.getLatitude(), mapView.getLongitude());
@ -542,16 +542,27 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
builder.create().show(); builder.create().show();
} }
protected void contextMenuPoint(final double latitude, final double longitude){ protected void contextMenuPoint(final double latitude, final double longitude, boolean menu){
Builder builder = new AlertDialog.Builder(this); Builder builder = new AlertDialog.Builder(this);
Resources resources = this.getResources(); Resources resources = this.getResources();
builder.setItems(new String[]{ String[] res;
if(menu){
res = new String[]{
resources.getString(R.string.context_menu_item_navigate_point), resources.getString(R.string.context_menu_item_navigate_point),
resources.getString(R.string.context_menu_item_add_favorite), resources.getString(R.string.context_menu_item_add_favorite),
resources.getString(R.string.context_menu_item_update_map),
resources.getString(R.string.context_menu_item_open_bug), resources.getString(R.string.context_menu_item_open_bug),
resources.getString(R.string.context_menu_item_create_poi) resources.getString(R.string.context_menu_item_create_poi),
}, new DialogInterface.OnClickListener(){ };
} else {
res = new String[]{
resources.getString(R.string.context_menu_item_navigate_point),
resources.getString(R.string.context_menu_item_add_favorite),
resources.getString(R.string.context_menu_item_open_bug),
resources.getString(R.string.context_menu_item_create_poi),
resources.getString(R.string.context_menu_item_update_map),
};
}
builder.setItems(res, new DialogInterface.OnClickListener(){
@Override @Override
public void onClick(DialogInterface dialog, int which) { public void onClick(DialogInterface dialog, int which) {
@ -560,12 +571,12 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
} else if(which == 1){ } else if(which == 1){
addFavouritePoint(latitude, longitude); addFavouritePoint(latitude, longitude);
} else if(which == 2){ } else if(which == 2){
reloadTile(mapView.getZoom(), latitude, longitude);
} else if(which == 3){
osmBugsLayer.openBug(MapActivity.this, getLayoutInflater(), mapView, latitude, longitude); osmBugsLayer.openBug(MapActivity.this, getLayoutInflater(), mapView, latitude, longitude);
} else if(which == 4){ } else if(which == 3){
EditingPOIActivity activity = new EditingPOIActivity(MapActivity.this); EditingPOIActivity activity = new EditingPOIActivity(MapActivity.this);
activity.showCreateDialog(latitude, longitude); activity.showCreateDialog(latitude, longitude);
} else if(which == 4){
reloadTile(mapView.getZoom(), latitude, longitude);
} }
} }
}); });

View file

@ -19,6 +19,8 @@ import com.osmand.ResourceManager;
import com.osmand.activities.MapActivity; import com.osmand.activities.MapActivity;
import com.osmand.data.Building; import com.osmand.data.Building;
import com.osmand.data.City; import com.osmand.data.City;
import com.osmand.data.MapObject;
import com.osmand.data.PostCode;
import com.osmand.data.Street; import com.osmand.data.Street;
import com.osmand.osm.LatLon; import com.osmand.osm.LatLon;
import com.osmand.osm.Node; import com.osmand.osm.Node;
@ -35,6 +37,7 @@ public class SearchAddressActivity extends Activity {
private RegionAddressRepository region = null; private RegionAddressRepository region = null;
private City city = null; private City city = null;
private PostCode postcode = null;
private Street street = null; private Street street = null;
private Building building = null; private Building building = null;
private Street street2 = null; private Street street2 = null;
@ -118,6 +121,7 @@ public class SearchAddressActivity extends Activity {
findViewById(R.id.ResetCity).setOnClickListener(new View.OnClickListener(){ findViewById(R.id.ResetCity).setOnClickListener(new View.OnClickListener(){
@Override @Override
public void onClick(View v) { public void onClick(View v) {
postcode = null;
city = null; city = null;
street = null; street = null;
street2 = null; street2 = null;
@ -129,6 +133,7 @@ public class SearchAddressActivity extends Activity {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
region = null; region = null;
postcode = null;
city = null; city = null;
street = null; street = null;
street2 = null; street2 = null;
@ -222,11 +227,15 @@ public class SearchAddressActivity extends Activity {
} else { } else {
countryButton.setText(region.getName()); countryButton.setText(region.getName());
} }
findViewById(R.id.ResetCity).setEnabled(city != null); findViewById(R.id.ResetCity).setEnabled(postcode != null || city != null);
if(city == null){ if(city == null && postcode == null){
cityButton.setText(R.string.choose_city); cityButton.setText(R.string.choose_city);
} else { } else {
cityButton.setText(city.getName(region.useEnglishNames())); if(postcode != null){
cityButton.setText(postcode.getName());
} else {
cityButton.setText(city.getName(region.useEnglishNames()));
}
} }
cityButton.setEnabled(region != null); cityButton.setEnabled(region != null);
@ -236,7 +245,7 @@ public class SearchAddressActivity extends Activity {
} else { } else {
streetButton.setText(street.getName(region.useEnglishNames())); streetButton.setText(street.getName(region.useEnglishNames()));
} }
streetButton.setEnabled(city != null); streetButton.setEnabled(city != null || postcode != null);
if(radioBuilding){ if(radioBuilding){
((RadioButton)findViewById(R.id.RadioBuilding)).setChecked(true); ((RadioButton)findViewById(R.id.RadioBuilding)).setChecked(true);
@ -247,7 +256,8 @@ public class SearchAddressActivity extends Activity {
buildingButton.setEnabled(street != null); buildingButton.setEnabled(street != null);
showOnMap.setEnabled(building != null || city != null || street != null); showOnMap.setEnabled(city != null || street != null);
navigateTo.setEnabled(city != null || street != null);
} }
public void loadData(){ public void loadData(){
@ -255,17 +265,23 @@ public class SearchAddressActivity extends Activity {
if(region.useEnglishNames() != OsmandSettings.usingEnglishNames(this)){ if(region.useEnglishNames() != OsmandSettings.usingEnglishNames(this)){
region.setUseEnglishNames(OsmandSettings.usingEnglishNames(this)); region.setUseEnglishNames(OsmandSettings.usingEnglishNames(this));
} }
city = region.getCityById(OsmandSettings.getLastSearchedCity(SearchAddressActivity.this)); String postcodeStr = OsmandSettings.getLastSearchedPostcode(this);
if (city != null) { if(postcodeStr != null){
street = region.getStreetByName(city, OsmandSettings.getLastSearchedStreet(SearchAddressActivity.this)); postcode = region.getPostcode(postcodeStr);
} else {
city = region.getCityById(OsmandSettings.getLastSearchedCity(SearchAddressActivity.this));
}
if (postcode != null || city != null) {
MapObject o = postcode == null ? city : postcode;
street = region.getStreetByName(o, OsmandSettings.getLastSearchedStreet(SearchAddressActivity.this));
if (street != null) { if (street != null) {
String str = OsmandSettings.getLastSearchedIntersectedStreet(SearchAddressActivity.this); String str = OsmandSettings.getLastSearchedIntersectedStreet(SearchAddressActivity.this);
radioBuilding = str == null; radioBuilding = str == null;
if(str != null){ if(str != null){
street2 = region.getStreetByName(city, str); street2 = region.getStreetByName(o, str);
} else { } else {
building = region.getBuildingByName(street, OsmandSettings building = region.getBuildingByName(street, OsmandSettings.getLastSearchedBuilding(SearchAddressActivity.this));
.getLastSearchedBuilding(SearchAddressActivity.this));
} }
} }
} }
@ -301,6 +317,7 @@ public class SearchAddressActivity extends Activity {
region = ResourceManager.getResourceManager().getRegionRepository(lastSearchedRegion); region = ResourceManager.getResourceManager().getRegionRepository(lastSearchedRegion);
String progressMsg = null; String progressMsg = null;
// try to determine whether progress dialog & new thread needed // try to determine whether progress dialog & new thread needed
if (region != null) { if (region != null) {
Long cityId = OsmandSettings.getLastSearchedCity(this); Long cityId = OsmandSettings.getLastSearchedCity(this);
if (!region.areCitiesPreloaded()) { if (!region.areCitiesPreloaded()) {
@ -311,6 +328,7 @@ public class SearchAddressActivity extends Activity {
progressMsg = "Converting native/english names..."; progressMsg = "Converting native/english names...";
} }
} }
postcode = null;
city = null; city = null;
street = null; street = null;
building = null; building = null;

View file

@ -12,18 +12,24 @@ import com.osmand.RegionAddressRepository;
import com.osmand.ResourceManager; import com.osmand.ResourceManager;
import com.osmand.data.Building; import com.osmand.data.Building;
import com.osmand.data.City; import com.osmand.data.City;
import com.osmand.data.PostCode;
import com.osmand.data.Street; import com.osmand.data.Street;
public class SearchBuildingByNameActivity extends SearchByNameAbstractActivity<Building> { public class SearchBuildingByNameActivity extends SearchByNameAbstractActivity<Building> {
private RegionAddressRepository region; private RegionAddressRepository region;
private City city; private City city;
private Street street; private Street street;
private PostCode postcode;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
region = ResourceManager.getResourceManager().getRegionRepository(OsmandSettings.getLastSearchedRegion(this)); region = ResourceManager.getResourceManager().getRegionRepository(OsmandSettings.getLastSearchedRegion(this));
if(region != null){ if(region != null){
postcode = region.getPostcode(OsmandSettings.getLastSearchedPostcode(this));
city = region.getCityById(OsmandSettings.getLastSearchedCity(this)); city = region.getCityById(OsmandSettings.getLastSearchedCity(this));
if(city != null){ if(postcode != null){
street = region.getStreetByName(postcode, OsmandSettings.getLastSearchedStreet(this));
} else if(city != null){
street = region.getStreetByName(city, OsmandSettings.getLastSearchedStreet(this)); street = region.getStreetByName(city, OsmandSettings.getLastSearchedStreet(this));
} }
} }
@ -35,7 +41,7 @@ public class SearchBuildingByNameActivity extends SearchByNameAbstractActivity<B
public List<Building> getObjects(String filter) { public List<Building> getObjects(String filter) {
List<Building> l = new ArrayList<Building>(); List<Building> l = new ArrayList<Building>();
if(street != null){ if(street != null){
region.fillWithSuggestedBuildings(street, filter, l); region.fillWithSuggestedBuildings(postcode, street, filter, l);
} }
return l; return l;
} }

View file

@ -11,10 +11,12 @@ import com.osmand.R;
import com.osmand.RegionAddressRepository; import com.osmand.RegionAddressRepository;
import com.osmand.ResourceManager; import com.osmand.ResourceManager;
import com.osmand.data.City; import com.osmand.data.City;
import com.osmand.data.MapObject;
import com.osmand.data.PostCode;
import com.osmand.osm.LatLon; import com.osmand.osm.LatLon;
import com.osmand.osm.MapUtils; import com.osmand.osm.MapUtils;
public class SearchCityByNameActivity extends SearchByNameAbstractActivity<City> { public class SearchCityByNameActivity extends SearchByNameAbstractActivity<MapObject> {
private RegionAddressRepository region; private RegionAddressRepository region;
private LatLon location; private LatLon location;
@ -27,8 +29,8 @@ public class SearchCityByNameActivity extends SearchByNameAbstractActivity<City>
} }
@Override @Override
public List<City> getObjects(String filter) { public List<MapObject> getObjects(String filter) {
List<City> l = new ArrayList<City>(); List<MapObject> l = new ArrayList<MapObject>();
if(region != null){ if(region != null){
region.fillWithSuggestedCities(filter, l); region.fillWithSuggestedCities(filter, l);
} }
@ -36,7 +38,7 @@ public class SearchCityByNameActivity extends SearchByNameAbstractActivity<City>
} }
@Override @Override
public void updateTextView(City obj, TextView txt) { public void updateTextView(MapObject obj, TextView txt) {
LatLon l = obj.getLocation(); LatLon l = obj.getLocation();
if (getFilter().length() > 2 && location != null && l != null) { if (getFilter().length() > 2 && location != null && l != null) {
txt.setText(obj.getName(region.useEnglishNames()) + " - " + //$NON-NLS-1$ txt.setText(obj.getName(region.useEnglishNames()) + " - " + //$NON-NLS-1$
@ -47,10 +49,14 @@ public class SearchCityByNameActivity extends SearchByNameAbstractActivity<City>
} }
@Override @Override
public void itemSelected(City obj) { public void itemSelected(MapObject obj) {
OsmandSettings.setLastSearchedCity(this, obj.getId()); if (obj instanceof City) {
if(region.getCityById(obj.getId()) == null){ OsmandSettings.setLastSearchedCity(this, obj.getId());
region.registerCity(obj); if (region.getCityById(obj.getId()) == null) {
region.registerCity((City) obj);
}
} else if(obj instanceof PostCode){
OsmandSettings.setLastSearchedPostcode(this, obj.getName());
} }
finish(); finish();

View file

@ -12,11 +12,13 @@ import com.osmand.R;
import com.osmand.RegionAddressRepository; import com.osmand.RegionAddressRepository;
import com.osmand.ResourceManager; import com.osmand.ResourceManager;
import com.osmand.data.City; import com.osmand.data.City;
import com.osmand.data.PostCode;
import com.osmand.data.Street; import com.osmand.data.Street;
public class SearchStreet2ByNameActivity extends SearchByNameAbstractActivity<Street> { public class SearchStreet2ByNameActivity extends SearchByNameAbstractActivity<Street> {
private RegionAddressRepository region; private RegionAddressRepository region;
private City city; private City city;
private PostCode postcode;
private Street street1; private Street street1;
volatile private List<Street> initialList = new ArrayList<Street>(); volatile private List<Street> initialList = new ArrayList<Street>();
private List<Street> filterList = new ArrayList<Street>(); private List<Street> filterList = new ArrayList<Street>();
@ -24,9 +26,17 @@ public class SearchStreet2ByNameActivity extends SearchByNameAbstractActivity<St
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
region = ResourceManager.getResourceManager().getRegionRepository(OsmandSettings.getLastSearchedRegion(this)); region = ResourceManager.getResourceManager().getRegionRepository(OsmandSettings.getLastSearchedRegion(this));
if(region != null){ if(region != null){
postcode = region.getPostcode(OsmandSettings.getLastSearchedPostcode(this));
city = region.getCityById(OsmandSettings.getLastSearchedCity(this)); city = region.getCityById(OsmandSettings.getLastSearchedCity(this));
if(city != null){ if(postcode != null){
street1 = region.getStreetByName(postcode, (OsmandSettings.getLastSearchedStreet(this)));
if(street1 != null){
city = street1.getCity();
}
} else if(city != null){
street1 = region.getStreetByName(city, (OsmandSettings.getLastSearchedStreet(this))); street1 = region.getStreetByName(city, (OsmandSettings.getLastSearchedStreet(this)));
}
if(city != null){
startLoadDataInThread("Finding streets..."); startLoadDataInThread("Finding streets...");
} }
} }

View file

@ -11,16 +11,21 @@ import com.osmand.R;
import com.osmand.RegionAddressRepository; import com.osmand.RegionAddressRepository;
import com.osmand.ResourceManager; import com.osmand.ResourceManager;
import com.osmand.data.City; import com.osmand.data.City;
import com.osmand.data.PostCode;
import com.osmand.data.Street; import com.osmand.data.Street;
public class SearchStreetByNameActivity extends SearchByNameAbstractActivity<Street> { public class SearchStreetByNameActivity extends SearchByNameAbstractActivity<Street> {
private RegionAddressRepository region; private RegionAddressRepository region;
private City city; private City city;
private PostCode postcode;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
region = ResourceManager.getResourceManager().getRegionRepository(OsmandSettings.getLastSearchedRegion(this)); region = ResourceManager.getResourceManager().getRegionRepository(OsmandSettings.getLastSearchedRegion(this));
if(region != null){ if(region != null){
city = region.getCityById(OsmandSettings.getLastSearchedCity(this)); postcode = region.getPostcode(OsmandSettings.getLastSearchedPostcode(this));
if (postcode == null) {
city = region.getCityById(OsmandSettings.getLastSearchedCity(this));
}
} }
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
((TextView)findViewById(R.id.Label)).setText(R.string.incremental_search_street); ((TextView)findViewById(R.id.Label)).setText(R.string.incremental_search_street);
@ -29,8 +34,8 @@ public class SearchStreetByNameActivity extends SearchByNameAbstractActivity<Str
@Override @Override
public List<Street> getObjects(String filter) { public List<Street> getObjects(String filter) {
List<Street> l = new ArrayList<Street>(); List<Street> l = new ArrayList<Street>();
if(city != null){ if (city != null || postcode != null) {
region.fillWithSuggestedStreets(city, filter, l); region.fillWithSuggestedStreets(postcode == null ? city : postcode, filter, l);
} }
return l; return l;
} }