package com.osmand.data; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import com.osmand.Algoritms; import com.osmand.data.City.CityType; import com.osmand.osm.Entity; import com.osmand.osm.LatLon; import com.osmand.osm.MapUtils; import com.osmand.osm.Node; import com.osmand.osm.OSMSettings.OSMTagKey; public class Region { private Entity entity; private DataTileManager amenities = new DataTileManager(); private Map> cities = new HashMap>(); { for(CityType type : CityType.values()){ cities.put(type, new ArrayList()); } } public Region(Entity entity){ this.entity = entity; } public void setEntity(Entity e){ this.entity = e; } public String getName(){ return entity == null ? "" : entity.getTag(OSMTagKey.NAME); } public Collection getCitiesByType(CityType type){ return cities.get(type); } public Collection getCitiesByName(String name){ return getCityByName(name, true, Integer.MAX_VALUE); } public Collection getSuggestedCities(String name, int number){ return getCityByName(name, false, number); } protected Collection getCityByName(String name, boolean exactMatch, int number){ List l = new ArrayList(); for(CityType type : CityType.values()){ for(City c : cities.get(type)){ if( (exactMatch && c.getName().equalsIgnoreCase(name)) || (!exactMatch && c.getName().toLowerCase().startsWith(name.toLowerCase()) )){ l.add(c); if(l.size() >= number){ break; } } } } return l; } public City getClosestCity(LatLon point){ City closest = null; double relDist = Double.POSITIVE_INFINITY; for(CityType t : CityType.values()){ for(City c : cities.get(t)){ double rel = MapUtils.getDistance(c.getNode(), point) / t.getRadius(); if(rel < 1) { return c; // we are in that city } if(rel < relDist){ closest = c; relDist = rel; } } } return closest; } public List getClosestAmenities(double latitude, double longitude){ return amenities.getClosestObjects(latitude, longitude, 2); } public void registerAmenity(Amenity a){ amenities.registerObject(a.getNode().getLatitude(), a.getNode().getLongitude(), a); } public City registerCity(Node c){ City city = new City(c); if(city.getType() != null && !Algoritms.isEmpty(city.getName())){ cities.get(city.getType()).add(city); return city; } return null; } }