refactor data structure
git-svn-id: https://osmand.googlecode.com/svn/trunk@57 e29c36b1-1cfa-d876-8d93-3434fc2bb7b8
This commit is contained in:
parent
5322550b13
commit
6af7969c8a
19 changed files with 353 additions and 135 deletions
|
@ -40,9 +40,11 @@ public class ToDoConstants {
|
||||||
|
|
||||||
/// SWING version :
|
/// SWING version :
|
||||||
// TODO :
|
// TODO :
|
||||||
// 1. save preferences ? where?
|
// 1. save preferences ? where? (use internet, default dir save and other...)
|
||||||
// 2. specify area to download tiles ()
|
// 2. specify area to download tiles ()
|
||||||
// 3. download tiles without using dir tiles
|
// 3. download tiles without using dir tiles
|
||||||
// 4. Config file log & see log from file
|
// 4. Config file log & see log from file
|
||||||
|
// 5. specify area to load map (filter for osm loading)
|
||||||
|
// 6. Predefine what should be extracted from osm (building, poi or roads)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@ import com.osmand.Algoritms;
|
||||||
import com.osmand.osm.Node;
|
import com.osmand.osm.Node;
|
||||||
import com.osmand.osm.OSMSettings.OSMTagKey;
|
import com.osmand.osm.OSMSettings.OSMTagKey;
|
||||||
|
|
||||||
public class Amenity {
|
public class Amenity extends MapObject<Node> {
|
||||||
// http://wiki.openstreetmap.org/wiki/Amenity
|
// http://wiki.openstreetmap.org/wiki/Amenity
|
||||||
public enum AmenityType {
|
public enum AmenityType {
|
||||||
SUSTENANCE, // restaurant, cafe ...
|
SUSTENANCE, // restaurant, cafe ...
|
||||||
|
@ -76,17 +76,12 @@ public class Amenity {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private final Node node;
|
private final Node node;
|
||||||
|
|
||||||
public Amenity(Node node){
|
public Amenity(Node node){
|
||||||
this.node = node;
|
this.node = node;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Node getNode() {
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSubType(){
|
public String getSubType(){
|
||||||
if(node.getTag(OSMTagKey.AMENITY) != null){
|
if(node.getTag(OSMTagKey.AMENITY) != null){
|
||||||
return node.getTag(OSMTagKey.AMENITY);
|
return node.getTag(OSMTagKey.AMENITY);
|
||||||
|
@ -125,6 +120,11 @@ public class Amenity {
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Node getEntity() {
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
public String getSimpleFormat(){
|
public String getSimpleFormat(){
|
||||||
String name = node.getTag(OSMTagKey.NAME);
|
String name = node.getTag(OSMTagKey.NAME);
|
||||||
|
|
18
DataExtractionOSM/src/com/osmand/data/Building.java
Normal file
18
DataExtractionOSM/src/com/osmand/data/Building.java
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
package com.osmand.data;
|
||||||
|
|
||||||
|
import com.osmand.osm.Entity;
|
||||||
|
|
||||||
|
public class Building extends MapObject<Entity> {
|
||||||
|
|
||||||
|
private final Entity e;
|
||||||
|
|
||||||
|
public Building(Entity e){
|
||||||
|
this.e = e;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Entity getEntity() {
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -5,11 +5,10 @@ import java.util.Map;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
|
|
||||||
import com.osmand.osm.Entity;
|
import com.osmand.osm.Entity;
|
||||||
import com.osmand.osm.LatLon;
|
|
||||||
import com.osmand.osm.Node;
|
import com.osmand.osm.Node;
|
||||||
import com.osmand.osm.OSMSettings.OSMTagKey;
|
import com.osmand.osm.OSMSettings.OSMTagKey;
|
||||||
|
|
||||||
public class City {
|
public class City extends MapObject<Node> {
|
||||||
|
|
||||||
public enum CityType {
|
public enum CityType {
|
||||||
CITY(10000), TOWN(5000), VILLAGE(1000), HAMLET(300), SUBURB(300);
|
CITY(10000), TOWN(5000), VILLAGE(1000), HAMLET(300), SUBURB(300);
|
||||||
|
@ -46,36 +45,39 @@ public class City {
|
||||||
return streets.get(street);
|
return streets.get(street);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Street registerBuilding(LatLon point, Entity e){
|
public Street 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){
|
||||||
registerStreet(street).registerBuilding(point, e);
|
registerStreet(street).registerBuilding(e);
|
||||||
return streets.get(street);
|
return streets.get(street);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public String getName(){
|
|
||||||
return el.getTag(OSMTagKey.NAME);
|
|
||||||
}
|
|
||||||
|
|
||||||
public CityType getType(){
|
public CityType getType(){
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Node getNode(){
|
|
||||||
return el;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Collection<Street> getStreets(){
|
public Collection<Street> getStreets(){
|
||||||
return streets.values();
|
return streets.values();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Node getEntity() {
|
||||||
|
return el;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "City [" +type+"] " + getName();
|
return "City [" +type+"] " + getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void doDataPreparation(){
|
||||||
|
for(Street s : getStreets()){
|
||||||
|
s.doDataPreparation();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package com.osmand.data;
|
package com.osmand.data;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -26,12 +27,30 @@ public class DataTileManager<T> {
|
||||||
|
|
||||||
public void setZoom(int zoom) {
|
public void setZoom(int zoom) {
|
||||||
// TODO !!! it is required to reindex all stored objects
|
// TODO !!! it is required to reindex all stored objects
|
||||||
if(!objects.isEmpty()){
|
if(!isEmpty()){
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
this.zoom = zoom;
|
this.zoom = zoom;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isEmpty(){
|
||||||
|
for(String s : objects.keySet()){
|
||||||
|
if(!objects.get(s).isEmpty()){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getObjectsCount(){
|
||||||
|
int x = 0;
|
||||||
|
for(String s : objects.keySet()){
|
||||||
|
x += objects.get(s).size();
|
||||||
|
}
|
||||||
|
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
private void putObjects(int tx, int ty, List<T> r){
|
private void putObjects(int tx, int ty, List<T> r){
|
||||||
if(objects.containsKey(evTile(tx, ty))){
|
if(objects.containsKey(evTile(tx, ty))){
|
||||||
r.addAll(objects.get(evTile(tx, ty)));
|
r.addAll(objects.get(evTile(tx, ty)));
|
||||||
|
@ -65,7 +84,24 @@ public class DataTileManager<T> {
|
||||||
* returns not exactly sorted list,
|
* returns not exactly sorted list,
|
||||||
* however the first objects are from closer tile than last
|
* however the first objects are from closer tile than last
|
||||||
*/
|
*/
|
||||||
public List<T> getClosestObjects(double latitude, double longitude, int depth){
|
public List<T> getClosestObjects(double latitude, double longitude, int defaultStep){
|
||||||
|
if(isEmpty()){
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
int dp = 1;
|
||||||
|
List<T> l = null;
|
||||||
|
while (l == null || l.isEmpty()) {
|
||||||
|
l = getClosestObjects(latitude, longitude, dp, dp + defaultStep);
|
||||||
|
dp += defaultStep;
|
||||||
|
}
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<T> getClosestObjects(double latitude, double longitude){
|
||||||
|
return getClosestObjects(latitude, longitude, 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<T> getClosestObjects(double latitude, double longitude, int startDepth, int depth){
|
||||||
int tileX = (int) MapUtils.getTileNumberX(zoom, longitude);
|
int tileX = (int) MapUtils.getTileNumberX(zoom, longitude);
|
||||||
int tileY = (int) MapUtils.getTileNumberY(zoom, latitude);
|
int tileY = (int) MapUtils.getTileNumberY(zoom, latitude);
|
||||||
List<T> result = new ArrayList<T>();
|
List<T> result = new ArrayList<T>();
|
||||||
|
@ -78,9 +114,9 @@ public class DataTileManager<T> {
|
||||||
// however the simplest way could be to visit row by row & after sort tiles by distance (that's less efficient)
|
// however the simplest way could be to visit row by row & after sort tiles by distance (that's less efficient)
|
||||||
|
|
||||||
// go through circle
|
// go through circle
|
||||||
for (int i = 1; i <= depth; i++) {
|
for (int i = startDepth; i <= depth; i++) {
|
||||||
|
|
||||||
// goes <EFBFBD>
|
// goes
|
||||||
for (int j = 0; j <= i; j++) {
|
for (int j = 0; j <= i; j++) {
|
||||||
// left & right
|
// left & right
|
||||||
int dx = j == 0 ? 0 : -1;
|
int dx = j == 0 ? 0 : -1;
|
||||||
|
@ -119,10 +155,6 @@ public class DataTileManager<T> {
|
||||||
return tile;
|
return tile;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isEmpty(){
|
|
||||||
return objects.isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
51
DataExtractionOSM/src/com/osmand/data/MapObject.java
Normal file
51
DataExtractionOSM/src/com/osmand/data/MapObject.java
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
package com.osmand.data;
|
||||||
|
|
||||||
|
import com.osmand.osm.Entity;
|
||||||
|
import com.osmand.osm.LatLon;
|
||||||
|
import com.osmand.osm.MapUtils;
|
||||||
|
import com.osmand.osm.OSMSettings.OSMTagKey;
|
||||||
|
|
||||||
|
public abstract class MapObject<T extends Entity> implements Comparable<MapObject<T>> {
|
||||||
|
|
||||||
|
protected String name = null;
|
||||||
|
protected LatLon location = null;
|
||||||
|
|
||||||
|
public abstract T getEntity();
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
if (this.name != null) {
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
|
Entity e = getEntity();
|
||||||
|
if (e != null) {
|
||||||
|
String name = getEntity().getTag(OSMTagKey.NAME);
|
||||||
|
if (name != null) {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
return e.getId() + "";
|
||||||
|
} else {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LatLon getLocation(){
|
||||||
|
if(location != null){
|
||||||
|
return location;
|
||||||
|
}
|
||||||
|
return MapUtils.getCenter(getEntity());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLocation(double latitude, double longitude){
|
||||||
|
location = new LatLon(latitude, longitude);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compareTo(MapObject<T> o) {
|
||||||
|
return getName().compareTo(o.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -33,8 +33,10 @@ public class Region {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private DataTileManager<City> cityManager = new DataTileManager<City>();
|
||||||
private Map<CityType, List<City>> cities = new HashMap<CityType, List<City>>();
|
private Map<CityType, List<City>> cities = new HashMap<CityType, List<City>>();
|
||||||
{
|
{
|
||||||
|
cityManager.setZoom(10);
|
||||||
for(CityType type : CityType.values()){
|
for(CityType type : CityType.values()){
|
||||||
cities.put(type, new ArrayList<City>());
|
cities.put(type, new ArrayList<City>());
|
||||||
}
|
}
|
||||||
|
@ -113,18 +115,16 @@ public class Region {
|
||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
public City getClosestCity(LatLon point){
|
public City getClosestCity(LatLon point) {
|
||||||
City closest = null;
|
City closest = null;
|
||||||
double relDist = Double.POSITIVE_INFINITY;
|
double relDist = Double.POSITIVE_INFINITY;
|
||||||
for(CityType t : CityType.values()){
|
for (City c : cityManager.getClosestObjects(point.getLatitude(), point.getLongitude())) {
|
||||||
for(City c : cities.get(t)){
|
double rel = MapUtils.getDistance(c.getEntity(), point) / c.getType().getRadius();
|
||||||
double rel = MapUtils.getDistance(c.getNode(), point) / t.getRadius();
|
if (rel < relDist) {
|
||||||
if(rel < 1) {
|
closest = c;
|
||||||
return c; // we are in that city
|
relDist = rel;
|
||||||
}
|
if(relDist < 0.2d){
|
||||||
if(rel < relDist){
|
break;
|
||||||
closest = c;
|
|
||||||
relDist = rel;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -132,7 +132,7 @@ public class Region {
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Amenity> getClosestAmenities(double latitude, double longitude){
|
public List<Amenity> getClosestAmenities(double latitude, double longitude){
|
||||||
return amenities.getClosestObjects(latitude, longitude, 2);
|
return amenities.getClosestObjects(latitude, longitude);
|
||||||
}
|
}
|
||||||
|
|
||||||
public DataTileManager<Amenity> getAmenityManager(){
|
public DataTileManager<Amenity> getAmenityManager(){
|
||||||
|
@ -140,13 +140,15 @@ public class Region {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void registerAmenity(Amenity a){
|
public void registerAmenity(Amenity a){
|
||||||
amenities.registerObject(a.getNode().getLatitude(), a.getNode().getLongitude(), a);
|
LatLon location = a.getLocation();
|
||||||
|
amenities.registerObject(location.getLatitude(), location.getLongitude(), a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public City registerCity(Node c){
|
public City registerCity(Node c){
|
||||||
City city = new City(c);
|
City city = new City(c);
|
||||||
if(city.getType() != null && !Algoritms.isEmpty(city.getName())){
|
if(city.getType() != null && !Algoritms.isEmpty(city.getName())){
|
||||||
|
cityManager.registerObject(c.getLatitude(), c.getLongitude(), city);
|
||||||
cities.get(city.getType()).add(city);
|
cities.get(city.getType()).add(city);
|
||||||
return city;
|
return city;
|
||||||
}
|
}
|
||||||
|
@ -158,8 +160,12 @@ public class Region {
|
||||||
CityComparator comp = new CityComparator();
|
CityComparator comp = new CityComparator();
|
||||||
for(CityType t : cities.keySet()){
|
for(CityType t : cities.keySet()){
|
||||||
Collections.sort(cities.get(t), comp);
|
Collections.sort(cities.get(t), comp);
|
||||||
|
for(City c : cities.get(t)){
|
||||||
|
c.doDataPreparation();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,43 +1,77 @@
|
||||||
package com.osmand.data;
|
package com.osmand.data;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import com.osmand.osm.Entity;
|
import com.osmand.osm.Entity;
|
||||||
import com.osmand.osm.LatLon;
|
import com.osmand.osm.LatLon;
|
||||||
|
import com.osmand.osm.MapUtils;
|
||||||
import com.osmand.osm.Node;
|
import com.osmand.osm.Node;
|
||||||
|
import com.osmand.osm.OSMSettings.OSMTagKey;
|
||||||
|
|
||||||
public class Street {
|
public class Street extends MapObject<Entity> {
|
||||||
|
|
||||||
private final String name;
|
private final String name;
|
||||||
private Map<Entity, LatLon> buildings = new HashMap<Entity, LatLon>();
|
private List<Building> buildings = new ArrayList<Building>();
|
||||||
private List<Node> wayNodes = new ArrayList<Node>();
|
private List<Node> wayNodes = new ArrayList<Node>();
|
||||||
|
private Node center = null;
|
||||||
|
|
||||||
public Street(String name){
|
public Street(String name){
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void registerBuilding(LatLon point, Entity e){
|
public void registerBuilding(Entity e){
|
||||||
buildings.put(e, point);
|
Building building = new Building(e);
|
||||||
|
building.setName(e.getTag(OSMTagKey.ADDR_HOUSE_NUMBER));
|
||||||
|
buildings.add(building);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<Entity> getBuildings() {
|
public List<Building> getBuildings() {
|
||||||
return buildings.keySet();
|
return buildings;
|
||||||
}
|
|
||||||
|
|
||||||
public LatLon getLocationBuilding(Entity e){
|
|
||||||
return buildings.get(e);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public LatLon getLocation(){
|
||||||
|
if(center == null){
|
||||||
|
calculateCenter();
|
||||||
|
}
|
||||||
|
return center.getLatLon();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void calculateCenter(){
|
||||||
|
if(wayNodes.size() == 1){
|
||||||
|
center = wayNodes.get(0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
LatLon c = MapUtils.getWeightCenterForNodes(wayNodes);
|
||||||
|
double dist = Double.POSITIVE_INFINITY;
|
||||||
|
for(Node n : wayNodes){
|
||||||
|
double nd = MapUtils.getDistance(n, c);
|
||||||
|
if(nd < dist){
|
||||||
|
center = n;
|
||||||
|
dist = nd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public List<Node> getWayNodes() {
|
public List<Node> getWayNodes() {
|
||||||
return wayNodes;
|
return wayNodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void doDataPreparation() {
|
||||||
|
calculateCenter();
|
||||||
|
Collections.sort(buildings);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Entity getEntity() {
|
||||||
|
return center;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -214,35 +214,20 @@ public class DataExtraction {
|
||||||
if("country".equals(place)){
|
if("country".equals(place)){
|
||||||
country.setEntity(s);
|
country.setEntity(s);
|
||||||
} else {
|
} else {
|
||||||
City registerCity = country.registerCity(s);
|
country.registerCity(s);
|
||||||
if(registerCity == null){
|
|
||||||
System.out.println(place + " - " + s.getTag(OSMTagKey.NAME));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. found buildings (index addresses)
|
|
||||||
for(Entity b : buildings){
|
|
||||||
LatLon center = b.getLatLon();
|
|
||||||
// TODO first of all tag could be checked NodeUtil.getTag(e, "addr:city")
|
|
||||||
if(center == null){
|
|
||||||
// no nodes where loaded for this way
|
|
||||||
} else {
|
|
||||||
City city = country.getClosestCity(center);
|
|
||||||
if (city != null) {
|
|
||||||
city.registerBuilding(center, b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
for(Amenity a: amenities){
|
for(Amenity a: amenities){
|
||||||
country.registerAmenity(a);
|
country.registerAmenity(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
progress.startTask("Indexing streets...", ways.size());
|
||||||
waysManager = new DataTileManager<Way>();
|
waysManager = new DataTileManager<Way>();
|
||||||
for (Way w : ways) {
|
for (Way w : ways) {
|
||||||
|
progress.progress(1);
|
||||||
if (w.getTag(OSMTagKey.NAME) != null) {
|
if (w.getTag(OSMTagKey.NAME) != null) {
|
||||||
String street = w.getTag(OSMTagKey.NAME);
|
String street = w.getTag(OSMTagKey.NAME);
|
||||||
LatLon center = MapUtils.getWeightCenterForNodes(w.getNodes());
|
LatLon center = MapUtils.getWeightCenterForNodes(w.getNodes());
|
||||||
|
@ -256,7 +241,26 @@ public class DataExtraction {
|
||||||
waysManager.registerObject(center.getLatitude(), center.getLongitude(), w);
|
waysManager.registerObject(center.getLatitude(), center.getLongitude(), w);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/// way with name : МЗОР, ул. ...,
|
progress.finishTask();
|
||||||
|
/// way with name : МЗОР, ул. ...,
|
||||||
|
|
||||||
|
|
||||||
|
// found buildings (index addresses)
|
||||||
|
progress.startTask("Indexing buildings...", buildings.size());
|
||||||
|
for(Entity b : buildings){
|
||||||
|
LatLon center = b.getLatLon();
|
||||||
|
progress.progress(1);
|
||||||
|
// TODO first of all tag could be checked NodeUtil.getTag(e, "addr:city")
|
||||||
|
if(center == null){
|
||||||
|
// no nodes where loaded for this way
|
||||||
|
} else {
|
||||||
|
City city = country.getClosestCity(center);
|
||||||
|
if (city != null) {
|
||||||
|
city.registerBuilding(b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
progress.finishTask();
|
||||||
|
|
||||||
country.doDataPreparation();
|
country.doDataPreparation();
|
||||||
return country;
|
return country;
|
||||||
|
|
|
@ -61,7 +61,7 @@ public class DataIndexBuilder {
|
||||||
List<Amenity> list = region.getAmenityManager().getAllObjects();
|
List<Amenity> list = region.getAmenityManager().getAllObjects();
|
||||||
List<Long> interestedObjects = new ArrayList<Long>(list.size());
|
List<Long> interestedObjects = new ArrayList<Long>(list.size());
|
||||||
for(Amenity a : list) {
|
for(Amenity a : list) {
|
||||||
interestedObjects.add(a.getNode().getId());
|
interestedObjects.add(a.getEntity().getId());
|
||||||
}
|
}
|
||||||
OutputStream output = checkFile("POI/"+region.getName()+".osm");
|
OutputStream output = checkFile("POI/"+region.getName()+".osm");
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.osmand.osm;
|
package com.osmand.osm;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
@ -16,6 +17,10 @@ public class MapUtils {
|
||||||
return getDistance(e1.getLatitude(), e1.getLongitude(), e2.getLatitude(), e2.getLongitude());
|
return getDistance(e1.getLatitude(), e1.getLongitude(), e2.getLatitude(), e2.getLongitude());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static double getDistance(LatLon l, double latitude, double longitude){
|
||||||
|
return getDistance(l.getLatitude(), l.getLongitude(), latitude, longitude);
|
||||||
|
}
|
||||||
|
|
||||||
public static double getDistance(Node e1, double latitude, double longitude){
|
public static double getDistance(Node e1, double latitude, double longitude){
|
||||||
return getDistance(e1.getLatitude(), e1.getLongitude(), latitude, longitude);
|
return getDistance(e1.getLatitude(), e1.getLongitude(), latitude, longitude);
|
||||||
}
|
}
|
||||||
|
@ -46,7 +51,21 @@ public class MapUtils {
|
||||||
public static double getDistance(LatLon l1, LatLon l2){
|
public static double getDistance(LatLon l1, LatLon l2){
|
||||||
return getDistance(l1, l2);
|
return getDistance(l1, l2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static LatLon getCenter(Entity e){
|
||||||
|
if(e instanceof Node){
|
||||||
|
return ((Node) e).getLatLon();
|
||||||
|
} else if(e instanceof Way){
|
||||||
|
return getWeightCenterForNodes(((Way) e).getNodes());
|
||||||
|
} else if(e instanceof Relation){
|
||||||
|
List<LatLon> list = new ArrayList<LatLon>();
|
||||||
|
for(Entity fe : ((Relation) e).getMembers(null)){
|
||||||
|
list.add(getCenter(fe));
|
||||||
|
}
|
||||||
|
return getWeightCenter(list);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public static LatLon getWeightCenter(Collection<LatLon> nodes){
|
public static LatLon getWeightCenter(Collection<LatLon> nodes){
|
||||||
if(nodes.isEmpty()){
|
if(nodes.isEmpty()){
|
||||||
|
|
|
@ -67,13 +67,7 @@ public class Way extends Entity {
|
||||||
if(nodes == null){
|
if(nodes == null){
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
List<LatLon> list = new ArrayList<LatLon>(nodes.size());
|
return MapUtils.getWeightCenterForNodes(nodes);
|
||||||
for(Node n : nodes){
|
|
||||||
if(n != null){
|
|
||||||
list.add(n.getLatLon());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return MapUtils.getWeightCenter(list);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
52
DataExtractionOSM/src/com/osmand/osm/io/OSMIndexStorage.java
Normal file
52
DataExtractionOSM/src/com/osmand/osm/io/OSMIndexStorage.java
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
package com.osmand.osm.io;
|
||||||
|
|
||||||
|
import org.xml.sax.Attributes;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
|
import com.osmand.data.Region;
|
||||||
|
|
||||||
|
public class OSMIndexStorage extends OsmBaseStorage {
|
||||||
|
protected static final String ELEM_OSMAND = "osmand";
|
||||||
|
protected static final String ELEM_INDEX = "index";
|
||||||
|
protected static final String ELEM_CITY = "city";
|
||||||
|
protected static final String ELEM_STREET = "street";
|
||||||
|
protected static final String ELEM_BUILDING = "building";
|
||||||
|
|
||||||
|
public static final String OSMAND_VERSION = "0.1";
|
||||||
|
|
||||||
|
protected Region region;
|
||||||
|
|
||||||
|
|
||||||
|
public OSMIndexStorage(Region region){
|
||||||
|
this.region = region;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void initRootElement(String uri, String localName, String name, Attributes attributes) throws OsmVersionNotSupported {
|
||||||
|
if(ELEM_OSM.equals(name)){
|
||||||
|
if(!supportedVersions.contains(attributes.getValue(ATTR_VERSION))){
|
||||||
|
throw new OsmVersionNotSupported();
|
||||||
|
}
|
||||||
|
} else if(ELEM_OSMAND.equals(name)){
|
||||||
|
if(!OSMAND_VERSION.equals(attributes.getValue(ATTR_VERSION))){
|
||||||
|
throw new OsmVersionNotSupported();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw new OsmVersionNotSupported();
|
||||||
|
}
|
||||||
|
parseStarted = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
|
||||||
|
name = saxParser.isNamespaceAware() ? localName : name;
|
||||||
|
if(!parseStarted){
|
||||||
|
initRootElement(uri, localName, name, attributes);
|
||||||
|
} else if(ELEM_INDEX.equals(name)){
|
||||||
|
} else if(ELEM_CITY.equals(name)){
|
||||||
|
} else {
|
||||||
|
super.startElement(uri, localName, name, attributes);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,22 @@
|
||||||
package com.osmand.osm.io;
|
package com.osmand.osm.io;
|
||||||
|
|
||||||
|
import static com.osmand.osm.io.OsmBaseStorage.ATTR_ID;
|
||||||
|
import static com.osmand.osm.io.OsmBaseStorage.ATTR_K;
|
||||||
|
import static com.osmand.osm.io.OsmBaseStorage.ATTR_LAT;
|
||||||
|
import static com.osmand.osm.io.OsmBaseStorage.ATTR_LON;
|
||||||
|
import static com.osmand.osm.io.OsmBaseStorage.ATTR_REF;
|
||||||
|
import static com.osmand.osm.io.OsmBaseStorage.ATTR_ROLE;
|
||||||
|
import static com.osmand.osm.io.OsmBaseStorage.ATTR_TYPE;
|
||||||
|
import static com.osmand.osm.io.OsmBaseStorage.ATTR_V;
|
||||||
|
import static com.osmand.osm.io.OsmBaseStorage.ATTR_VERSION;
|
||||||
|
import static com.osmand.osm.io.OsmBaseStorage.ELEM_MEMBER;
|
||||||
|
import static com.osmand.osm.io.OsmBaseStorage.ELEM_ND;
|
||||||
|
import static com.osmand.osm.io.OsmBaseStorage.ELEM_NODE;
|
||||||
|
import static com.osmand.osm.io.OsmBaseStorage.ELEM_OSM;
|
||||||
|
import static com.osmand.osm.io.OsmBaseStorage.ELEM_RELATION;
|
||||||
|
import static com.osmand.osm.io.OsmBaseStorage.ELEM_TAG;
|
||||||
|
import static com.osmand.osm.io.OsmBaseStorage.ELEM_WAY;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -19,8 +36,6 @@ import com.osmand.osm.Way;
|
||||||
import com.sun.org.apache.xerces.internal.impl.PropertyManager;
|
import com.sun.org.apache.xerces.internal.impl.PropertyManager;
|
||||||
import com.sun.xml.internal.stream.writers.XMLStreamWriterImpl;
|
import com.sun.xml.internal.stream.writers.XMLStreamWriterImpl;
|
||||||
|
|
||||||
import static com.osmand.osm.io.OsmBaseStorage.*;
|
|
||||||
|
|
||||||
public class OSMStorageWriter {
|
public class OSMStorageWriter {
|
||||||
|
|
||||||
private final Map<Long, Entity> entities;
|
private final Map<Long, Entity> entities;
|
||||||
|
|
|
@ -45,14 +45,14 @@ public class OsmBaseStorage extends DefaultHandler {
|
||||||
|
|
||||||
protected Entity currentParsedEntity = null;
|
protected Entity currentParsedEntity = null;
|
||||||
|
|
||||||
private boolean parseStarted;
|
protected boolean parseStarted;
|
||||||
|
|
||||||
protected Map<Long, Entity> entities = new LinkedHashMap<Long, Entity>();
|
protected Map<Long, Entity> entities = new LinkedHashMap<Long, Entity>();
|
||||||
|
|
||||||
// this is used to show feedback to user
|
// this is used to show feedback to user
|
||||||
private IProgress progress;
|
protected IProgress progress;
|
||||||
private InputStream inputStream;
|
protected InputStream inputStream;
|
||||||
private InputStream streamForProgress;
|
protected InputStream streamForProgress;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@ public class OsmBaseStorage extends DefaultHandler {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private SAXParser saxParser;
|
protected SAXParser saxParser;
|
||||||
public SAXParser initSaxParser(){
|
public SAXParser initSaxParser(){
|
||||||
if(saxParser != null){
|
if(saxParser != null){
|
||||||
return saxParser;
|
return saxParser;
|
||||||
|
@ -123,22 +123,24 @@ public class OsmBaseStorage extends DefaultHandler {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final Set<String> supportedVersions = new HashSet<String>();
|
protected static final Set<String> supportedVersions = new HashSet<String>();
|
||||||
static {
|
static {
|
||||||
supportedVersions.add("0.6");
|
supportedVersions.add("0.6");
|
||||||
supportedVersions.add("0.5");
|
supportedVersions.add("0.5");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void initRootElement(String uri, String localName, String name, Attributes attributes) throws OsmVersionNotSupported{
|
||||||
|
if(!ELEM_OSM.equals(name) || !supportedVersions.contains(attributes.getValue(ATTR_VERSION))){
|
||||||
|
throw new OsmVersionNotSupported();
|
||||||
|
}
|
||||||
|
parseStarted = true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
|
public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
|
||||||
name = saxParser.isNamespaceAware() ? localName : name;
|
name = saxParser.isNamespaceAware() ? localName : name;
|
||||||
if(!parseStarted){
|
if(!parseStarted){
|
||||||
if(!ELEM_OSM.equals(name) || !supportedVersions.contains(attributes.getValue(ATTR_VERSION))){
|
initRootElement(uri, localName, name, attributes);
|
||||||
throw new OsmVersionNotSupported();
|
|
||||||
}
|
|
||||||
parseStarted = true;
|
|
||||||
}
|
}
|
||||||
if (currentParsedEntity == null && streamForProgress != null) {
|
if (currentParsedEntity == null && streamForProgress != null) {
|
||||||
if(progress != null && !progress.isIndeterminate()){
|
if(progress != null && !progress.isIndeterminate()){
|
||||||
|
|
|
@ -63,7 +63,9 @@ import com.osmand.DefaultLauncherConstants;
|
||||||
import com.osmand.ExceptionHandler;
|
import com.osmand.ExceptionHandler;
|
||||||
import com.osmand.IMapLocationListener;
|
import com.osmand.IMapLocationListener;
|
||||||
import com.osmand.data.Amenity;
|
import com.osmand.data.Amenity;
|
||||||
|
import com.osmand.data.Building;
|
||||||
import com.osmand.data.City;
|
import com.osmand.data.City;
|
||||||
|
import com.osmand.data.MapObject;
|
||||||
import com.osmand.data.Region;
|
import com.osmand.data.Region;
|
||||||
import com.osmand.data.Street;
|
import com.osmand.data.Street;
|
||||||
import com.osmand.data.Amenity.AmenityType;
|
import com.osmand.data.Amenity.AmenityType;
|
||||||
|
@ -74,7 +76,6 @@ import com.osmand.osm.Entity;
|
||||||
import com.osmand.osm.LatLon;
|
import com.osmand.osm.LatLon;
|
||||||
import com.osmand.osm.MapUtils;
|
import com.osmand.osm.MapUtils;
|
||||||
import com.osmand.osm.Node;
|
import com.osmand.osm.Node;
|
||||||
import com.osmand.osm.OSMSettings.OSMTagKey;
|
|
||||||
|
|
||||||
public class OsmExtractionUI implements IMapLocationListener {
|
public class OsmExtractionUI implements IMapLocationListener {
|
||||||
|
|
||||||
|
@ -136,10 +137,9 @@ public class OsmExtractionUI implements IMapLocationListener {
|
||||||
for (Street str : ct.getStreets()) {
|
for (Street str : ct.getStreets()) {
|
||||||
DefaultMutableTreeNode strTree = new DataExtractionTreeNode(str.getName(), str);
|
DefaultMutableTreeNode strTree = new DataExtractionTreeNode(str.getName(), str);
|
||||||
cityNodeTree.add(strTree);
|
cityNodeTree.add(strTree);
|
||||||
for (Entity e : str.getBuildings()) {
|
for (Building b : str.getBuildings()) {
|
||||||
DefaultMutableTreeNode building = new DataExtractionTreeNode(e.getTag(OSMTagKey.ADDR_HOUSE_NUMBER), e);
|
DefaultMutableTreeNode building = new DataExtractionTreeNode(b.getName(), b);
|
||||||
strTree.add(building);
|
strTree.add(building);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -213,42 +213,28 @@ public class OsmExtractionUI implements IMapLocationListener {
|
||||||
treePlaces.setEditable(true);
|
treePlaces.setEditable(true);
|
||||||
treePlaces.setCellEditor(new RegionCellEditor(treePlaces, (DefaultTreeCellRenderer) treePlaces.getCellRenderer()));
|
treePlaces.setCellEditor(new RegionCellEditor(treePlaces, (DefaultTreeCellRenderer) treePlaces.getCellRenderer()));
|
||||||
treePlaces.addTreeSelectionListener(new TreeSelectionListener() {
|
treePlaces.addTreeSelectionListener(new TreeSelectionListener() {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
@Override
|
@Override
|
||||||
public void valueChanged(TreeSelectionEvent e) {
|
public void valueChanged(TreeSelectionEvent e) {
|
||||||
if (e.getPath() != null) {
|
if (e.getPath() != null) {
|
||||||
if (e.getPath().getLastPathComponent() instanceof DataExtractionTreeNode) {
|
if (e.getPath().getLastPathComponent() instanceof DataExtractionTreeNode) {
|
||||||
Object o = ((DataExtractionTreeNode) e.getPath().getLastPathComponent()).getModelObject();
|
Object o = ((DataExtractionTreeNode) e.getPath().getLastPathComponent()).getModelObject();
|
||||||
|
|
||||||
if (o instanceof City) {
|
if (o instanceof MapObject<?>) {
|
||||||
City c = (City) o;
|
MapObject<Entity> c = (MapObject<Entity>) o;
|
||||||
mapPanel.setLatLon(c.getNode().getLatitude(), c.getNode().getLongitude());
|
LatLon location = c.getLocation();
|
||||||
mapPanel.requestFocus();
|
if(location != null){
|
||||||
} else if (o instanceof Street) {
|
mapPanel.setLatLon(location.getLatitude(), location.getLongitude());
|
||||||
Street s = (Street) o;
|
|
||||||
LatLon center = MapUtils.getWeightCenterForNodes(s.getWayNodes());
|
|
||||||
if(center != null){
|
|
||||||
mapPanel.setLatLon(center.getLatitude(), center.getLongitude());
|
|
||||||
mapPanel.requestFocus();
|
mapPanel.requestFocus();
|
||||||
}
|
}
|
||||||
} else if (o instanceof Amenity) {
|
|
||||||
Amenity c = (Amenity) o;
|
|
||||||
mapPanel.setLatLon(c.getNode().getLatitude(), c.getNode().getLongitude());
|
|
||||||
mapPanel.requestFocus();
|
|
||||||
} else if (o instanceof Entity) {
|
} else if (o instanceof Entity) {
|
||||||
Entity c = (Entity) o;
|
Entity c = (Entity) o;
|
||||||
if (c instanceof Node) {
|
LatLon latLon = c.getLatLon();
|
||||||
mapPanel.setLatLon(((Node) c).getLatitude(), ((Node) c).getLongitude());
|
if (latLon != null) {
|
||||||
|
mapPanel.setLatLon(latLon.getLatitude(), latLon.getLongitude());
|
||||||
mapPanel.requestFocus();
|
mapPanel.requestFocus();
|
||||||
} else {
|
}
|
||||||
DataExtractionTreeNode n = (DataExtractionTreeNode) e.getPath().getPathComponent(
|
|
||||||
e.getPath().getPathCount() - 2);
|
|
||||||
if (n.getModelObject() instanceof Street) {
|
|
||||||
Street str = (Street) n.getModelObject();
|
|
||||||
LatLon l = str.getLocationBuilding(c);
|
|
||||||
mapPanel.setLatLon(l.getLatitude(), l.getLongitude());
|
|
||||||
mapPanel.requestFocus();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -382,10 +368,10 @@ public class OsmExtractionUI implements IMapLocationListener {
|
||||||
@Override
|
@Override
|
||||||
public void valueChanged(ListSelectionEvent e) {
|
public void valueChanged(ListSelectionEvent e) {
|
||||||
if(searchList.getSelectedValue() != null){
|
if(searchList.getSelectedValue() != null){
|
||||||
Node node = ((City)searchList.getSelectedValue()).getNode();
|
Node node = ((City)searchList.getSelectedValue()).getEntity();
|
||||||
String text = "Lat : " + node.getLatitude() + " Lon " + node.getLongitude();
|
String text = "Lat : " + node.getLatitude() + " Lon " + node.getLongitude();
|
||||||
if(selectedCity != null){
|
if(selectedCity != null){
|
||||||
text += " distance " + MapUtils.getDistance(selectedCity.getNode(), node);
|
text += " distance " + MapUtils.getDistance(selectedCity.getEntity(), node);
|
||||||
}
|
}
|
||||||
mapPanel.setLatLon(node.getLatitude(), node.getLongitude());
|
mapPanel.setLatLon(node.getLatitude(), node.getLongitude());
|
||||||
}
|
}
|
||||||
|
@ -515,7 +501,7 @@ public class OsmExtractionUI implements IMapLocationListener {
|
||||||
Collections.sort(closestAmenities, new Comparator<Amenity>() {
|
Collections.sort(closestAmenities, new Comparator<Amenity>() {
|
||||||
@Override
|
@Override
|
||||||
public int compare(Amenity o1, Amenity o2) {
|
public int compare(Amenity o1, Amenity o2) {
|
||||||
return Double.compare(MapUtils.getDistance(o1.getNode(), newLatitude, newLongitude), MapUtils.getDistance(o2.getNode(),
|
return Double.compare(MapUtils.getDistance(o2.getLocation(), newLatitude, newLongitude), MapUtils.getDistance(o2.getLocation(),
|
||||||
newLatitude, newLongitude));
|
newLatitude, newLongitude));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -535,7 +521,7 @@ public class OsmExtractionUI implements IMapLocationListener {
|
||||||
((DefaultMutableTreeNode) amenitiesTree.getChildAt(i)).removeAllChildren();
|
((DefaultMutableTreeNode) amenitiesTree.getChildAt(i)).removeAllChildren();
|
||||||
if (filter.get(type) != null) {
|
if (filter.get(type) != null) {
|
||||||
for (Amenity n : filter.get(type)) {
|
for (Amenity n : filter.get(type)) {
|
||||||
int dist = (int) (MapUtils.getDistance(n.getNode(), newLatitude, newLongitude));
|
int dist = (int) (MapUtils.getDistance(n.getLocation(), newLatitude, newLongitude));
|
||||||
String str = n.getStringWithoutType() + " [" + dist + " m ]";
|
String str = n.getStringWithoutType() + " [" + dist + " m ]";
|
||||||
DataExtractionTreeNode node = new DataExtractionTreeNode(str, n);
|
DataExtractionTreeNode node = new DataExtractionTreeNode(str, n);
|
||||||
((DefaultMutableTreeNode) amenitiesTree.getChildAt(i)).add(node);
|
((DefaultMutableTreeNode) amenitiesTree.getChildAt(i)).add(node);
|
||||||
|
@ -547,7 +533,7 @@ public class OsmExtractionUI implements IMapLocationListener {
|
||||||
|
|
||||||
for (int i = 0; i < 15 && i < closestAmenities.size(); i++) {
|
for (int i = 0; i < 15 && i < closestAmenities.size(); i++) {
|
||||||
Amenity n = closestAmenities.get(i);
|
Amenity n = closestAmenities.get(i);
|
||||||
int dist = (int) (MapUtils.getDistance(n.getNode(), newLatitude, newLongitude));
|
int dist = (int) (MapUtils.getDistance(n.getLocation(), newLatitude, newLongitude));
|
||||||
String str = n.getSimpleFormat() + " [" + dist + " m ]";
|
String str = n.getSimpleFormat() + " [" + dist + " m ]";
|
||||||
((DefaultMutableTreeNode) amenitiesTree.getChildAt(0)).add(new DataExtractionTreeNode(str, n));
|
((DefaultMutableTreeNode) amenitiesTree.getChildAt(0)).add(new DataExtractionTreeNode(str, n));
|
||||||
((DefaultTreeModel)treePlaces.getModel()).nodeStructureChanged(amenitiesTree.getChildAt(0));
|
((DefaultTreeModel)treePlaces.getModel()).nodeStructureChanged(amenitiesTree.getChildAt(0));
|
||||||
|
|
|
@ -105,8 +105,9 @@ public class ProgressDialog extends JDialog implements IProgress {
|
||||||
@Override
|
@Override
|
||||||
public void progress(int deltaWork) {
|
public void progress(int deltaWork) {
|
||||||
this.deltaWork += deltaWork;
|
this.deltaWork += deltaWork;
|
||||||
if(change(progressBar.getValue() + deltaWork)){
|
if(change(progressBar.getValue() + this.deltaWork)){
|
||||||
progressBar.setValue(progressBar.getValue() + deltaWork);
|
progressBar.setValue(progressBar.getValue() + this.deltaWork);
|
||||||
|
this.deltaWork = 0;
|
||||||
updateMessage();
|
updateMessage();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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="**/MapPanel*|com/osmand/LogUtil.java|com/osmand/osm/io/OSMStorageWriter.java|com/osmand/DataExtraction.java|com/osmand/swing/|com/osmand/data/preparation/DataExtraction.java" kind="src" path="use"/>
|
<classpathentry excluding="**/MapPanel*|com/osmand/LogUtil.java|com/osmand/osm/io/OSMStorageWriter.java|com/osmand/DataExtraction.java|com/osmand/swing/|com/osmand/data/preparation/DataExtraction.java|com/osmand/data/preparation/DataIndexBuilder.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"/>
|
||||||
|
|
|
@ -34,9 +34,9 @@ public class POIMapLayer implements OsmandMapLayer {
|
||||||
int ey = (int) event.getY();
|
int ey = (int) event.getY();
|
||||||
int radius = getRadiusPoi(view.getZoom()) * 3 / 2;
|
int radius = getRadiusPoi(view.getZoom()) * 3 / 2;
|
||||||
for(Amenity n : objects){
|
for(Amenity n : objects){
|
||||||
double tileX = MapUtils.getTileNumberX(view.getZoom(), n.getNode().getLongitude());
|
double tileX = MapUtils.getTileNumberX(view.getZoom(), n.getLocation().getLongitude());
|
||||||
int x = (int) ((tileX - xTileLeft) * getTileSize());
|
int x = (int) ((tileX - xTileLeft) * getTileSize());
|
||||||
double tileY = MapUtils.getTileNumberY(view.getZoom(), n.getNode().getLatitude());
|
double tileY = MapUtils.getTileNumberY(view.getZoom(), n.getLocation().getLatitude());
|
||||||
int y = (int) ((tileY - yTileUp) * getTileSize());
|
int y = (int) ((tileY - yTileUp) * getTileSize());
|
||||||
if(Math.abs(x - ex) <= radius && Math.abs(y - ey) <= radius){
|
if(Math.abs(x - ex) <= radius && Math.abs(y - ey) <= radius){
|
||||||
Toast.makeText(view.getContext(), n.getSimpleFormat(), Toast.LENGTH_SHORT).show();
|
Toast.makeText(view.getContext(), n.getSimpleFormat(), Toast.LENGTH_SHORT).show();
|
||||||
|
@ -95,9 +95,9 @@ public class POIMapLayer implements OsmandMapLayer {
|
||||||
.getLongitudeFromTile(view.getZoom(), xTileLeft), MapUtils.getLatitudeFromTile(view.getZoom(), yTileDown), MapUtils
|
.getLongitudeFromTile(view.getZoom(), xTileLeft), MapUtils.getLatitudeFromTile(view.getZoom(), yTileDown), MapUtils
|
||||||
.getLongitudeFromTile(view.getZoom(), xTileRight));
|
.getLongitudeFromTile(view.getZoom(), xTileRight));
|
||||||
for (Amenity o : objects) {
|
for (Amenity o : objects) {
|
||||||
double tileX = MapUtils.getTileNumberX(view.getZoom(), o.getNode().getLongitude());
|
double tileX = MapUtils.getTileNumberX(view.getZoom(), o.getLocation().getLongitude());
|
||||||
int x = (int) ((tileX - xTileLeft) * getTileSize());
|
int x = (int) ((tileX - xTileLeft) * getTileSize());
|
||||||
double tileY = MapUtils.getTileNumberY(view.getZoom(), o.getNode().getLatitude());
|
double tileY = MapUtils.getTileNumberY(view.getZoom(), o.getLocation().getLatitude());
|
||||||
int y = (int) ((tileY - yTileUp) * getTileSize());
|
int y = (int) ((tileY - yTileUp) * getTileSize());
|
||||||
canvas.drawCircle(x, y, getRadiusPoi(view.getZoom()), pointUI);
|
canvas.drawCircle(x, y, getRadiusPoi(view.getZoom()), pointUI);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue