fix multitype sort
git-svn-id: https://osmand.googlecode.com/svn/trunk@526 e29c36b1-1cfa-d876-8d93-3434fc2bb7b8
This commit is contained in:
parent
1a52d0fb51
commit
ca47dc056f
5 changed files with 171 additions and 163 deletions
|
@ -8,49 +8,40 @@ package net.osmand;
|
||||||
public class ToDoConstants {
|
public class ToDoConstants {
|
||||||
|
|
||||||
|
|
||||||
// TODO max 94
|
// TODO max 96
|
||||||
|
|
||||||
// FOR 0.4 beta RELEASE
|
// FOR 0.4 beta RELEASE
|
||||||
|
// ! 89. Transport redesign UI (enable run from context menu, switch go to goal/not) !
|
||||||
|
// ! 95. Show progress while map rendered and loaded
|
||||||
|
// 90. Use Junidecode library on the client for english translation (for map rendering and other save disk space)
|
||||||
|
//
|
||||||
|
// !_25. Add all attributes needed for routing (highway attributes, turn_restrictions)
|
||||||
|
// !_22. Verify all POI has a point_type (in order to search them)
|
||||||
|
// !_1 . VELCOM
|
||||||
|
// !_18. Fix loading map data in rotated mode (check properly boundaries) +/-
|
||||||
|
|
||||||
|
// not required
|
||||||
// ! 81. Add some objects to POI category (1) to add them into OSM 2) to help navigation)
|
// ! 81. Add some objects to POI category (1) to add them into OSM 2) to help navigation)
|
||||||
// highway (?), traffic_calming (?), barrier(?), military(?-), landuse (?), office(?), man_made(?), power(?),
|
// highway (?), traffic_calming (?), barrier(?), military(?-), landuse (?), office(?), man_made(?), power(?),
|
||||||
// railway( station, subway?) - issue 17
|
// railway( station, subway?) - issue 17
|
||||||
// ! 87. Use network availability for defining loading tiles from internet.
|
// ! 87. Use network availability for defining loading tiles from internet.
|
||||||
// ! 89. Transport redesign UI (enable run from context menu, switch go to goal/not) !
|
|
||||||
// ! 95. Show progress while map rendered and loaded
|
|
||||||
// 90. Use Junidecode library on the client for english translation (for map rendering and other save disk space)
|
|
||||||
|
|
||||||
// outside base 0.4 release
|
// _19. colors for road trunk and motorway
|
||||||
|
// _12. Fix : find proper location for streets ! centralize them (when create index)?
|
||||||
|
// _28. Fix freeze while map downloading (?)
|
||||||
|
|
||||||
|
// Outside base 0.4 release
|
||||||
// 86. Allow to add/edit custom tags to POI objects.
|
// 86. Allow to add/edit custom tags to POI objects.
|
||||||
// 91. Invent binary format (minimize disk space, maximize speed)
|
// 91. Invent binary format (minimize disk space, maximize speed)
|
||||||
// 92. Replace poi index with standard map index and unify POI categories
|
// 92. Replace poi index with standard map index and unify POI categories
|
||||||
// 93. Implement multitype vector objects (?) - building with fence, road & tram ... (binary format)
|
// 94. Revise index to decrease their size (especially address) - replace to float lat/lon and remove for POI
|
||||||
// 94. Revise index to decrease their size (especially address) - replace to float lat/lon
|
// eng_name, possibly remove en part for adress
|
||||||
|
|
||||||
|
|
||||||
// TODO small improvements for release :
|
|
||||||
// 19. colors for road trunk and motorway
|
|
||||||
// 12. Fix : find proper location for streets ! centralize them (when create index)?
|
|
||||||
// 24. +! define clockwise/anticlockwise on android for closed path to understand area outised or inside
|
|
||||||
// fix Rendering for incompleted rings,
|
|
||||||
// fix Index Creator : 1) determine clockwise area (inverse if needed)+ 2) index low level multipolygon pass param +
|
|
||||||
// 3) pass inverse to low level indexes+ 4) coastline / add area +
|
|
||||||
// 5) identify case when there is only inner boundary (!!!!) +
|
|
||||||
// 26. Move leisure below forest and grass layer (footway/cycleway below unspecified)
|
|
||||||
// 25. Add all attributes needed for routing (highway attributes, turn_restrictions)
|
|
||||||
// 27. Fix bug with some buildings in AMS (WTC) that have fence(?)
|
|
||||||
// 28. Fix freeze while map downloading
|
|
||||||
|
|
||||||
// TODO Improvements :
|
|
||||||
// 1! VELCOM
|
|
||||||
// +17. Implement multipolygons to polygons (!?) + coastline - (todo indexCreator)
|
|
||||||
// +23! Remove one bit from type!
|
|
||||||
//+-18. Fix loading map data in rotated mode (check properly boundaries)
|
|
||||||
// 22. Verify all POI has a point_type (in order to search them)
|
|
||||||
|
|
||||||
|
///////////////////////////// UNKNOWN STATE ////////////////////
|
||||||
// Unscheduled (complex)
|
// Unscheduled (complex)
|
||||||
// 65. Intermediate points - for better control routing, to avoid traffic jams ...(?)
|
// 65. Intermediate points - for better control routing, to avoid traffic jams ...(?)
|
||||||
// 63. Support simple offline routing(require new index file) (?)
|
// 63. Support simple offline routing(require index file with turn restrictions etc) (?)
|
||||||
|
|
||||||
// Not clear if it is really needed
|
// Not clear if it is really needed
|
||||||
// 69. Add phone information to POI
|
// 69. Add phone information to POI
|
||||||
|
@ -59,6 +50,7 @@ public class ToDoConstants {
|
||||||
// 83. Add monitoring service to send locations to internet (?)
|
// 83. Add monitoring service to send locations to internet (?)
|
||||||
|
|
||||||
// DONE ANDROID :
|
// DONE ANDROID :
|
||||||
|
// 93. Implement multitype vector objects - building with fence, road & tram ...
|
||||||
|
|
||||||
// DONE SWING
|
// DONE SWING
|
||||||
// 12. Reinvent UI of swing app (remove Region object and clear other MapObject)
|
// 12. Reinvent UI of swing app (remove Region object and clear other MapObject)
|
||||||
|
|
|
@ -1710,11 +1710,11 @@ public class IndexCreator {
|
||||||
// creator.setNodesDBFile(new File("e:/Information/OSM maps/osmand/belarus_nodes.tmp.odb"));
|
// creator.setNodesDBFile(new File("e:/Information/OSM maps/osmand/belarus_nodes.tmp.odb"));
|
||||||
// creator.generateIndexes(new File("e:/Information/OSM maps/belarus osm/belarus_2010_09_03.osm.bz2"), new ConsoleProgressImplementation(3), null);
|
// creator.generateIndexes(new File("e:/Information/OSM maps/belarus osm/belarus_2010_09_03.osm.bz2"), new ConsoleProgressImplementation(3), null);
|
||||||
|
|
||||||
// creator.setNodesDBFile(new File("e:/Information/OSM maps/osmand/ams.tmp.odb"));
|
creator.setNodesDBFile(new File("e:/Information/OSM maps/osmand/ams.tmp.odb"));
|
||||||
// creator.generateIndexes(new File("e:/Information/OSM maps/osm_map/ams_part_map.osm"), new ConsoleProgressImplementation(3), null);
|
creator.generateIndexes(new File("e:/Information/OSM maps/osm_map/ams_part_map.osm"), new ConsoleProgressImplementation(3), null);
|
||||||
|
|
||||||
creator.setNodesDBFile(new File("e:/Information/OSM maps/osmand/den_haag.tmp.odb"));
|
// creator.setNodesDBFile(new File("e:/Information/OSM maps/osmand/den_haag.tmp.odb"));
|
||||||
creator.generateIndexes(new File("e:/Information/OSM maps/osm_map/den_haag.osm"), new ConsoleProgressImplementation(3), null);
|
// creator.generateIndexes(new File("e:/Information/OSM maps/osm_map/den_haag.osm"), new ConsoleProgressImplementation(3), null);
|
||||||
|
|
||||||
// creator.setNodesDBFile(new File("e:/Information/OSM maps/osmand/one.tmp.odb"));
|
// creator.setNodesDBFile(new File("e:/Information/OSM maps/osmand/one.tmp.odb"));
|
||||||
// creator.generateIndexes(new File("e:/Information/OSM maps/osm_map/one_multipolygon.osm"), new ConsoleProgressImplementation(3), null);
|
// creator.generateIndexes(new File("e:/Information/OSM maps/osm_map/one_multipolygon.osm"), new ConsoleProgressImplementation(3), null);
|
||||||
|
|
|
@ -93,23 +93,47 @@ public class MapRenderObject {
|
||||||
|
|
||||||
public float getMapOrder(){
|
public float getMapOrder(){
|
||||||
if (order == -1) {
|
if (order == -1) {
|
||||||
int oType = MapRenderingTypes.getMainObjectType(type >> 1);
|
order = getOrder(getMainType());
|
||||||
int sType = MapRenderingTypes.getObjectSubType(type >> 1);
|
}
|
||||||
if (isMultiPolygon() || isPolygon()) {
|
return order;
|
||||||
// 1 - 9
|
}
|
||||||
if (oType == MapRenderingTypes.MAN_MADE && sType == MapRenderingTypes.SUBTYPE_BUILDING) {
|
|
||||||
// draw over lines
|
public static float getOrder(int wholeType) {
|
||||||
|
float order = 0;
|
||||||
|
int t = wholeType & 3;
|
||||||
|
int oType = MapRenderingTypes.getMainObjectType(wholeType);
|
||||||
|
int sType = MapRenderingTypes.getObjectSubType(wholeType);
|
||||||
|
int layer = MapRenderingTypes.getWayLayer(wholeType);
|
||||||
|
if (t == MapRenderingTypes.MULTY_POLYGON_TYPE || t == MapRenderingTypes.POLYGON_TYPE) {
|
||||||
|
// 1 - 9
|
||||||
|
if (oType == MapRenderingTypes.MAN_MADE && sType == MapRenderingTypes.SUBTYPE_BUILDING) {
|
||||||
|
// draw over lines
|
||||||
|
if(layer != 1){
|
||||||
|
order = 64;
|
||||||
|
} else {
|
||||||
|
order = 2;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(layer == 1){
|
||||||
|
order = 0.5f;
|
||||||
|
} else if(layer == 2){
|
||||||
|
// over lines
|
||||||
order = 64;
|
order = 64;
|
||||||
} else if (oType == MapRenderingTypes.LANDUSE) {
|
} else if (oType == MapRenderingTypes.LANDUSE) {
|
||||||
switch (sType) {
|
switch (sType) {
|
||||||
case 5: case 6: case 15: case 18: case 20: case 23:
|
case 5:
|
||||||
|
case 6:
|
||||||
|
case 15:
|
||||||
|
case 18:
|
||||||
|
case 20:
|
||||||
|
case 23:
|
||||||
order = 1;
|
order = 1;
|
||||||
break;
|
break;
|
||||||
case 22:
|
case 22:
|
||||||
order = 5;
|
order = 5;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
order = 1.5f;
|
order = 1f;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else if (oType == MapRenderingTypes.LEISURE) {
|
} else if (oType == MapRenderingTypes.LEISURE) {
|
||||||
|
@ -117,66 +141,66 @@ public class MapRenderObject {
|
||||||
case 3:
|
case 3:
|
||||||
case 10:
|
case 10:
|
||||||
case 13:
|
case 13:
|
||||||
order = 4;
|
order = 2;
|
||||||
break;
|
break;
|
||||||
|
case 6:
|
||||||
|
order = 4;
|
||||||
default:
|
default:
|
||||||
order = 1;
|
order = 2;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else if (oType == MapRenderingTypes.POWER) {
|
} else if (oType == MapRenderingTypes.POWER) {
|
||||||
order = 4;
|
order = 4;
|
||||||
} else if (oType == MapRenderingTypes.WATERWAY || oType == MapRenderingTypes.NATURAL) {
|
} else if (oType == MapRenderingTypes.NATURAL) {
|
||||||
|
if (order == 5) {
|
||||||
|
// coastline
|
||||||
|
order = 0.5f;
|
||||||
|
} else if (order == 21) {
|
||||||
|
// water
|
||||||
|
order = 5;
|
||||||
|
} else {
|
||||||
|
order = 1;
|
||||||
|
}
|
||||||
|
} else if (oType == MapRenderingTypes.WATERWAY) {
|
||||||
// water 5
|
// water 5
|
||||||
order = 5;
|
order = 5;
|
||||||
} else {
|
} else {
|
||||||
order = 1;
|
order = 1;
|
||||||
}
|
}
|
||||||
} else if (isPolyLine()) {
|
|
||||||
// 10 - 68
|
|
||||||
int layer = MapRenderingTypes.getWayLayer(type >> 1);
|
|
||||||
if(layer == 1 && oType != MapRenderingTypes.RAILWAY){
|
|
||||||
// not subway especially
|
|
||||||
order = 10;
|
|
||||||
} else if(layer == 2) {
|
|
||||||
order = 67; // over buildings
|
|
||||||
} else if (oType == MapRenderingTypes.HIGHWAY) {
|
|
||||||
order = 32 - sType + 24;
|
|
||||||
if(sType == MapRenderingTypes.PL_HW_MOTORWAY){
|
|
||||||
// TODO ? that was done only to have good overlay
|
|
||||||
// but really it should be motorway_link have -= 10
|
|
||||||
order -= 2;
|
|
||||||
}
|
|
||||||
} else if (oType == MapRenderingTypes.RAILWAY) {
|
|
||||||
order = 58;
|
|
||||||
} else if (oType == MapRenderingTypes.AERIALWAY) {
|
|
||||||
order = 68; // over buildings
|
|
||||||
} else if (oType == MapRenderingTypes.POWER) {
|
|
||||||
order = 68; // over buildings
|
|
||||||
} else if (oType == MapRenderingTypes.ADMINISTRATIVE) {
|
|
||||||
order = 62;
|
|
||||||
} else if (oType == MapRenderingTypes.WATERWAY) {
|
|
||||||
order = 18;
|
|
||||||
} else {
|
|
||||||
order = 10;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
order = 128;
|
|
||||||
}
|
}
|
||||||
|
} else if (t == MapRenderingTypes.POLYLINE_TYPE) {
|
||||||
|
// 10 - 68
|
||||||
|
if(layer == 1 && oType != MapRenderingTypes.RAILWAY){
|
||||||
|
// not subway especially
|
||||||
|
order = 10;
|
||||||
|
} else if(layer == 2) {
|
||||||
|
order = 67; // over buildings
|
||||||
|
} else if (oType == MapRenderingTypes.HIGHWAY) {
|
||||||
|
order = 32 - sType + 24;
|
||||||
|
if(sType == MapRenderingTypes.PL_HW_MOTORWAY){
|
||||||
|
// TODO ? that was done only to have good overlay
|
||||||
|
// but really it should be motorway_link have -= 10
|
||||||
|
order -= 2;
|
||||||
|
}
|
||||||
|
} else if (oType == MapRenderingTypes.RAILWAY) {
|
||||||
|
order = 58;
|
||||||
|
} else if (oType == MapRenderingTypes.AERIALWAY) {
|
||||||
|
order = 68; // over buildings
|
||||||
|
} else if (oType == MapRenderingTypes.POWER) {
|
||||||
|
order = 68; // over buildings
|
||||||
|
} else if (oType == MapRenderingTypes.ADMINISTRATIVE) {
|
||||||
|
order = 62;
|
||||||
|
} else if (oType == MapRenderingTypes.WATERWAY) {
|
||||||
|
order = 18;
|
||||||
|
} else {
|
||||||
|
order = 10;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
order = 128;
|
||||||
}
|
}
|
||||||
return order;
|
return order;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private boolean isMultiPolygon(){
|
|
||||||
return ((type >> 1) & 3) == MapRenderingTypes.MULTY_POLYGON_TYPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isPolygon(){
|
|
||||||
return ((type >> 1) & 3) == MapRenderingTypes.POLYGON_TYPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isPolyLine(){
|
|
||||||
return ((type >> 1) & 3) == MapRenderingTypes.POLYLINE_TYPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,16 +17,16 @@ import net.osmand.osm.OSMSettings.OSMTagKey;
|
||||||
*/
|
*/
|
||||||
public class MapRenderingTypes {
|
public class MapRenderingTypes {
|
||||||
|
|
||||||
|
// TODO Internet access bits for point, polygon
|
||||||
/** standard schema :
|
/** standard schema :
|
||||||
Last bit describe whether types additional exist
|
Last bit describe whether types additional exist (it is needed only for main type, other consists only from 15 bits)
|
||||||
polygon : aaaaa ttttt 11 : 26 bits + 6 bits for special info
|
polygon : aaaaa ttttt 11 _ : 15 bits
|
||||||
t - object type, a - area subtype, p - point object type, s - point object subtype
|
multi : aaaaa ttttt 00 _ : 15 bits
|
||||||
multi :
|
t - object type, a - area subtype,l - layer
|
||||||
polyline : ppppp ttttt 10 : 13 bits + 19 bits for special info
|
polyline : ll ppppp ttttt 10 _ : 15 bits + 2 bits for special info (+16)
|
||||||
t - object type, p - polyline object type,
|
t - object type, p - polyline object type, l - layer
|
||||||
point : ssssssss ttttt 10 : 16 bits + 16 bits for special info
|
point : ssssssss ttttt 10 _ : 16 bits
|
||||||
t - object type, a - subtype
|
t - object type, a - subtype
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public final static int MULTY_POLYGON_TYPE = 0;
|
public final static int MULTY_POLYGON_TYPE = 0;
|
||||||
|
@ -53,7 +53,6 @@ public class MapRenderingTypes {
|
||||||
public final static char REF_CHAR = ((char)0x0019);
|
public final static char REF_CHAR = ((char)0x0019);
|
||||||
|
|
||||||
|
|
||||||
// TODO Internet access bits for point
|
|
||||||
public final static int HIGHWAY = 1;
|
public final static int HIGHWAY = 1;
|
||||||
public final static int BARRIER = 2;
|
public final static int BARRIER = 2;
|
||||||
public final static int WATERWAY = 3;
|
public final static int WATERWAY = 3;
|
||||||
|
@ -128,26 +127,6 @@ public class MapRenderingTypes {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*public static int getPolygonSubType(int type) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int getPolygonPointType(int type) {
|
|
||||||
return (type >> (TYPE_MASK_LEN + OBJ_TYPE_MASK_LEN + PG_SUBTYPE_MASK_LEN)) & OBJ_TYPE_MASK;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int getPolygonPointSubType(int type) {
|
|
||||||
return (type >> (TYPE_MASK_LEN + OBJ_TYPE_MASK_LEN + PG_SUBTYPE_MASK_LEN + OBJ_TYPE_MASK_LEN)) & PO_SUBTYPE_MASK;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int getPolylineSubType(int type) {
|
|
||||||
return (type >> (TYPE_MASK_LEN + OBJ_TYPE_MASK_LEN)) & PL_SUBTYPE_MASK;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int getPointSubType(int type) {
|
|
||||||
return (type >> (TYPE_MASK_LEN + OBJ_TYPE_MASK_LEN)) & PO_SUBTYPE_MASK;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
// stored information to convert from osm tags to int type
|
// stored information to convert from osm tags to int type
|
||||||
private static Map<String, MapRulType> types = null;
|
private static Map<String, MapRulType> types = null;
|
||||||
|
@ -300,7 +279,8 @@ public class MapRenderingTypes {
|
||||||
}
|
}
|
||||||
} else if (polygon && (pr == POLYGON_WITH_CENTER_TYPE || pr == POLYGON_TYPE)) {
|
} else if (polygon && (pr == POLYGON_WITH_CENTER_TYPE || pr == POLYGON_TYPE)) {
|
||||||
boolean prevPoint = (polylineType == 0 && polygonType == 0);
|
boolean prevPoint = (polylineType == 0 && polygonType == 0);
|
||||||
polygonType = (multipolygon ? MULTY_POLYGON_TYPE : POLYGON_TYPE) | (typeVal & MASK_12);
|
int attr = getLayerAttributes(e) << 12;
|
||||||
|
polygonType = (multipolygon ? MULTY_POLYGON_TYPE : POLYGON_TYPE) | (typeVal & MASK_12) | attr;
|
||||||
if (prevPoint){
|
if (prevPoint){
|
||||||
addTypes.add(0, polygonType);
|
addTypes.add(0, polygonType);
|
||||||
} else {
|
} else {
|
||||||
|
@ -351,7 +331,7 @@ public class MapRenderingTypes {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isOneWayWay(int type){
|
public static boolean isOneWayWay(int type){
|
||||||
return ((1 << 14) & type) > 0;
|
return ((1 << 15) & type) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 0 - normal, 1 - under, 2 - bridge,over
|
// 0 - normal, 1 - under, 2 - bridge,over
|
||||||
|
@ -591,6 +571,7 @@ public class MapRenderingTypes {
|
||||||
register("barrier", "hedge", BARRIER, 1, POLYLINE_TYPE); //$NON-NLS-1$ //$NON-NLS-2$
|
register("barrier", "hedge", BARRIER, 1, POLYLINE_TYPE); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
register("natural", "hedge", BARRIER, 1, POLYLINE_TYPE); //$NON-NLS-1$ //$NON-NLS-2$
|
register("natural", "hedge", BARRIER, 1, POLYLINE_TYPE); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
register("barrier", "fence", BARRIER, 2, POLYLINE_TYPE); //$NON-NLS-1$ //$NON-NLS-2$
|
register("barrier", "fence", BARRIER, 2, POLYLINE_TYPE); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
|
register("fenced", "yes", BARRIER, 2, POLYLINE_TYPE); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
register("barrier", "wall", BARRIER, 3, POLYLINE_TYPE); //$NON-NLS-1$ //$NON-NLS-2$
|
register("barrier", "wall", BARRIER, 3, POLYLINE_TYPE); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
register("barrier", "ditch", BARRIER, 1, POLYLINE_TYPE); //$NON-NLS-1$ //$NON-NLS-2$
|
register("barrier", "ditch", BARRIER, 1, POLYLINE_TYPE); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
register("barrier", "retaining_wall", BARRIER, 4, POLYLINE_TYPE); //$NON-NLS-1$ //$NON-NLS-2$
|
register("barrier", "retaining_wall", BARRIER, 4, POLYLINE_TYPE); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
|
|
|
@ -7,6 +7,7 @@ import java.util.Comparator;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
|
||||||
import net.osmand.LogUtil;
|
import net.osmand.LogUtil;
|
||||||
import net.osmand.R;
|
import net.osmand.R;
|
||||||
|
@ -38,7 +39,7 @@ import android.graphics.Shader.TileMode;
|
||||||
import android.text.TextPaint;
|
import android.text.TextPaint;
|
||||||
import android.util.FloatMath;
|
import android.util.FloatMath;
|
||||||
|
|
||||||
public class OsmandRenderer implements Comparator<MapRenderObject> {
|
public class OsmandRenderer {
|
||||||
private static final Log log = LogUtil.getLog(OsmandRenderer.class);
|
private static final Log log = LogUtil.getLog(OsmandRenderer.class);
|
||||||
|
|
||||||
private TextPaint paintText;
|
private TextPaint paintText;
|
||||||
|
@ -244,20 +245,36 @@ public class OsmandRenderer implements Comparator<MapRenderObject> {
|
||||||
return shaders.get(resId);
|
return shaders.get(resId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
private <K,T>void put(Map<K, List<T>> map, K k, T v, int init){
|
||||||
public int compare(MapRenderObject object1, MapRenderObject object2) {
|
if(!map.containsKey(k)){
|
||||||
float o1 = object1.getMapOrder();
|
map.put(k, new ArrayList<T>(init));
|
||||||
float o2 = object2.getMapOrder();
|
}
|
||||||
return o1 < o2 ? -1 : (o1 == o2 ? 0 : 1);
|
map.get(k).add(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public Bitmap generateNewBitmap(int width, int height, float leftTileX, float topTileY,
|
public Bitmap generateNewBitmap(int width, int height, float leftTileX, float topTileY,
|
||||||
List<MapRenderObject> objects, int zoom, float rotate) {
|
List<MapRenderObject> objects, int zoom, float rotate) {
|
||||||
long now = System.currentTimeMillis();
|
long now = System.currentTimeMillis();
|
||||||
|
// put in order map
|
||||||
|
int sz = objects.size();
|
||||||
|
int init = sz / 4;
|
||||||
|
TreeMap<Float, List<Integer>> orderMap = new TreeMap<Float, List<Integer>>();
|
||||||
|
for (int i = 0; i < sz; i++) {
|
||||||
|
MapRenderObject o = objects.get(i);
|
||||||
|
int mt = o.getMainType();
|
||||||
|
int sh = i << 8;
|
||||||
|
put(orderMap, MapRenderObject.getOrder(mt), sh + 1, init);
|
||||||
|
int s = o.getSecondType();
|
||||||
|
if (s != 0) {
|
||||||
|
put(orderMap, MapRenderObject.getOrder(s), sh + 2, init);
|
||||||
|
}
|
||||||
|
byte multiTypes = o.getMultiTypes();
|
||||||
|
for (int j = 0; j < multiTypes; j++) {
|
||||||
|
put(orderMap, MapRenderObject.getOrder(o.getAdditionalType(j)), sh + (j + 3), init);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Collections.sort(objects, this);
|
|
||||||
Bitmap bmp = null;
|
Bitmap bmp = null;
|
||||||
if (objects != null && !objects.isEmpty() && width > 0 && height > 0) {
|
if (objects != null && !objects.isEmpty() && width > 0 && height > 0) {
|
||||||
// init rendering context
|
// init rendering context
|
||||||
|
@ -275,8 +292,20 @@ public class OsmandRenderer implements Comparator<MapRenderObject> {
|
||||||
|
|
||||||
Canvas cv = new Canvas(bmp);
|
Canvas cv = new Canvas(bmp);
|
||||||
cv.drawRect(0, 0, bmp.getWidth(), bmp.getHeight(), paintFillEmpty);
|
cv.drawRect(0, 0, bmp.getWidth(), bmp.getHeight(), paintFillEmpty);
|
||||||
for (MapRenderObject o : objects) {
|
for (List<Integer> list : orderMap.values()) {
|
||||||
draw(o, cv, rc);
|
for (Integer i : list) {
|
||||||
|
int ind = i >> 8;
|
||||||
|
int l = i & 0xff;
|
||||||
|
MapRenderObject obj = objects.get(ind);
|
||||||
|
if (l == 1) {
|
||||||
|
// show text only for main type
|
||||||
|
drawObj(obj, cv, rc, obj.getMainType(), true);
|
||||||
|
} else if (l == 2) {
|
||||||
|
drawObj(obj, cv, rc, obj.getSecondType(), false);
|
||||||
|
} else {
|
||||||
|
drawObj(obj, cv, rc, obj.getAdditionalType(l - 3), false);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for(IconDrawInfo icon : rc.iconsToDraw){
|
for(IconDrawInfo icon : rc.iconsToDraw){
|
||||||
if(icon.resId != 0){
|
if(icon.resId != 0){
|
||||||
|
@ -451,22 +480,19 @@ public class OsmandRenderer implements Comparator<MapRenderObject> {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
protected PointF drawObj(MapRenderObject obj, Canvas canvas, RenderingContext rc, int mainType, boolean renderText, PointF center) {
|
protected void drawObj(MapRenderObject obj, Canvas canvas, RenderingContext rc, int mainType, boolean renderText) {
|
||||||
if(mainType == 0){
|
|
||||||
return center;
|
|
||||||
}
|
|
||||||
int t = mainType & 3;
|
int t = mainType & 3;
|
||||||
int type = MapRenderingTypes.getMainObjectType(mainType);
|
int type = MapRenderingTypes.getMainObjectType(mainType);
|
||||||
int subtype = MapRenderingTypes.getObjectSubType(mainType);
|
int subtype = MapRenderingTypes.getObjectSubType(mainType);
|
||||||
if(t == MapRenderingTypes.POINT_TYPE){
|
if(t == MapRenderingTypes.POINT_TYPE){
|
||||||
drawPoint(obj, canvas, rc, null, type, subtype, renderText);
|
drawPoint(obj, canvas, rc, type, subtype, renderText);
|
||||||
} else if(t == MapRenderingTypes.POLYLINE_TYPE){
|
} else if(t == MapRenderingTypes.POLYLINE_TYPE){
|
||||||
drawPolyline(obj, canvas, rc, type, subtype, mainType);
|
drawPolyline(obj, canvas, rc, type, subtype, mainType);
|
||||||
} else {
|
} else {
|
||||||
if(t == MapRenderingTypes.MULTY_POLYGON_TYPE && !(obj instanceof MultyPolygon)){
|
if(t == MapRenderingTypes.MULTY_POLYGON_TYPE && !(obj instanceof MultyPolygon)){
|
||||||
return center;
|
return;
|
||||||
}
|
}
|
||||||
center = drawPolygon(obj, canvas, rc, type, subtype, t == MapRenderingTypes.MULTY_POLYGON_TYPE);
|
PointF center = drawPolygon(obj, canvas, rc, type, subtype, t == MapRenderingTypes.MULTY_POLYGON_TYPE);
|
||||||
String name = obj.getName();
|
String name = obj.getName();
|
||||||
if(name != null && center != null){
|
if(name != null && center != null){
|
||||||
rc.clearText();
|
rc.clearText();
|
||||||
|
@ -479,31 +505,8 @@ public class OsmandRenderer implements Comparator<MapRenderObject> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return center;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void draw(MapRenderObject obj, Canvas canvas, RenderingContext rc) {
|
|
||||||
int mainType = obj.getMainType();
|
|
||||||
int t = mainType & 3;
|
|
||||||
int sz = rc.textToDraw.size();
|
|
||||||
PointF center = null;
|
|
||||||
center = drawObj(obj, canvas, rc, mainType, sz == rc.textToDraw.size(), center);
|
|
||||||
if (t != MapRenderingTypes.POINT_TYPE) {
|
|
||||||
int second = obj.getSecondType();
|
|
||||||
if (second != 0) {
|
|
||||||
center = drawObj(obj, canvas, rc, second, sz == rc.textToDraw.size(), center);
|
|
||||||
}
|
|
||||||
if (obj.isMultitype()) {
|
|
||||||
byte ts = obj.getMultiTypes();
|
|
||||||
for (int k = 0; k < ts; k++) {
|
|
||||||
center = drawObj(obj, canvas, rc, obj.getAdditionalType(k), sz == rc.textToDraw.size(), center);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private PointF calcPoint(MapRenderObject o, int ind, RenderingContext rc){
|
private PointF calcPoint(MapRenderObject o, int ind, RenderingContext rc){
|
||||||
rc.pointCount ++;
|
rc.pointCount ++;
|
||||||
|
@ -613,16 +616,24 @@ public class OsmandRenderer implements Comparator<MapRenderObject> {
|
||||||
shaders.clear();
|
shaders.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void drawPoint(MapRenderObject obj, Canvas canvas, RenderingContext rc, PointF p, int type, int subtype, boolean renderText) {
|
private void drawPoint(MapRenderObject obj, Canvas canvas, RenderingContext rc, int type, int subtype, boolean renderText) {
|
||||||
if (p == null) {
|
int len = obj.getPointsLength();
|
||||||
p = calcPoint(obj, 0, rc);
|
PointF ps = new PointF(0, 0);
|
||||||
|
for (int i = 0; i < len; i++) {
|
||||||
|
PointF p = calcPoint(obj, i, rc);
|
||||||
|
ps.x += p.x;
|
||||||
|
ps.y += p.y;
|
||||||
|
}
|
||||||
|
if(len > 1){
|
||||||
|
ps.x /= len;
|
||||||
|
ps.y /= len;
|
||||||
}
|
}
|
||||||
int zoom = rc.zoom;
|
int zoom = rc.zoom;
|
||||||
int resId = PointRenderer.getPointBitmap(zoom, type, subtype);
|
int resId = PointRenderer.getPointBitmap(zoom, type, subtype);
|
||||||
if(resId != 0){
|
if(resId != 0){
|
||||||
IconDrawInfo ico = new IconDrawInfo();
|
IconDrawInfo ico = new IconDrawInfo();
|
||||||
ico.x = p.x;
|
ico.x = ps.x;
|
||||||
ico.y = p.y;
|
ico.y = ps.y;
|
||||||
ico.resId = resId;
|
ico.resId = resId;
|
||||||
rc.iconsToDraw.add(ico);
|
rc.iconsToDraw.add(ico);
|
||||||
}
|
}
|
||||||
|
@ -633,7 +644,7 @@ public class OsmandRenderer implements Comparator<MapRenderObject> {
|
||||||
n = renderObjectText(n, subtype, type, zoom, true, rc);
|
n = renderObjectText(n, subtype, type, zoom, true, rc);
|
||||||
if (rc.textSize > 0 && n != null) {
|
if (rc.textSize > 0 && n != null) {
|
||||||
TextDrawInfo info = new TextDrawInfo(n);
|
TextDrawInfo info = new TextDrawInfo(n);
|
||||||
info.fillProperties(rc, p.x, p.y);
|
info.fillProperties(rc, ps.x, ps.y);
|
||||||
rc.textToDraw.add(info);
|
rc.textToDraw.add(info);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue