add sorting for hamlets
git-svn-id: https://osmand.googlecode.com/svn/trunk@266 e29c36b1-1cfa-d876-8d93-3434fc2bb7b8
This commit is contained in:
parent
6a558f1ead
commit
508acd5fe3
2 changed files with 43 additions and 4 deletions
|
@ -5,6 +5,7 @@ import java.text.Collator;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.Comparator;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
|
@ -31,6 +32,8 @@ import com.osmand.data.index.IndexConstants.IndexBuildingTable;
|
||||||
import com.osmand.data.index.IndexConstants.IndexCityTable;
|
import com.osmand.data.index.IndexConstants.IndexCityTable;
|
||||||
import com.osmand.data.index.IndexConstants.IndexStreetNodeTable;
|
import com.osmand.data.index.IndexConstants.IndexStreetNodeTable;
|
||||||
import com.osmand.data.index.IndexConstants.IndexStreetTable;
|
import com.osmand.data.index.IndexConstants.IndexStreetTable;
|
||||||
|
import com.osmand.osm.LatLon;
|
||||||
|
import com.osmand.osm.MapUtils;
|
||||||
import com.osmand.osm.Node;
|
import com.osmand.osm.Node;
|
||||||
import com.osmand.osm.Way;
|
import com.osmand.osm.Way;
|
||||||
|
|
||||||
|
@ -46,6 +49,38 @@ public class RegionAddressRepository {
|
||||||
|
|
||||||
private boolean useEnglishNames = false;
|
private boolean useEnglishNames = false;
|
||||||
|
|
||||||
|
public static class MapObjectNameDistanceComparator implements Comparator<MapObject> {
|
||||||
|
|
||||||
|
private final boolean useEnName;
|
||||||
|
private Collator collator = Collator.getInstance();
|
||||||
|
private final LatLon location;
|
||||||
|
|
||||||
|
public MapObjectNameDistanceComparator(boolean useEnName, LatLon location){
|
||||||
|
this.useEnName = useEnName;
|
||||||
|
this.location = location;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compare(MapObject object1, MapObject object2) {
|
||||||
|
if(object1 == null || object2 == null){
|
||||||
|
return object2 == object1 ? 0 : (object1 == null ? -1 : 1);
|
||||||
|
} else {
|
||||||
|
int c = collator.compare(object1.getName(useEnName), object2.getName(useEnName));
|
||||||
|
if(c == 0 && location != null){
|
||||||
|
LatLon l1 = object1.getLocation();
|
||||||
|
LatLon l2 = object2.getLocation();
|
||||||
|
if(l1 == null || l2 == null){
|
||||||
|
return l2 == l1 ? 0 : (l1 == null ? -1 : 1);
|
||||||
|
}
|
||||||
|
return Double.compare(MapUtils.getDistance(location, l1), MapUtils.getDistance(location, l2));
|
||||||
|
}
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public boolean initialize(final IProgress progress, File file) {
|
public boolean initialize(final IProgress progress, File file) {
|
||||||
long start = System.currentTimeMillis();
|
long start = System.currentTimeMillis();
|
||||||
if(db != null){
|
if(db != null){
|
||||||
|
@ -234,7 +269,7 @@ public class RegionAddressRepository {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void fillWithSuggestedCities(String name, List<MapObject> citiesToFill){
|
public void fillWithSuggestedCities(String name, List<MapObject> citiesToFill, LatLon currentLocation){
|
||||||
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;
|
||||||
|
@ -299,12 +334,16 @@ public class RegionAddressRepository {
|
||||||
Cursor query = db.query(IndexCityTable.getTable(), IndexConstants.generateColumnNames(IndexCityTable.values()),
|
Cursor query = db.query(IndexCityTable.getTable(), IndexConstants.generateColumnNames(IndexCityTable.values()),
|
||||||
where.toString(), null, null, null, null);
|
where.toString(), null, null, null, null);
|
||||||
if (query.moveToFirst()) {
|
if (query.moveToFirst()) {
|
||||||
|
List<City> hamlets = new ArrayList<City>();
|
||||||
do {
|
do {
|
||||||
citiesToFill.add(parseCityFromCursor(query));
|
hamlets.add(parseCityFromCursor(query));
|
||||||
} while (query.moveToNext());
|
} while (query.moveToNext());
|
||||||
|
Collections.sort(hamlets, new MapObjectNameDistanceComparator(useEnglishNames, currentLocation));
|
||||||
|
citiesToFill.addAll(hamlets);
|
||||||
}
|
}
|
||||||
query.close();
|
query.close();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
log.debug("Loaded citites " + (citiesToFill.size() - initialsize)); //$NON-NLS-1$
|
log.debug("Loaded citites " + (citiesToFill.size() - initialsize)); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,7 +32,7 @@ public class SearchCityByNameActivity extends SearchByNameAbstractActivity<MapOb
|
||||||
public List<MapObject> getObjects(String filter) {
|
public List<MapObject> getObjects(String filter) {
|
||||||
List<MapObject> l = new ArrayList<MapObject>();
|
List<MapObject> l = new ArrayList<MapObject>();
|
||||||
if(region != null){
|
if(region != null){
|
||||||
region.fillWithSuggestedCities(filter, l);
|
region.fillWithSuggestedCities(filter, l, location);
|
||||||
}
|
}
|
||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue