Remove support for deprecated address/transport odb indexes
This commit is contained in:
parent
c34eb50799
commit
a62cb50e13
6 changed files with 5 additions and 954 deletions
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<classpath>
|
<classpath>
|
||||||
<classpathentry kind="src" path="src"/>
|
<classpathentry kind="src" path="src"/>
|
||||||
<classpathentry excluding="net/osmand/ExceptionHandler.java|net/osmand/LogUtil.java|net/osmand/osm/io/OsmStorageWriter.java|net/osmand/osm/util/|net/osmand/swing/|net/osmand/data/index/IndexBatchCreator.java|net/osmand/data/preparation/DataExtraction.java|net/osmand/data/preparation/IndexCreator.java|rtree/|net/osmand/data/index/DataIndexWriter.java|net/osmand/data/preparation/OsmDbCreator.java|net/osmand/data/preparation/IndexTransportCreator.java" kind="src" path="use"/>
|
<classpathentry excluding="net/osmand/ExceptionHandler.java|net/osmand/LogUtil.java|net/osmand/osm/io/OsmStorageWriter.java|net/osmand/osm/util/|net/osmand/swing/|net/osmand/data/index/IndexBatchCreator.java|net/osmand/data/preparation/DataExtraction.java|net/osmand/data/preparation/IndexCreator.java|rtree/|net/osmand/data/index/DataIndexWriter.java|net/osmand/data/preparation/OsmDbCreator.java|net/osmand/data/preparation/IndexTransportCreator.java|net/osmand/data/preparation/AbstractIndexPartCreator.java|net/osmand/data/preparation/DBDialect.java|net/osmand/data/preparation/IndexAddressCreator.java|net/osmand/data/preparation/IndexPoiCreator.java|net/osmand/data/preparation/IndexVectorMapCreator.java|net/osmand/data/preparation/MapSwingAlgorithms.java|net/osmand/data/preparation/OsmDbAccessor.java|net/osmand/data/preparation/OsmDbAccessorContext.java" kind="src" path="use"/>
|
||||||
<classpathentry kind="src" path="gen"/>
|
<classpathentry kind="src" path="gen"/>
|
||||||
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
|
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
|
||||||
<classpathentry kind="lib" path="lib/bzip2-20090327.jar"/>
|
<classpathentry kind="lib" path="lib/bzip2-20090327.jar"/>
|
||||||
|
|
|
@ -97,11 +97,6 @@ public class DownloadOsmandIndexesHelper {
|
||||||
String s = ""; //$NON-NLS-1$
|
String s = ""; //$NON-NLS-1$
|
||||||
if (fileName.endsWith(IndexConstants.POI_INDEX_EXT) || fileName.endsWith(IndexConstants.POI_INDEX_EXT_ZIP)) {
|
if (fileName.endsWith(IndexConstants.POI_INDEX_EXT) || fileName.endsWith(IndexConstants.POI_INDEX_EXT_ZIP)) {
|
||||||
s = ctx.getString(R.string.poi);
|
s = ctx.getString(R.string.poi);
|
||||||
} else if (fileName.endsWith(IndexConstants.ADDRESS_INDEX_EXT) || fileName.endsWith(IndexConstants.ADDRESS_INDEX_EXT_ZIP)) {
|
|
||||||
s = ctx.getString(R.string.address);
|
|
||||||
} else if (fileName.endsWith(IndexConstants.TRANSPORT_INDEX_EXT)
|
|
||||||
|| fileName.endsWith(IndexConstants.TRANSPORT_INDEX_EXT_ZIP)) {
|
|
||||||
s = ctx.getString(R.string.transport);
|
|
||||||
} else if (fileName.endsWith(IndexConstants.BINARY_MAP_INDEX_EXT)
|
} else if (fileName.endsWith(IndexConstants.BINARY_MAP_INDEX_EXT)
|
||||||
|| fileName.endsWith(IndexConstants.BINARY_MAP_INDEX_EXT_ZIP)) {
|
|| fileName.endsWith(IndexConstants.BINARY_MAP_INDEX_EXT_ZIP)) {
|
||||||
boolean f = true;
|
boolean f = true;
|
||||||
|
@ -148,11 +143,6 @@ public class DownloadOsmandIndexesHelper {
|
||||||
public boolean isAccepted(){
|
public boolean isAccepted(){
|
||||||
if (fileName.endsWith(IndexConstants.POI_INDEX_EXT) || fileName.endsWith(IndexConstants.POI_INDEX_EXT_ZIP)) {
|
if (fileName.endsWith(IndexConstants.POI_INDEX_EXT) || fileName.endsWith(IndexConstants.POI_INDEX_EXT_ZIP)) {
|
||||||
return true;
|
return true;
|
||||||
} else if (fileName.endsWith(IndexConstants.ADDRESS_INDEX_EXT) || fileName.endsWith(IndexConstants.ADDRESS_INDEX_EXT_ZIP)) {
|
|
||||||
return true;
|
|
||||||
} else if (fileName.endsWith(IndexConstants.TRANSPORT_INDEX_EXT)
|
|
||||||
|| fileName.endsWith(IndexConstants.TRANSPORT_INDEX_EXT_ZIP)) {
|
|
||||||
return true;
|
|
||||||
} else if (fileName.endsWith(IndexConstants.BINARY_MAP_INDEX_EXT)
|
} else if (fileName.endsWith(IndexConstants.BINARY_MAP_INDEX_EXT)
|
||||||
|| fileName.endsWith(IndexConstants.BINARY_MAP_INDEX_EXT_ZIP)) {
|
|| fileName.endsWith(IndexConstants.BINARY_MAP_INDEX_EXT_ZIP)) {
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -1,524 +0,0 @@
|
||||||
package net.osmand.plus;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.text.Collator;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.EnumSet;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.TreeMap;
|
|
||||||
import java.util.TreeSet;
|
|
||||||
|
|
||||||
import net.osmand.Algoritms;
|
|
||||||
import net.osmand.IProgress;
|
|
||||||
import net.osmand.LogUtil;
|
|
||||||
import net.osmand.data.Building;
|
|
||||||
import net.osmand.data.City;
|
|
||||||
import net.osmand.data.MapObject;
|
|
||||||
import net.osmand.data.MapObjectComparator;
|
|
||||||
import net.osmand.data.PostCode;
|
|
||||||
import net.osmand.data.Street;
|
|
||||||
import net.osmand.data.City.CityType;
|
|
||||||
import net.osmand.data.index.IndexConstants;
|
|
||||||
import net.osmand.osm.LatLon;
|
|
||||||
import net.osmand.osm.Node;
|
|
||||||
import net.osmand.osm.Way;
|
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
|
||||||
|
|
||||||
import android.database.Cursor;
|
|
||||||
import android.database.sqlite.SQLiteDatabase;
|
|
||||||
|
|
||||||
|
|
||||||
public class RegionAddressRepositoryOdb implements RegionAddressRepository {
|
|
||||||
private static final Log log = LogUtil.getLog(RegionAddressRepositoryOdb.class);
|
|
||||||
private SQLiteDatabase db;
|
|
||||||
private String name;
|
|
||||||
private LinkedHashMap<Long, City> cities = new LinkedHashMap<Long, City>();
|
|
||||||
|
|
||||||
private Map<CityType, List<City>> cityTypes = new HashMap<CityType, List<City>>();
|
|
||||||
private Map<String, PostCode> postCodes = new TreeMap<String, PostCode>(Collator.getInstance());
|
|
||||||
|
|
||||||
private boolean useEnglishNames = false;
|
|
||||||
|
|
||||||
|
|
||||||
public boolean initialize(final IProgress progress, File file) {
|
|
||||||
long start = System.currentTimeMillis();
|
|
||||||
if(db != null){
|
|
||||||
// close previous db
|
|
||||||
db.close();
|
|
||||||
}
|
|
||||||
db = SQLiteDatabase.openOrCreateDatabase(file, null);
|
|
||||||
// add * as old format
|
|
||||||
name = file.getName().substring(0, file.getName().indexOf('.'))+" *"; //$NON-NLS-1$
|
|
||||||
if(db.getVersion() != IndexConstants.ADDRESS_TABLE_VERSION){
|
|
||||||
db.close();
|
|
||||||
db = null;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
log.debug("Initializing address db " + file.getAbsolutePath() + " " + (System.currentTimeMillis() - start) + " ms"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void close(){
|
|
||||||
clearCities();
|
|
||||||
if(db != null){
|
|
||||||
db.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void clearCities(){
|
|
||||||
cities.clear();
|
|
||||||
cityTypes.clear();
|
|
||||||
postCodes.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean areCitiesPreloaded(){
|
|
||||||
return !cities.isEmpty();
|
|
||||||
}
|
|
||||||
public boolean arePostcodesPreloaded(){
|
|
||||||
return !postCodes.isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
public PostCode getPostcode(String name){
|
|
||||||
if(name == null){
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
preloadPostcodes();
|
|
||||||
return postCodes.get(name.toUpperCase());
|
|
||||||
}
|
|
||||||
|
|
||||||
public City getCityById(Long id){
|
|
||||||
if(id == -1){
|
|
||||||
// do not preload cities for that case
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
preloadCities();
|
|
||||||
return cities.get(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public Street getStreetByName(MapObject city, String name) {
|
|
||||||
preloadStreets(city);
|
|
||||||
if (city instanceof City) {
|
|
||||||
return ((City) city).getStreet(name);
|
|
||||||
} else {
|
|
||||||
return ((PostCode) city).getStreet(name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Building getBuildingByName(Street street, String name){
|
|
||||||
if(street.getBuildings().isEmpty()){
|
|
||||||
preloadBuildings(street);
|
|
||||||
}
|
|
||||||
for(Building b : street.getBuildings()){
|
|
||||||
String bName = useEnglishNames ? b.getEnName() : b.getName();
|
|
||||||
if(bName.equals(name)){
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean useEnglishNames(){
|
|
||||||
return useEnglishNames;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUseEnglishNames(boolean useEnglishNames) {
|
|
||||||
this.useEnglishNames = useEnglishNames;
|
|
||||||
// sort streets
|
|
||||||
for (City c : cities.values()) {
|
|
||||||
if (!c.isEmptyWithStreets()) {
|
|
||||||
ArrayList<Street> list = new ArrayList<Street>(c.getStreets());
|
|
||||||
c.removeAllStreets();
|
|
||||||
for (Street s : list) {
|
|
||||||
c.registerStreet(s, useEnglishNames);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// sort cities
|
|
||||||
ArrayList<City> list = new ArrayList<City>(cities.values());
|
|
||||||
Collections.sort(list, new MapObjectComparator(useEnglishNames));
|
|
||||||
cities.clear();
|
|
||||||
cityTypes.clear();
|
|
||||||
for(City c : list){
|
|
||||||
addCityToPreloadedList(c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void fillWithSuggestedBuildings(PostCode postcode, Street street, String name, List<Building> buildingsToFill){
|
|
||||||
preloadBuildings(street);
|
|
||||||
name = name.toLowerCase();
|
|
||||||
int ind = 0;
|
|
||||||
boolean empty = name.length() == 0;
|
|
||||||
if(empty && postcode == null){
|
|
||||||
buildingsToFill.addAll(street.getBuildings());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
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 lowerCase = bName.toLowerCase();
|
|
||||||
if (lowerCase.startsWith(name)) {
|
|
||||||
buildingsToFill.add(ind, building);
|
|
||||||
ind++;
|
|
||||||
} else if (lowerCase.contains(name)) {
|
|
||||||
buildingsToFill.add(building);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void fillWithSuggestedStreetsIntersectStreets(City city, Street st, List<Street> streetsToFill) {
|
|
||||||
if (st != null) {
|
|
||||||
Set<Long> strIds = new TreeSet<Long>();
|
|
||||||
log.debug("Start loading instersection streets for " + city.getName()); //$NON-NLS-1$
|
|
||||||
Cursor query = db.rawQuery("SELECT B.STREET FROM street_node A JOIN street_node B ON A.ID = B.ID WHERE A.STREET = ?", //$NON-NLS-1$
|
|
||||||
new String[] { st.getId() + "" }); //$NON-NLS-1$
|
|
||||||
if (query.moveToFirst()) {
|
|
||||||
do {
|
|
||||||
if (st.getId() != query.getLong(0)) {
|
|
||||||
strIds.add(query.getLong(0));
|
|
||||||
}
|
|
||||||
} while (query.moveToNext());
|
|
||||||
}
|
|
||||||
query.close();
|
|
||||||
for (Street s : city.getStreets()) {
|
|
||||||
if (strIds.contains(s.getId())) {
|
|
||||||
streetsToFill.add(s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
log.debug("Loaded " + strIds.size() + " streets"); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
preloadWayNodes(st);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void fillWithSuggestedStreets(MapObject o, String name, List<Street> streetsToFill){
|
|
||||||
assert o instanceof PostCode || o instanceof City;
|
|
||||||
City city = (City) (o instanceof City ? o : null);
|
|
||||||
PostCode post = (PostCode) (o instanceof PostCode ? o : null);
|
|
||||||
preloadStreets(o);
|
|
||||||
name = name.toLowerCase();
|
|
||||||
|
|
||||||
Collection<Street> streets = post == null ? city.getStreets() : post.getStreets() ;
|
|
||||||
int ind = 0;
|
|
||||||
if(name.length() == 0){
|
|
||||||
streetsToFill.addAll(streets);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ind = 0;
|
|
||||||
for (Street s : streets) {
|
|
||||||
String sName = useEnglishNames ? s.getEnName() : s.getName();
|
|
||||||
String lowerCase = sName.toLowerCase();
|
|
||||||
if (lowerCase.startsWith(name)) {
|
|
||||||
streetsToFill.add(ind, s);
|
|
||||||
ind++;
|
|
||||||
} else if (lowerCase.contains(name)) {
|
|
||||||
streetsToFill.add(s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void fillWithSuggestedCities(String name, List<MapObject> citiesToFill, LatLon currentLocation){
|
|
||||||
preloadCities();
|
|
||||||
// essentially index is created that cities towns are first in cities map
|
|
||||||
int ind = 0;
|
|
||||||
if (name.length() >= 2 &&
|
|
||||||
Character.isDigit(name.charAt(0)) &&
|
|
||||||
Character.isDigit(name.charAt(1))) {
|
|
||||||
preloadPostcodes();
|
|
||||||
// also try to identify postcodes
|
|
||||||
String uName = name.toUpperCase();
|
|
||||||
for (String code : postCodes.keySet()) {
|
|
||||||
if (code.startsWith(uName)) {
|
|
||||||
citiesToFill.add(ind++, postCodes.get(code));
|
|
||||||
} else if(code.contains(uName)){
|
|
||||||
citiesToFill.add(postCodes.get(code));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
if(name.length() < 3){
|
|
||||||
EnumSet<CityType> set = EnumSet.of(CityType.CITY, CityType.TOWN);
|
|
||||||
for(CityType t : set){
|
|
||||||
List<City> list = cityTypes.get(t);
|
|
||||||
if(list == null){
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if(name.length() == 0){
|
|
||||||
citiesToFill.addAll(list);
|
|
||||||
} else {
|
|
||||||
name = name.toLowerCase();
|
|
||||||
for (City c : list) {
|
|
||||||
String cName = useEnglishNames ? c.getEnName() : c.getName();
|
|
||||||
String lowerCase = cName.toLowerCase();
|
|
||||||
if(lowerCase.startsWith(name)){
|
|
||||||
citiesToFill.add(c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
name = name.toLowerCase();
|
|
||||||
Collection<City> src = cities.values();
|
|
||||||
for (City c : src) {
|
|
||||||
String cName = useEnglishNames ? c.getEnName() : c.getName();
|
|
||||||
String lowerCase = cName.toLowerCase();
|
|
||||||
if (lowerCase.startsWith(name)) {
|
|
||||||
citiesToFill.add(ind, c);
|
|
||||||
ind++;
|
|
||||||
} else if (lowerCase.contains(name)) {
|
|
||||||
citiesToFill.add(c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
int initialsize = citiesToFill.size();
|
|
||||||
log.debug("Start loading cities for " +getName() + " filter " + name); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
// lower function in SQLite requires ICU extension
|
|
||||||
name = Algoritms.capitalizeFirstLetterAndLowercase(name);
|
|
||||||
int i = name.indexOf('\'');
|
|
||||||
if(i != -1){
|
|
||||||
// SQL quotation
|
|
||||||
name = name.replace("'", "''"); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
}
|
|
||||||
StringBuilder where = new StringBuilder(80);
|
|
||||||
where.
|
|
||||||
append("city_type not in ("). //$NON-NLS-1$
|
|
||||||
append('\'').append(CityType.valueToString(CityType.CITY)).append('\'').append(", "). //$NON-NLS-1$
|
|
||||||
append('\'').append(CityType.valueToString(CityType.TOWN)).append('\'').append(") and "). //$NON-NLS-1$
|
|
||||||
append(useEnglishNames ? "name_en" : "name").append(" LIKE '"+name+"%'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
|
|
||||||
Cursor query = db.query("city", new String[]{"id","latitude", "longitude", "name", "name_en", "city_type"}, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
|
|
||||||
where.toString(), null, null, null, null);
|
|
||||||
if (query.moveToFirst()) {
|
|
||||||
List<City> hamlets = new ArrayList<City>();
|
|
||||||
do {
|
|
||||||
hamlets.add(parseCityFromCursor(query));
|
|
||||||
} while (query.moveToNext());
|
|
||||||
Collections.sort(hamlets, new MapObjectNameDistanceComparator(useEnglishNames, currentLocation));
|
|
||||||
citiesToFill.addAll(hamlets);
|
|
||||||
}
|
|
||||||
query.close();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
log.debug("Loaded citites " + (citiesToFill.size() - initialsize)); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void preloadWayNodes(Street street){
|
|
||||||
if(street.getWayNodes().isEmpty()){
|
|
||||||
Cursor query = db.query("street_node", new String[]{"id", "latitude", "longitude", "street", "way"}, "? = street", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
|
|
||||||
new String[] { street.getId() + "" }, null, null, null); //$NON-NLS-1$
|
|
||||||
log.debug("Start loading waynodes for " + street.getName()); //$NON-NLS-1$
|
|
||||||
Map<Long, Way> ways = new LinkedHashMap<Long, Way>();
|
|
||||||
if (query.moveToFirst()) {
|
|
||||||
do {
|
|
||||||
Node n = new Node(query.getDouble(1),
|
|
||||||
query.getDouble(2),
|
|
||||||
query.getLong(0));
|
|
||||||
long way = query.getLong(4);
|
|
||||||
if(!ways.containsKey(way)){
|
|
||||||
ways.put(way, new Way(way));
|
|
||||||
}
|
|
||||||
ways.get(way).addNode(n);
|
|
||||||
} while (query.moveToNext());
|
|
||||||
}
|
|
||||||
query.close();
|
|
||||||
for(Way w : ways.values()){
|
|
||||||
street.getWayNodes().add(w);
|
|
||||||
}
|
|
||||||
log.debug("Loaded " + ways.size() + " ways"); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void preloadPostcodes() {
|
|
||||||
if (postCodes.isEmpty()) {
|
|
||||||
// check if it possible to load postcodes
|
|
||||||
Cursor query = db.query(true, "building", new String[] { "postcode" }, null, //$NON-NLS-1$//$NON-NLS-2$
|
|
||||||
null, null, null, null, null);
|
|
||||||
log.debug("Start loading postcodes for "); //$NON-NLS-1$
|
|
||||||
if (query.moveToFirst()) {
|
|
||||||
do {
|
|
||||||
String postcode = query.getString(0);
|
|
||||||
if (postcode != null) {
|
|
||||||
postCodes.put(postcode, new PostCode(postcode));
|
|
||||||
}
|
|
||||||
} while (query.moveToNext());
|
|
||||||
}
|
|
||||||
query.close();
|
|
||||||
log.debug("Loaded " + postCodes.size() + " postcodes "); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void preloadBuildings(Street street){
|
|
||||||
if (street.getBuildings().isEmpty()) {
|
|
||||||
Cursor query = db.query("building", //$NON-NLS-1$
|
|
||||||
new String[]{"id","latitude", "longitude", "name", "name_en", "street", "postcode"} //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
|
|
||||||
, "? = street", //$NON-NLS-1$
|
|
||||||
new String[] { street.getId() + "" }, null, null, null); //$NON-NLS-1$
|
|
||||||
log.debug("Start loading buildings for " + street.getName()); //$NON-NLS-1$
|
|
||||||
if (query.moveToFirst()) {
|
|
||||||
do {
|
|
||||||
Building building = new Building();
|
|
||||||
building.setId(query.getLong(0));
|
|
||||||
building.setLocation(query.getDouble(1), query.getDouble(2));
|
|
||||||
building.setName(query.getString(3));
|
|
||||||
building.setEnName(query.getString(4));
|
|
||||||
building.setPostcode(query.getString(6));
|
|
||||||
street.registerBuilding(building);
|
|
||||||
} while (query.moveToNext());
|
|
||||||
street.sortBuildings();
|
|
||||||
}
|
|
||||||
query.close();
|
|
||||||
log.debug("Loaded " + street.getBuildings().size() + " buildings"); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void preloadStreets(MapObject o){
|
|
||||||
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$
|
|
||||||
Cursor query = db.query("street", new String[]{"id","latitude", "longitude", "name", "name_en", "city"}, "? = city", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
|
|
||||||
new String[] { city.getId() + "" }, null, null, null); //$NON-NLS-1$
|
|
||||||
if (query.moveToFirst()) {
|
|
||||||
do {
|
|
||||||
Street street = new Street(city);
|
|
||||||
street.setId(query.getLong(0));
|
|
||||||
street.setLocation(query.getDouble(1), query.getDouble(2));
|
|
||||||
street.setName(query.getString(3));
|
|
||||||
street.setEnName(query.getString(4));
|
|
||||||
city.registerStreet(street, useEnglishNames);
|
|
||||||
} while (query.moveToNext());
|
|
||||||
}
|
|
||||||
query.close();
|
|
||||||
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$
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addCityToPreloadedList(City city){
|
|
||||||
cities.put(city.getId(), city);
|
|
||||||
|
|
||||||
if(!cityTypes.containsKey(city.getType())){
|
|
||||||
cityTypes.put(city.getType(), new ArrayList<City>());
|
|
||||||
}
|
|
||||||
cityTypes.get(city.getType()).add(city);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected City parseCityFromCursor(Cursor query){
|
|
||||||
CityType type = CityType.valueFromString(query.getString(5));
|
|
||||||
if (type != null) {
|
|
||||||
City city = new City(type);
|
|
||||||
city.setId(query.getLong(0));
|
|
||||||
city.setLocation(query.getDouble(1), query.getDouble(2));
|
|
||||||
city.setName(query.getString(3));
|
|
||||||
city.setEnName(query.getString(4));
|
|
||||||
return city;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void preloadCities(){
|
|
||||||
if (cities.isEmpty()) {
|
|
||||||
log.debug("Start loading cities for " +getName()); //$NON-NLS-1$
|
|
||||||
StringBuilder where = new StringBuilder();
|
|
||||||
where.append("city_type="). //$NON-NLS-1$
|
|
||||||
append('\'').append(CityType.valueToString(CityType.CITY)).append('\'').append(" or "). //$NON-NLS-1$
|
|
||||||
append("city_type="). //$NON-NLS-1$
|
|
||||||
append('\'').append(CityType.valueToString(CityType.TOWN)).append('\'');
|
|
||||||
Cursor query = db.query("city", new String[]{"id","latitude", "longitude", "name", "name_en", "city_type"}, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
|
|
||||||
where.toString(), null, null, null, null);
|
|
||||||
if(query.moveToFirst()){
|
|
||||||
do {
|
|
||||||
City city = parseCityFromCursor(query);
|
|
||||||
if (city != null) {
|
|
||||||
cities.put(city.getId(), city);
|
|
||||||
|
|
||||||
if(!cityTypes.containsKey(city.getType())){
|
|
||||||
cityTypes.put(city.getType(), new ArrayList<City>());
|
|
||||||
}
|
|
||||||
cityTypes.get(city.getType()).add(city);
|
|
||||||
}
|
|
||||||
|
|
||||||
} while(query.moveToNext());
|
|
||||||
}
|
|
||||||
log.debug("Loaded " + cities.size() + " cities"); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
query.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isMapRepository() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void clearCache() {
|
|
||||||
clearCities();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public LatLon findStreetIntersection(Street street, Street street2) {
|
|
||||||
preloadWayNodes(street2);
|
|
||||||
preloadWayNodes(street);
|
|
||||||
for(Way w : street2.getWayNodes()){
|
|
||||||
for(Way w2 : street.getWayNodes()){
|
|
||||||
for(Node n : w.getNodes()){
|
|
||||||
for(Node n2 : w2.getNodes()){
|
|
||||||
if(n.getId() == n2.getId()){
|
|
||||||
return n.getLatLon();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -44,7 +44,7 @@ import android.graphics.BitmapFactory;
|
||||||
* Such as indexes, tiles.
|
* Such as indexes, tiles.
|
||||||
* Also it is responsible to create cache for that resources if they
|
* Also it is responsible to create cache for that resources if they
|
||||||
* can't be loaded fully into memory & clear them on request.
|
* can't be loaded fully into memory & clear them on request.
|
||||||
*
|
*SQLITE
|
||||||
*/
|
*/
|
||||||
public class ResourceManager {
|
public class ResourceManager {
|
||||||
|
|
||||||
|
@ -52,8 +52,6 @@ public class ResourceManager {
|
||||||
public static final String POI_PATH = APP_DIR + IndexConstants.POI_INDEX_DIR;
|
public static final String POI_PATH = APP_DIR + IndexConstants.POI_INDEX_DIR;
|
||||||
public static final String VOICE_PATH = APP_DIR + IndexConstants.VOICE_INDEX_DIR;
|
public static final String VOICE_PATH = APP_DIR + IndexConstants.VOICE_INDEX_DIR;
|
||||||
public static final String MAPS_PATH = APP_DIR;
|
public static final String MAPS_PATH = APP_DIR;
|
||||||
public static final String ADDRESS_PATH = APP_DIR + IndexConstants.ADDRESS_INDEX_DIR;
|
|
||||||
public static final String TRANSPORT_PATH = APP_DIR + IndexConstants.TRANSPORT_INDEX_DIR;
|
|
||||||
public static final String TILES_PATH = APP_DIR+"tiles/"; //$NON-NLS-1$
|
public static final String TILES_PATH = APP_DIR+"tiles/"; //$NON-NLS-1$
|
||||||
public static final String TEMP_SOURCE_TO_LOAD = "temp"; //$NON-NLS-1$
|
public static final String TEMP_SOURCE_TO_LOAD = "temp"; //$NON-NLS-1$
|
||||||
public static final String VECTOR_MAP = "#vector_map"; //$NON-NLS-1$
|
public static final String VECTOR_MAP = "#vector_map"; //$NON-NLS-1$
|
||||||
|
@ -348,8 +346,6 @@ public class ResourceManager {
|
||||||
// indexingImageTiles(progress);
|
// indexingImageTiles(progress);
|
||||||
List<String> warnings = new ArrayList<String>();
|
List<String> warnings = new ArrayList<String>();
|
||||||
warnings.addAll(indexingPoi(progress));
|
warnings.addAll(indexingPoi(progress));
|
||||||
warnings.addAll(indexingAddresses(progress));
|
|
||||||
warnings.addAll(indexingTransport(progress));
|
|
||||||
warnings.addAll(indexingMaps(progress));
|
warnings.addAll(indexingMaps(progress));
|
||||||
return warnings;
|
return warnings;
|
||||||
}
|
}
|
||||||
|
@ -472,69 +468,6 @@ public class ResourceManager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public List<String> indexingAddresses(final IProgress progress){
|
|
||||||
File file = OsmandSettings.extendOsmandPath(context, ADDRESS_PATH);
|
|
||||||
List<String> warnings = new ArrayList<String>();
|
|
||||||
closeAddresses();
|
|
||||||
if (file.exists() && file.canRead()) {
|
|
||||||
for (File f : file.listFiles()) {
|
|
||||||
indexingAddress(progress, warnings, f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return warnings;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void indexingAddress(final IProgress progress, List<String> warnings, File f) {
|
|
||||||
if (f.getName().endsWith(IndexConstants.ADDRESS_INDEX_EXT)) {
|
|
||||||
RegionAddressRepositoryOdb repository = new RegionAddressRepositoryOdb();
|
|
||||||
progress.startTask(context.getString(R.string.indexing_address) + " " + f.getName(), -1); //$NON-NLS-1$
|
|
||||||
try {
|
|
||||||
boolean initialized = repository.initialize(progress, f);
|
|
||||||
if (initialized) {
|
|
||||||
addressMap.put(repository.getName(), repository);
|
|
||||||
indexFileNames.put(f.getName(), MessageFormat.format("{0,date,dd.MM.yyyy}", new Date(f.lastModified()))); //$NON-NLS-1$
|
|
||||||
} else {
|
|
||||||
warnings.add(MessageFormat.format(context.getString(R.string.version_index_is_not_supported), f.getName())); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
} catch (SQLiteException e) {
|
|
||||||
log.error("Exception reading " + f.getAbsolutePath(), e); //$NON-NLS-1$
|
|
||||||
warnings.add(MessageFormat.format(context.getString(R.string.version_index_is_not_supported), f.getName())); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public List<String> indexingTransport(final IProgress progress){
|
|
||||||
File file = OsmandSettings.extendOsmandPath(context, TRANSPORT_PATH);
|
|
||||||
List<String> warnings = new ArrayList<String>();
|
|
||||||
closeTransport();
|
|
||||||
if (file.exists() && file.canRead()) {
|
|
||||||
for (File f : file.listFiles()) {
|
|
||||||
indexingTransport(progress, warnings, f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return warnings;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void indexingTransport(final IProgress progress, List<String> warnings, File f) {
|
|
||||||
if (f.getName().endsWith(IndexConstants.TRANSPORT_INDEX_EXT)) {
|
|
||||||
TransportIndexRepositoryOdb repository = new TransportIndexRepositoryOdb();
|
|
||||||
progress.startTask(context.getString(R.string.indexing_transport) + " " + f.getName(), -1); //$NON-NLS-1$
|
|
||||||
try {
|
|
||||||
boolean initialized = repository.initialize(progress, f);
|
|
||||||
if (initialized) {
|
|
||||||
transportRepositories.add(repository);
|
|
||||||
indexFileNames.put(f.getName(), MessageFormat.format("{0,date,dd.MM.yyyy}", new Date(f.lastModified()))); //$NON-NLS-1$
|
|
||||||
} else {
|
|
||||||
warnings.add(MessageFormat.format(context.getString(R.string.version_index_is_not_supported), f.getName())); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
} catch (SQLiteException e) {
|
|
||||||
log.error("Exception reading " + f.getAbsolutePath(), e); //$NON-NLS-1$
|
|
||||||
warnings.add(MessageFormat.format(context.getString(R.string.version_index_is_not_supported), f.getName())); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////// Working with amenities ////////////////////////////////////////////////
|
////////////////////////////////////////////// Working with amenities ////////////////////////////////////////////////
|
||||||
public List<AmenityIndexRepository> searchAmenityRepositories(double latitude, double longitude) {
|
public List<AmenityIndexRepository> searchAmenityRepositories(double latitude, double longitude) {
|
||||||
|
|
|
@ -1,315 +0,0 @@
|
||||||
package net.osmand.plus;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.text.MessageFormat;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import net.osmand.IProgress;
|
|
||||||
import net.osmand.LogUtil;
|
|
||||||
import net.osmand.data.TransportRoute;
|
|
||||||
import net.osmand.data.TransportStop;
|
|
||||||
import net.osmand.data.index.IndexConstants;
|
|
||||||
import net.osmand.osm.LatLon;
|
|
||||||
import net.osmand.osm.MapUtils;
|
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
|
||||||
|
|
||||||
import android.database.Cursor;
|
|
||||||
|
|
||||||
public class TransportIndexRepositoryOdb extends BaseLocationIndexRepository<TransportStop> implements TransportIndexRepository {
|
|
||||||
private static final Log log = LogUtil.getLog(TransportIndexRepositoryOdb.class);
|
|
||||||
|
|
||||||
private final static String TRANSPORT_STOP_TABLE = IndexConstants.TRANSPORT_STOP_TABLE;
|
|
||||||
private final static String TRANSPORT_ROUTE_STOP_TABLE = IndexConstants.TRANSPORT_ROUTE_STOP_TABLE;
|
|
||||||
private final static String TRANSPORT_ROUTE_TABLE = IndexConstants.TRANSPORT_ROUTE_TABLE;
|
|
||||||
|
|
||||||
public boolean initialize(final IProgress progress, File file) {
|
|
||||||
return super.initialize(progress, file, IndexConstants.TRANSPORT_TABLE_VERSION, TRANSPORT_STOP_TABLE, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
private final String[] columns = new String[]{"id", "latitude", "longitude", "name", "name_en"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
|
|
||||||
public List<TransportStop> searchTransportStops(double topLatitude, double leftLongitude, double bottomLatitude, double rightLongitude, int limit, List<TransportStop> stops){
|
|
||||||
long now = System.currentTimeMillis();
|
|
||||||
String squery = "? < latitude AND latitude < ? AND ? < longitude AND longitude < ?"; //$NON-NLS-1$
|
|
||||||
|
|
||||||
if(limit != -1){
|
|
||||||
squery += " ORDER BY RANDOM() LIMIT " +limit; //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
Cursor query = db.query(TRANSPORT_STOP_TABLE, columns, squery,
|
|
||||||
new String[]{Double.toString(bottomLatitude),
|
|
||||||
Double.toString(topLatitude), Double.toString(leftLongitude), Double.toString(rightLongitude)}, null, null, null);
|
|
||||||
if(query.moveToFirst()){
|
|
||||||
do {
|
|
||||||
TransportStop st = new TransportStop();
|
|
||||||
st.setId(query.getLong(0));
|
|
||||||
st.setLocation(query.getDouble(1),
|
|
||||||
query.getDouble(2));
|
|
||||||
st.setName(query.getString(3 ));
|
|
||||||
st.setEnName(query.getString(4));
|
|
||||||
stops.add(st);
|
|
||||||
if(limit != -1 && stops.size() >= limit){
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} while(query.moveToNext());
|
|
||||||
}
|
|
||||||
query.close();
|
|
||||||
|
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
log.debug(String.format("Search for %s done in %s ms found %s.", //$NON-NLS-1$
|
|
||||||
topLatitude + " " + leftLongitude, System.currentTimeMillis() - now, stops.size())); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
return stops;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private static String cacheSQLRouteDescriptions = null;
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param stop
|
|
||||||
* @param format {0} - ref, {1} - type, {2} - name, {3} - name_en
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public List<String> getRouteDescriptionsForStop(TransportStop stop, String format) {
|
|
||||||
long now = System.currentTimeMillis();
|
|
||||||
List<String> res = new ArrayList<String>();
|
|
||||||
MessageFormat f = new MessageFormat(format);
|
|
||||||
|
|
||||||
if (cacheSQLRouteDescriptions == null) {
|
|
||||||
StringBuilder sql = new StringBuilder(200);
|
|
||||||
sql.append("SELECT DISTINCT ref, type, name, name_en FROM ").append(TRANSPORT_ROUTE_TABLE).append(" JOIN ").append(TRANSPORT_ROUTE_STOP_TABLE); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
sql.append(" ON transport_route.id = transport_route_stop.route WHERE transport_route_stop.stop = ?"); //$NON-NLS-1$
|
|
||||||
cacheSQLRouteDescriptions = sql.toString();
|
|
||||||
}
|
|
||||||
Cursor query = db.rawQuery(cacheSQLRouteDescriptions, new String[] { stop.getId() + "" }); //$NON-NLS-1$
|
|
||||||
if (query.moveToFirst()) {
|
|
||||||
do {
|
|
||||||
res.add(f.format(new String[] { query.getString(0), query.getString(1), query.getString(2), query.getString(3) }));
|
|
||||||
} while (query.moveToNext());
|
|
||||||
}
|
|
||||||
query.close();
|
|
||||||
|
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
log.debug(String.format("Search for stop %s done in %s ms found %s.", //$NON-NLS-1$
|
|
||||||
stop.getId() + "", System.currentTimeMillis() - now, res.size())); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void evaluateCachedTransportStops(double topLatitude, double leftLongitude, double bottomLatitude, double rightLongitude, int zoom, int limit, List<TransportStop> toFill){
|
|
||||||
cTopLatitude = topLatitude + (topLatitude -bottomLatitude);
|
|
||||||
cBottomLatitude = bottomLatitude - (topLatitude -bottomLatitude);
|
|
||||||
cLeftLongitude = leftLongitude - (rightLongitude - leftLongitude);
|
|
||||||
cRightLongitude = rightLongitude + (rightLongitude - leftLongitude);
|
|
||||||
cZoom = zoom;
|
|
||||||
// first of all put all entities in temp list in order to not freeze other read threads
|
|
||||||
ArrayList<TransportStop> tempList = new ArrayList<TransportStop>();
|
|
||||||
searchTransportStops(cTopLatitude, cLeftLongitude, cBottomLatitude, cRightLongitude, limit, tempList);
|
|
||||||
synchronized (this) {
|
|
||||||
cachedObjects.clear();
|
|
||||||
cachedObjects.addAll(tempList);
|
|
||||||
}
|
|
||||||
|
|
||||||
checkCachedObjects(topLatitude, leftLongitude, bottomLatitude, rightLongitude, cZoom, toFill);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private static String cacheSQLRoutes = null;
|
|
||||||
public List<RouteInfoLocation> searchTransportRouteStops(double latitude, double longitude, LatLon locationToGo, int zoom) {
|
|
||||||
long now = System.currentTimeMillis();
|
|
||||||
LatLon loc = new LatLon(latitude, longitude);
|
|
||||||
double tileNumberX = MapUtils.getTileNumberX(zoom, longitude);
|
|
||||||
double tileNumberY = MapUtils.getTileNumberY(zoom, latitude);
|
|
||||||
double topLatitude = MapUtils.getLatitudeFromTile(zoom, tileNumberY - 0.5);
|
|
||||||
double bottomLatitude = MapUtils.getLatitudeFromTile(zoom, tileNumberY + 0.5);
|
|
||||||
double leftLongitude = MapUtils.getLongitudeFromTile(zoom, tileNumberX - 0.5);
|
|
||||||
double rightLongitude = MapUtils.getLongitudeFromTile(zoom, tileNumberX + 0.5);
|
|
||||||
if(cacheSQLRoutes == null){
|
|
||||||
StringBuilder sql = new StringBuilder(200);
|
|
||||||
sql.append("SELECT R.id, R.dist, R.name, R.name_en, R.ref, R.operator, R.type, "); //$NON-NLS-1$
|
|
||||||
sql.append("T.id, T.name, T.name_en, T.latitude, T.longitude, TR.direction "); //$NON-NLS-1$
|
|
||||||
sql.append(" FROM ").append(TRANSPORT_STOP_TABLE).append(" T "); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
// join with stops table
|
|
||||||
sql.append(" JOIN ").append(TRANSPORT_ROUTE_STOP_TABLE).append(" TR "); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
sql.append(" ON T.id = TR.stop "); //$NON-NLS-1$
|
|
||||||
// join with route table
|
|
||||||
sql.append(" JOIN ").append(TRANSPORT_ROUTE_TABLE).append(" R "); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
sql.append(" ON R.id = TR.route "); //$NON-NLS-1$
|
|
||||||
sql.append(" WHERE ").append("? < latitude AND latitude < ? AND ? < longitude AND longitude < ?"); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
cacheSQLRoutes = sql.toString();
|
|
||||||
}
|
|
||||||
Cursor query = db.rawQuery(cacheSQLRoutes,
|
|
||||||
new String[] {bottomLatitude + "" , topLatitude + "" , leftLongitude + "" , rightLongitude + "" }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
|
|
||||||
|
|
||||||
Map<Long, RouteInfoLocation> registeredRoutes = new LinkedHashMap<Long, RouteInfoLocation>();
|
|
||||||
if (query.moveToFirst()) {
|
|
||||||
do {
|
|
||||||
TransportRoute route = new TransportRoute();
|
|
||||||
route.setId(query.getLong(0));
|
|
||||||
route.setDistance(query.getInt(1));
|
|
||||||
route.setName(query.getString(2));
|
|
||||||
route.setEnName(query.getString(3));
|
|
||||||
route.setRef(query.getString(4));
|
|
||||||
route.setOperator(query.getString(5));
|
|
||||||
route.setType(query.getString(6));
|
|
||||||
TransportStop s = new TransportStop();
|
|
||||||
s.setId(query.getLong(7));
|
|
||||||
s.setName(query.getString(8));
|
|
||||||
s.setEnName(query.getString(9));
|
|
||||||
s.setLocation(query.getDouble(10), query.getDouble(11));
|
|
||||||
boolean direction = query.getInt(12) > 0;
|
|
||||||
long idToPut = route.getId() << 1 + (direction ? 1 : 0);
|
|
||||||
if(registeredRoutes.containsKey(idToPut)){
|
|
||||||
TransportStop st = registeredRoutes.get(idToPut).getStart();
|
|
||||||
if(MapUtils.getDistance(loc, st.getLocation()) < MapUtils.getDistance(loc, s.getLocation())){
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
RouteInfoLocation r = new RouteInfoLocation();
|
|
||||||
r.setRoute(route);
|
|
||||||
r.setStart(s);
|
|
||||||
r.setDirection(direction);
|
|
||||||
registeredRoutes.put(idToPut, r);
|
|
||||||
|
|
||||||
|
|
||||||
} while (query.moveToNext());
|
|
||||||
}
|
|
||||||
query.close();
|
|
||||||
|
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
log.debug(String.format("Search for routes done in %s ms found %s.", //$NON-NLS-1$
|
|
||||||
System.currentTimeMillis() - now, registeredRoutes.size()));
|
|
||||||
}
|
|
||||||
|
|
||||||
List<RouteInfoLocation> list = preloadRouteStopsAndCalculateDistance(loc, locationToGo, registeredRoutes);
|
|
||||||
return list;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean acceptTransportStop(TransportStop stop) {
|
|
||||||
return checkContains(stop.getLocation().getLatitude(), stop.getLocation().getLongitude());
|
|
||||||
}
|
|
||||||
|
|
||||||
protected List<RouteInfoLocation> preloadRouteStopsAndCalculateDistance(final LatLon loc, LatLon locationToGo,
|
|
||||||
Map<Long, RouteInfoLocation> registeredRoutes) {
|
|
||||||
if(registeredRoutes.isEmpty()){
|
|
||||||
return Collections.emptyList();
|
|
||||||
}
|
|
||||||
long now = System.currentTimeMillis();
|
|
||||||
StringBuilder sql = new StringBuilder(200);
|
|
||||||
sql.append("SELECT T.id, T.latitude, T.longitude, T.name, T.name_en, "); //$NON-NLS-1$
|
|
||||||
sql.append(" TR.route, TR.direction " ); //$NON-NLS-1$
|
|
||||||
sql.append(" FROM ").append(TRANSPORT_STOP_TABLE).append(" T "); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
// join with stops table
|
|
||||||
sql.append(" JOIN ").append(TRANSPORT_ROUTE_STOP_TABLE).append(" TR "); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
sql.append(" ON T.id = TR.stop "); //$NON-NLS-1$
|
|
||||||
|
|
||||||
sql.append(" WHERE "); //$NON-NLS-1$
|
|
||||||
boolean f = true;
|
|
||||||
for (RouteInfoLocation il : registeredRoutes.values()) {
|
|
||||||
if (f) {
|
|
||||||
f = false;
|
|
||||||
} else {
|
|
||||||
sql.append(" OR "); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
sql.append("(TR.route"); //$NON-NLS-1$
|
|
||||||
sql.append(" = ").append(il.getRoute().getId()); //$NON-NLS-1$
|
|
||||||
sql.append(" AND TR.direction"); //$NON-NLS-1$
|
|
||||||
sql.append(" = ").append(il.getDirection() ? 1 : 0); //$NON-NLS-1$
|
|
||||||
sql.append(")"); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
sql.append(" ORDER BY TR.ord asc"); //$NON-NLS-1$
|
|
||||||
|
|
||||||
|
|
||||||
Map<Long, TransportStop> distanceToLoc = new LinkedHashMap<Long, TransportStop>();
|
|
||||||
|
|
||||||
Cursor query = db.rawQuery(sql.toString(), new String[] {});
|
|
||||||
if (query.moveToFirst()) {
|
|
||||||
// load only part of the route
|
|
||||||
do {
|
|
||||||
TransportStop st = null;
|
|
||||||
|
|
||||||
long routeId = query.getLong(5);
|
|
||||||
int direction = query.getInt(6);
|
|
||||||
long id = routeId << 1 + direction;
|
|
||||||
boolean found = distanceToLoc.containsKey(id);
|
|
||||||
RouteInfoLocation i = registeredRoutes.get(id);
|
|
||||||
if (found) {
|
|
||||||
st = new TransportStop();
|
|
||||||
st.setId(query.getLong(0));
|
|
||||||
st.setLocation(query.getDouble(1), query.getDouble(2));
|
|
||||||
st.setName(query.getString(3));
|
|
||||||
st.setEnName(query.getString(4));
|
|
||||||
} else if (query.getLong(0) == i.getStart().getId()) {
|
|
||||||
st = i.getStart();
|
|
||||||
found = true;
|
|
||||||
distanceToLoc.put(id, st);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (found) {
|
|
||||||
if (locationToGo != null) {
|
|
||||||
double d = MapUtils.getDistance(locationToGo, st.getLocation());
|
|
||||||
double dbase = MapUtils.getDistance(locationToGo, distanceToLoc.get(id).getLocation());
|
|
||||||
if (d < dbase) {
|
|
||||||
distanceToLoc.put(id, st);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (i.getDirection()) {
|
|
||||||
i.getRoute().getForwardStops().add(st);
|
|
||||||
} else {
|
|
||||||
i.getRoute().getBackwardStops().add(st);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} while (query.moveToNext());
|
|
||||||
query.close();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (locationToGo != null) {
|
|
||||||
for (Long l : registeredRoutes.keySet()) {
|
|
||||||
Integer dist = (int) MapUtils.getDistance(locationToGo, distanceToLoc.get(l).getLocation());
|
|
||||||
if (dist != null) {
|
|
||||||
registeredRoutes.get(l).setDistToLocation(dist);
|
|
||||||
}
|
|
||||||
registeredRoutes.get(l).setStop(distanceToLoc.get(l));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ArrayList<RouteInfoLocation> listRoutes = new ArrayList<RouteInfoLocation>(registeredRoutes.values());
|
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
log.debug(String.format("Loading routes done in %s ms for %s routes.", //$NON-NLS-1$
|
|
||||||
System.currentTimeMillis() - now, listRoutes.size()));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (locationToGo != null) {
|
|
||||||
Collections.sort(listRoutes, new Comparator<RouteInfoLocation>() {
|
|
||||||
@Override
|
|
||||||
public int compare(RouteInfoLocation object1, RouteInfoLocation object2) {
|
|
||||||
int x = (int) (MapUtils.getDistance(loc, object1.getStart().getLocation()) + object1.getDistToLocation());
|
|
||||||
int y = (int) (MapUtils.getDistance(loc, object2.getStart().getLocation()) + object2.getDistToLocation());
|
|
||||||
return x - y;
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
Collections.sort(listRoutes, new Comparator<RouteInfoLocation>() {
|
|
||||||
@Override
|
|
||||||
public int compare(RouteInfoLocation object1, RouteInfoLocation object2) {
|
|
||||||
return Double.compare(MapUtils.getDistance(loc, object1.getStart().getLocation()), MapUtils.getDistance(loc, object2
|
|
||||||
.getStart().getLocation()));
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return listRoutes;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,17 +1,11 @@
|
||||||
package net.osmand.plus.activities;
|
package net.osmand.plus.activities;
|
||||||
|
|
||||||
import static net.osmand.data.index.IndexConstants.ADDRESS_INDEX_EXT;
|
|
||||||
import static net.osmand.data.index.IndexConstants.ADDRESS_INDEX_EXT_ZIP;
|
|
||||||
import static net.osmand.data.index.IndexConstants.ADDRESS_TABLE_VERSION;
|
|
||||||
import static net.osmand.data.index.IndexConstants.BINARY_MAP_INDEX_EXT;
|
import static net.osmand.data.index.IndexConstants.BINARY_MAP_INDEX_EXT;
|
||||||
import static net.osmand.data.index.IndexConstants.BINARY_MAP_INDEX_EXT_ZIP;
|
import static net.osmand.data.index.IndexConstants.BINARY_MAP_INDEX_EXT_ZIP;
|
||||||
import static net.osmand.data.index.IndexConstants.BINARY_MAP_VERSION;
|
import static net.osmand.data.index.IndexConstants.BINARY_MAP_VERSION;
|
||||||
import static net.osmand.data.index.IndexConstants.POI_INDEX_EXT;
|
import static net.osmand.data.index.IndexConstants.POI_INDEX_EXT;
|
||||||
import static net.osmand.data.index.IndexConstants.POI_INDEX_EXT_ZIP;
|
import static net.osmand.data.index.IndexConstants.POI_INDEX_EXT_ZIP;
|
||||||
import static net.osmand.data.index.IndexConstants.POI_TABLE_VERSION;
|
import static net.osmand.data.index.IndexConstants.POI_TABLE_VERSION;
|
||||||
import static net.osmand.data.index.IndexConstants.TRANSPORT_INDEX_EXT;
|
|
||||||
import static net.osmand.data.index.IndexConstants.TRANSPORT_INDEX_EXT_ZIP;
|
|
||||||
import static net.osmand.data.index.IndexConstants.TRANSPORT_TABLE_VERSION;
|
|
||||||
import static net.osmand.data.index.IndexConstants.VOICE_INDEX_EXT_ZIP;
|
import static net.osmand.data.index.IndexConstants.VOICE_INDEX_EXT_ZIP;
|
||||||
import static net.osmand.data.index.IndexConstants.VOICE_VERSION;
|
import static net.osmand.data.index.IndexConstants.VOICE_VERSION;
|
||||||
|
|
||||||
|
@ -312,13 +306,10 @@ public class DownloadIndexActivity extends ListActivity {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<String> listAlreadyDownloadedWithAlternatives()
|
private List<String> listAlreadyDownloadedWithAlternatives() {
|
||||||
{
|
|
||||||
List<String> files = new ArrayList<String>();
|
List<String> files = new ArrayList<String>();
|
||||||
File externalStorageDirectory = OsmandSettings.getExternalStorageDirectory(getApplicationContext());
|
File externalStorageDirectory = OsmandSettings.getExternalStorageDirectory(getApplicationContext());
|
||||||
files.addAll(listWithAlternatives(new File(externalStorageDirectory, ResourceManager.ADDRESS_PATH),ADDRESS_INDEX_EXT,ADDRESS_INDEX_EXT_ZIP,ADDRESS_TABLE_VERSION));
|
|
||||||
files.addAll(listWithAlternatives(new File(externalStorageDirectory, ResourceManager.POI_PATH),POI_INDEX_EXT,POI_INDEX_EXT_ZIP,POI_TABLE_VERSION));
|
files.addAll(listWithAlternatives(new File(externalStorageDirectory, ResourceManager.POI_PATH),POI_INDEX_EXT,POI_INDEX_EXT_ZIP,POI_TABLE_VERSION));
|
||||||
files.addAll(listWithAlternatives(new File(externalStorageDirectory, ResourceManager.TRANSPORT_PATH),TRANSPORT_INDEX_EXT,TRANSPORT_INDEX_EXT_ZIP,TRANSPORT_TABLE_VERSION));
|
|
||||||
files.addAll(listWithAlternatives(new File(externalStorageDirectory, ResourceManager.APP_DIR),BINARY_MAP_INDEX_EXT,BINARY_MAP_INDEX_EXT_ZIP,BINARY_MAP_VERSION));
|
files.addAll(listWithAlternatives(new File(externalStorageDirectory, ResourceManager.APP_DIR),BINARY_MAP_INDEX_EXT,BINARY_MAP_INDEX_EXT_ZIP,BINARY_MAP_VERSION));
|
||||||
files.addAll(listWithAlternatives(new File(externalStorageDirectory, ResourceManager.VOICE_PATH),"",VOICE_INDEX_EXT_ZIP, VOICE_VERSION));
|
files.addAll(listWithAlternatives(new File(externalStorageDirectory, ResourceManager.VOICE_PATH),"",VOICE_INDEX_EXT_ZIP, VOICE_VERSION));
|
||||||
return files;
|
return files;
|
||||||
|
@ -353,15 +344,7 @@ public class DownloadIndexActivity extends ListActivity {
|
||||||
boolean unzipDir = false;
|
boolean unzipDir = false;
|
||||||
|
|
||||||
File externalStorageDirectory = OsmandSettings.getExternalStorageDirectory(getApplicationContext());
|
File externalStorageDirectory = OsmandSettings.getExternalStorageDirectory(getApplicationContext());
|
||||||
if(fileName.endsWith(ADDRESS_INDEX_EXT)){
|
if(fileName.endsWith(IndexConstants.POI_INDEX_EXT)){
|
||||||
parent = new File(externalStorageDirectory, ResourceManager.ADDRESS_PATH);
|
|
||||||
toSavePostfix = ADDRESS_INDEX_EXT;
|
|
||||||
toCheckPostfix = ADDRESS_INDEX_EXT;
|
|
||||||
} else if(fileName.endsWith(IndexConstants.ADDRESS_INDEX_EXT_ZIP)){
|
|
||||||
parent = new File(externalStorageDirectory, ResourceManager.ADDRESS_PATH);
|
|
||||||
toSavePostfix = ADDRESS_INDEX_EXT_ZIP;
|
|
||||||
toCheckPostfix = ADDRESS_INDEX_EXT;
|
|
||||||
} else if(fileName.endsWith(IndexConstants.POI_INDEX_EXT)){
|
|
||||||
parent = new File(externalStorageDirectory, ResourceManager.POI_PATH);
|
parent = new File(externalStorageDirectory, ResourceManager.POI_PATH);
|
||||||
toSavePostfix = POI_INDEX_EXT;
|
toSavePostfix = POI_INDEX_EXT;
|
||||||
toCheckPostfix = POI_INDEX_EXT;
|
toCheckPostfix = POI_INDEX_EXT;
|
||||||
|
@ -369,14 +352,6 @@ public class DownloadIndexActivity extends ListActivity {
|
||||||
parent = new File(externalStorageDirectory, ResourceManager.POI_PATH);
|
parent = new File(externalStorageDirectory, ResourceManager.POI_PATH);
|
||||||
toSavePostfix = POI_INDEX_EXT_ZIP;
|
toSavePostfix = POI_INDEX_EXT_ZIP;
|
||||||
toCheckPostfix = POI_INDEX_EXT;
|
toCheckPostfix = POI_INDEX_EXT;
|
||||||
} else if(fileName.endsWith(IndexConstants.TRANSPORT_INDEX_EXT)){
|
|
||||||
parent = new File(externalStorageDirectory, ResourceManager.TRANSPORT_PATH);
|
|
||||||
toSavePostfix = TRANSPORT_INDEX_EXT;
|
|
||||||
toCheckPostfix = TRANSPORT_INDEX_EXT;
|
|
||||||
} else if(fileName.endsWith(IndexConstants.TRANSPORT_INDEX_EXT_ZIP)){
|
|
||||||
parent = new File(externalStorageDirectory, ResourceManager.TRANSPORT_PATH);
|
|
||||||
toSavePostfix = TRANSPORT_INDEX_EXT_ZIP;
|
|
||||||
toCheckPostfix = TRANSPORT_INDEX_EXT;
|
|
||||||
} else if(fileName.endsWith(IndexConstants.BINARY_MAP_INDEX_EXT)){
|
} else if(fileName.endsWith(IndexConstants.BINARY_MAP_INDEX_EXT)){
|
||||||
parent = new File(externalStorageDirectory, ResourceManager.APP_DIR);
|
parent = new File(externalStorageDirectory, ResourceManager.APP_DIR);
|
||||||
toSavePostfix = BINARY_MAP_INDEX_EXT;
|
toSavePostfix = BINARY_MAP_INDEX_EXT;
|
||||||
|
@ -664,12 +639,8 @@ public class DownloadIndexActivity extends ListActivity {
|
||||||
if(dateModified != null){
|
if(dateModified != null){
|
||||||
toIndex.setLastModified(dateModified);
|
toIndex.setLastModified(dateModified);
|
||||||
}
|
}
|
||||||
if (toIndex.getName().endsWith(IndexConstants.ADDRESS_INDEX_EXT)) {
|
if (toIndex.getName().endsWith(IndexConstants.POI_INDEX_EXT)) {
|
||||||
manager.indexingAddress(progress, warnings, toIndex);
|
|
||||||
} else if (toIndex.getName().endsWith(IndexConstants.POI_INDEX_EXT)) {
|
|
||||||
manager.indexingPoi(progress, warnings, toIndex);
|
manager.indexingPoi(progress, warnings, toIndex);
|
||||||
} else if (toIndex.getName().endsWith(IndexConstants.TRANSPORT_INDEX_EXT)) {
|
|
||||||
manager.indexingTransport(progress, warnings, toIndex);
|
|
||||||
} else if (toIndex.getName().endsWith(IndexConstants.BINARY_MAP_INDEX_EXT)) {
|
} else if (toIndex.getName().endsWith(IndexConstants.BINARY_MAP_INDEX_EXT)) {
|
||||||
warnings.addAll(manager.indexingMaps(progress));
|
warnings.addAll(manager.indexingMaps(progress));
|
||||||
} else if (toIndex.getName().endsWith(IndexConstants.VOICE_INDEX_EXT_ZIP)) {
|
} else if (toIndex.getName().endsWith(IndexConstants.VOICE_INDEX_EXT_ZIP)) {
|
||||||
|
@ -718,10 +689,6 @@ public class DownloadIndexActivity extends ListActivity {
|
||||||
String s;
|
String s;
|
||||||
if(name.endsWith(IndexConstants.POI_INDEX_EXT) || name.endsWith(IndexConstants.POI_INDEX_EXT_ZIP)){
|
if(name.endsWith(IndexConstants.POI_INDEX_EXT) || name.endsWith(IndexConstants.POI_INDEX_EXT_ZIP)){
|
||||||
s = IndexConstants.POI_INDEX_EXT;
|
s = IndexConstants.POI_INDEX_EXT;
|
||||||
} else if(name.endsWith(IndexConstants.ADDRESS_INDEX_EXT) || name.endsWith(IndexConstants.ADDRESS_INDEX_EXT_ZIP)){
|
|
||||||
s = IndexConstants.ADDRESS_INDEX_EXT;
|
|
||||||
} else if(name.endsWith(IndexConstants.TRANSPORT_INDEX_EXT) || name.endsWith(IndexConstants.TRANSPORT_INDEX_EXT_ZIP)){
|
|
||||||
s = IndexConstants.TRANSPORT_INDEX_EXT;
|
|
||||||
} else if(name.endsWith(IndexConstants.BINARY_MAP_INDEX_EXT) || name.endsWith(IndexConstants.BINARY_MAP_INDEX_EXT_ZIP)){
|
} else if(name.endsWith(IndexConstants.BINARY_MAP_INDEX_EXT) || name.endsWith(IndexConstants.BINARY_MAP_INDEX_EXT_ZIP)){
|
||||||
s = IndexConstants.BINARY_MAP_INDEX_EXT;
|
s = IndexConstants.BINARY_MAP_INDEX_EXT;
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in a new issue