Hi Gerd

Here is an updated patch with the naming changes.

Ticker

On Wed, 2021-01-06 at 09:35 +0000, Gerd Petermann wrote:
> Hi Ticker,
> 
> OK regarding the naming.
> I think what I tried to point out is that the overview map probably
> never suffers the problem that should be solved with the order-by
> stuff, but on the other hand we really want to keep that map as small
> as possible to allow continent or maybe even planet wide overview
> maps.  So, I really prefer to enable the shape merging for the
> overview map.
> A possible work around might be to merge the shapes before
> MapSplitter is executed. The number of points is rather small, so
> performance shouldn't be a problem as it is with real OSM data. We
> might even use java.awt.area for that.
> Another question is if the --order-by could/should be disabled for
> the ovm_ maps.
> 
> Gerd
> 
> ________________________________________
> Von: mkgmap-dev <mkgmap-dev-boun...@lists.mkgmap.org.uk> im Auftrag
> von Ticker Berkin <rwb-mkg...@jagit.co.uk>
> Gesendet: Mittwoch, 6. Januar 2021 10:19
> An: Development list for mkgmap
> Betreff: Re: [mkgmap-dev] Tiles pruned in DEM map
> 
> Hi Gerd
> 
> Sorry about overview-dem-dists.
> 
> I'd prefer the Map variable to be called IsOverviewComponent to make
> clear the distinction between the 2 types of overview and to be
> consistent with the names used in MapBuilder. I can do a patch to
> this
> effect.
> 
> --order-by is expected to increase the map size a bit; extra polygon
> splitting (in the ovm_ and carried into the composite) is performed
> so
> that all polygons at any given point are in the same subdivision and
> some merges (in both the ovm_ and the composite) are inhibited.
> 
> An overview map is unlikely to have multiple overlayed polygons so
> probably there won't be any cases where a fixed _drawOrder couldn't
> be
> defined correctly, but it exists with the detail tiles that need a
> TYP
> where all _drawOrders are equal.
> 
> Ticker
> 
> On Tue, 2021-01-05 at 15:35 +0000, Gerd Petermann wrote:
> > Hi Ticker,
> > 
> > there is a typo in the patch, overview-dem-dists instead of
> > overview
> > -dem-dist. My rather small overview map got 20MB instead of 181K ;)
> > I also didn't like the idea that the overview map is recognized by
> > the name. That can lead to strange effects with test maps, so I
> > added
> > a parameter.
> > 
> > With the corrections the size increases by only by 5K, but I have
> > no
> > idea how these 5K improve the map.
> > I see one small difference where a label of a lake (1)  is placed a
> > bit of the center. The "patched" map contains two polygons for this
> > lake, I assume the Garmin software avoids to render its name twice
> > but uses a different algo to calculate the position. These are the
> > results for my own style, a variant of Minkos OpenFietsMap Light
> > style.
> > Will try again with default style and type file sameOrder.txt.
> > 
> > Gerd
> > (1)
> > https://www.openstreetmap.org/relation/3582977#map=14/53.5815/11.19
> > 91
> > 
> > ________________________________________
> > Von: mkgmap-dev <mkgmap-dev-boun...@lists.mkgmap.org.uk> im Auftrag
> > von Ticker Berkin <rwb-mkg...@jagit.co.uk>
> > Gesendet: Dienstag, 5. Januar 2021 10:58
> > An: Development list for mkgmap
> > Betreff: Re: [mkgmap-dev] Tiles pruned in DEM map
> > 
> > Hi Gerd
> > 
> > shapeMergeFilter.merge() sorts the shapes according to typ,
> > skipSize,
> > fullArea and name. For --order-by to work for the overview, this
> > must
> > not happen; the order in the ovm_ files must be used. This is the
> > same
> > idea as when the more than 1 detail tiles are displayed on a
> > device.
> > 
> > The size of osmmap.img for my test area, with the patch, is:
> >  9216 --no-order-by-decreasing-area throughout
> > 10752 --order-by-decreasing-area throughout
> >  9219 --order-by-decreasing-area at start,
> >       --no-order-by-decreasing-area for the combiners
> > So, there is a slight increase, as expected, it really isn't of any
> > significance.
> > 
> > --order-by-decreasing-area needs to be applied to both phases for
> > it
> > to
> > work correctly.
> > 
> > If applied to the tile phase only, the overview map will render
> > polygons in order of the results of the the shapeMergeFilter.
> > 
> > If applied to the overview phase only, probably similar; the order
> > of
> > the shapeMergeFilter governed ordering in the ovm_ .img
> > 
> > Ticker
> > 
> > On Mon, 2021-01-04 at 18:52 +0000, Gerd Petermann wrote:
> > > Hi Ticker,
> > > 
> > > thanks for the patch. I'll have a closer look during the next
> > > days.
> > > I
> > > don't yet understand why shapes aren't always merged.
> > > What is the impact on the size of the overview map? What happens
> > > for
> > > those users who create the overview map in an extra step that
> > > doesn't
> > > have the --order-by-decreasing-area option? What happens when
> > > it's
> > > the other way around, no --order-by-decreasing-area option for
> > > the
> > > tiles but --order-by-decreasing-area for the overview map?
> > > 
> > > Gerd
> > 
> > _______________________________________________
> > mkgmap-dev mailing list
> > mkgmap-dev@lists.mkgmap.org.uk
> > http://www.mkgmap.org.uk/mailman/listinfo/mkgmap-dev
> > _______________________________________________
> > mkgmap-dev mailing list
> > mkgmap-dev@lists.mkgmap.org.uk
> > http://www.mkgmap.org.uk/mailman/listinfo/mkgmap-dev
> _______________________________________________
> mkgmap-dev mailing list
> mkgmap-dev@lists.mkgmap.org.uk
> http://www.mkgmap.org.uk/mailman/listinfo/mkgmap-dev
> _______________________________________________
> mkgmap-dev mailing list
> mkgmap-dev@lists.mkgmap.org.uk
> http://www.mkgmap.org.uk/mailman/listinfo/mkgmap-dev
Index: src/uk/me/parabola/imgfmt/app/map/Map.java
===================================================================
--- src/uk/me/parabola/imgfmt/app/map/Map.java	(revision 4593)
+++ src/uk/me/parabola/imgfmt/app/map/Map.java	(working copy)
@@ -70,6 +70,7 @@
 	private NETFile netFile;
 	private NODFile nodFile;
 	private DEMFile demFile;
+	private boolean isOverviewCombined;
 
 	// Use createMap() or loadMap() instead of creating a map directly.
 	private Map() {
@@ -89,7 +90,7 @@
 	 * @throws FileNotWritableException If the file cannot
 	 * be opened for write.
 	 */
-	public static Map createMap(String mapname, String outputdir, FileSystemParam params, String mapnumber, Sort sort)
+	public static Map createMap(String mapname, String outputdir, FileSystemParam params, String mapnumber, Sort sort, boolean overviewCombined)
 			throws FileExistsException, FileNotWritableException
 	{
 		Map m = new Map();
@@ -103,6 +104,7 @@
 		m.rgnFile = new RGNFile(m.fileSystem.create(mapnumber + ".RGN"));
 		m.treFile = new TREFile(m.fileSystem.create(mapnumber + ".TRE"));
 		m.lblFile = new LBLFile(m.fileSystem.create(mapnumber + ".LBL"), sort);
+		m.isOverviewCombined = overviewCombined;
 
 		int mapid;
 		try {
@@ -118,8 +120,9 @@
 	}
 
 	public void config(EnhancedProperties props) {
+		boolean isOverviewComponent = OverviewBuilder.isOverviewImg(mapName);
 		// we don't want routing info in the overview map (for now)
-		if (!OverviewBuilder.isOverviewImg(mapName)){
+		if (!isOverviewComponent && !isOverviewCombined) {
 			try {
 				if (props.containsKey("route") || props.containsKey("net") || props.containsKey("housenumbers")) {
 					addNet();
@@ -130,6 +133,11 @@
 			} catch (FileExistsException e) {
 				log.warn("Could not add NET and/or NOD sections");
 			}
+			// this sets things like draw-priority/transparent/custom
+			// and not relevant to overview maps
+			treFile.config(props);
+		}
+		if (!isOverviewComponent) { // allow dem on final overview but not in the ovm_
 			if (props.containsKey("dem")) {
 				try {
 					addDem();
@@ -138,7 +146,6 @@
 				}
 			}
 		}
-		treFile.config(props);
 	}
 
 	private void addNet() throws FileExistsException {
Index: src/uk/me/parabola/mkgmap/build/MapBuilder.java
===================================================================
--- src/uk/me/parabola/mkgmap/build/MapBuilder.java	(revision 4593)
+++ src/uk/me/parabola/mkgmap/build/MapBuilder.java	(working copy)
@@ -127,6 +127,9 @@
 	
 	private static final int MIN_SIZE_LINE = 1;
 
+	private final boolean isOverviewComponent;
+	private final boolean isOverviewCombined;
+
 	private final java.util.Map<MapPoint,POIRecord> poimap = new HashMap<>();
 	private final java.util.Map<MapPoint,City> cityMap = new HashMap<>();
 	private List<String> mapInfo = new ArrayList<>();
@@ -175,10 +178,12 @@
 	private HGTConverter.InterpolationMethod demInterpolationMethod;
 	
 
-	public MapBuilder() {
+	public MapBuilder(boolean overviewComponent, boolean overviewCombined) {
 		regionName = null;
 		locationAutofill = Collections.emptySet();
 		locator = new Locator();
+		this.isOverviewComponent = overviewComponent;
+		this.isOverviewCombined = overviewCombined;
 	}
 
 	public void config(EnhancedProperties props) {
@@ -218,7 +223,7 @@
 			driveOnLeft = false;
 		orderByDecreasingArea = props.getProperty("order-by-decreasing-area", false);
 		pathsToHGT = props.getProperty("dem", null);
-		demDists = parseDemDists(props.getProperty("dem-dists", "-1"));
+		String demDistStr = props.getProperty("dem-dists", "-1");
 		demOutsidePolygonHeight = (short) props.getProperty("dem-outside-polygon", HGTReader.UNDEF);
 		String demPolygonFile = props.getProperty("dem-poly", null);
 		if (demPolygonFile != null) {
@@ -239,6 +244,18 @@
 			throw new IllegalArgumentException("invalid argument for option dem-interpolation: '" + ipm + 
 					"' supported are 'bilinear', 'bicubic', or 'auto'");
 		}
+
+		if (isOverviewCombined) { // some alternate options, some invalid etc
+			demDistStr = props.getProperty("overview-dem-dist", "-1");
+			mergeLines = true;
+			if (orderByDecreasingArea) {
+				orderByDecreasingArea = false;
+				mergeShapes = false;  // shape order in ovm_ imgs must be preserved to have the effect of above 
+			} else {
+				mergeShapes = true;
+			}
+		}
+		demDists = parseDemDists(demDistStr);
 	}
 
 	private static List<Integer> parseDemDists(String demDists) {
@@ -339,7 +356,7 @@
 					demArea = demPolygon;
 				}
 			} 
-			if (demArea == null && src instanceof OverviewMapDataSource) {
+			if (demArea == null && isOverviewCombined) {
 				Path2D demPoly = ((OverviewMapDataSource) src).getTileAreaPath();
 				if (demPoly != null) {
 					demArea = new java.awt.geom.Area(demPoly);
@@ -732,12 +749,11 @@
 		// The top level has to cover the whole map without subdividing, so
 		// do a special check to make sure.
 		LevelInfo[] levels = null;
-		if (src instanceof OverviewMapDataSource) {
-			mergeLines = true;
-			prepShapesForMerge(src.getShapes());
-			mergeShapes = true;
+		if (isOverviewCombined) {
+			if (mergeShapes)
+				prepShapesForMerge(src.getShapes());
 			levels = src.mapLevels();
-		} else if (OverviewBuilder.isOverviewImg(map.getFilename())) {
+		} else if (isOverviewComponent) {
 			levels = src.overviewMapLevels();
 		} else {
 			levels = src.mapLevels();
@@ -967,7 +983,7 @@
 	private void processInfo(Map map, LoadableMapDataSource src) {
 		// The bounds of the map.
 		map.setBounds(src.getBounds());
-		if (!(src instanceof OverviewMapDataSource))
+		if (!isOverviewCombined)
 			poiDisplayFlags |= TREHeader.POI_FLAG_DETAIL;
 			
 		poiDisplayFlags |= src.getPoiDispFlag();
Index: src/uk/me/parabola/mkgmap/combiners/OverviewBuilder.java
===================================================================
--- src/uk/me/parabola/mkgmap/combiners/OverviewBuilder.java	(revision 4593)
+++ src/uk/me/parabola/mkgmap/combiners/OverviewBuilder.java	(working copy)
@@ -65,8 +65,9 @@
 	private LevelInfo[] wantedLevels;
 	private Area bounds;
 	private boolean hasBackground;
-	private EnhancedProperties demProps = new EnhancedProperties();
-	
+	private EnhancedProperties overviewProps = new EnhancedProperties();
+	private int maxRes = 16; // we can write a 0x4a polygon for planet in res 16.
+
 	public OverviewBuilder() {
 		this.overviewSource = new OverviewMapDataSource();
 	}
@@ -77,13 +78,7 @@
 		overviewMapnumber = args.get("overview-mapnumber", "63240000");
 		
 		outputDir = args.getOutputDir();
-		String demDist = args.getProperties().getProperty("overview-dem-dist");
-		String hgtPath = args.getProperties().getProperty("dem");
-		if (hgtPath != null && demDist != null && !"0".equals(demDist.trim())) {
-			demProps = new EnhancedProperties(args.getProperties());
-			demProps.setProperty("dem-dists", demDist);
-			demProps.setProperty("order-by-decreasing-area", "no");
-		}
+		overviewProps = new EnhancedProperties(args.getProperties());
 	}
 
 	public void onMapEnd(FileInfo finfo) {
@@ -99,7 +94,12 @@
 
 	public void onFinish() {
 		if (!hasBackground) {
+			List<MapShape> shapes = overviewSource.getShapes();
+			int inx = shapes.size();
 			overviewSource.addBackground();
+			// for --order-by-decreasing-area, need the background to be first:
+			if (shapes.size() > inx) // something was added
+				shapes.add(0, shapes.remove(inx));
 		}
 		calcLevels();
 		writeOverviewMap();
@@ -113,31 +113,6 @@
 	}
 
 	private void calcLevels() {
-		int maxRes = 16; // we can write a 0x4a polygon for planet in res 16
-		if (wantedLevels != null)
-			maxRes = wantedLevels[wantedLevels.length-1].getBits();
-		int maxSize = 0xffff << (24 - maxRes);
-		for (MapShape s : overviewSource.getShapes()){
-			if (s.getType() != 0x4a)
-				continue;
-			int maxDimPoly = s.getBounds().getMaxDimension();
-			if (maxDimPoly > maxSize){
-				int oldMaxRes = maxRes; 
-				while (maxDimPoly > maxSize){
-					maxRes--;
-					maxSize = 0xffff << (24 - maxRes);
-				}
-				final String[] name = s.getName().split("\u001d");
-				final String msg = "Tile selection (0x4a) polygon for";
-				final String msg2;
-				if (name.length == 2)
-					msg2 = "tile " + name[1].trim();
-				else 
-					msg2 = s.getBounds().toString(); 
-				log.error(msg, msg2, "cannot be written in level 0 resolution", oldMaxRes + ", using", maxRes, "instead");
-				
-			}
-		}
 		if (wantedLevels == null)
 			setRes(maxRes);
 		else {
@@ -160,6 +135,25 @@
 		}
 	}
 
+	private void checkFixRes(Area detailTileBounds, String tileName) {
+		int maxSize = 0xffff << (24 - maxRes);
+		int maxDimPoly = detailTileBounds.getMaxDimension();
+		if (maxDimPoly > maxSize) {
+			int oldMaxRes = maxRes;
+			while (maxDimPoly > maxSize) {
+				maxRes--;
+				maxSize = 0xffff << (24 - maxRes);
+			}
+			final String msg = "Tile selection (0x4a) polygon for";
+			final String msg2;
+			if (tileName != null)
+				msg2 = "tile " + tileName;
+			else
+				msg2 = detailTileBounds.toString();
+			log.error(msg, msg2, "cannot be written in level 0 resolution", oldMaxRes + ", using", maxRes, "instead");
+		}
+	}
+
 	/**
 	 * Write out the overview map.
 	 */
@@ -167,7 +161,7 @@
 		if (overviewSource.mapLevels() == null)
 			return;
 		
-		MapBuilder mb = new MapBuilder();
+		MapBuilder mb = new MapBuilder(false, true);
 		mb.setEnableLineCleanFilters(false);
 
 		FileSystemParam params = new FileSystemParam();
@@ -181,12 +175,10 @@
 				codepage = 0; // should not happen
 			}
 			Sort sort = SrtTextReader.sortForCodepage(codepage);
-			Map map = Map.createMap(overviewMapname, outputDir, params, overviewMapnumber, sort);
-			if (!demProps.isEmpty()) {
-				map.config(demProps);
-				mb.config(demProps);
-			}
-			
+			Map map = Map.createMap(overviewMapname, outputDir, params, overviewMapnumber, sort, true);
+			map.config(overviewProps);
+			mb.config(overviewProps);
+
 			if (encodingType != null){
 				map.getLblFile().setEncoder(encodingType, codepage);
 			}
@@ -205,8 +197,6 @@
 	 * @param finfo Information about an individual map.
 	 */
 	private void readFileIntoOverview(FileInfo finfo) throws FileNotFoundException {
-		addMapCoverageArea(finfo);
-
 		MapReader mapReader = null;
 		String filename = finfo.getFilename();
 		if (codepage == null){
@@ -262,7 +252,9 @@
 					mapLevels[0] = new LevelInfo(levels[1].getLevel(), levels[1].getResolution());
 				}
 				wantedLevels = mapLevels;
+				maxRes = wantedLevels[wantedLevels.length-1].getBits();
 			}
+			addMapCoverageArea(finfo);
 			if (isOverviewImg(filename)){
 				readPoints(mapReader);
 				readLines(mapReader);
@@ -277,7 +269,6 @@
 
 	/**
 	 * Read the points from the .img file and add them to the overview map.
-	 * We read from the least detailed level (apart from the empty one).
 	 *
 	 * @param mapReader Map reader on the detailed .img file.
 	 */
@@ -312,7 +303,6 @@
 
 	/**
 	 * Read the lines from the .img file and add them to the overview map.
-	 * We read from the least detailed level (apart from the empty one).
 	 *
 	 * @param mapReader Map reader on the detailed .img file.
 	 */
@@ -348,7 +338,6 @@
 
 	/**
 	 * Read the polygons from the .img file and add them to the overview map.
-	 * We read from the least detailed level (apart from the empty one).
 	 *
 	 * @param mapReader Map reader on the detailed .img file.
 	 */
@@ -389,6 +378,8 @@
 	 * Add an area that shows the area covered by a detailed map.  This can
 	 * be an arbitary shape, although at the current time we only support
 	 * rectangles.
+	 * Also build up full overview path (not ness. rectangle) for DEM
+	 * and check/decrease resolution if necessary
 	 *
 	 * @param finfo Information about a detail map.
 	 */
@@ -398,6 +389,8 @@
 		for (Coord co: points){
 			overviewSource.addToBounds(co);
 		}
+		overviewSource.addToTileAreaPath(points);
+		checkFixRes(bounds, finfo.getMapname());
 		// Create the tile coverage rectangle
 		MapShape bg = new MapShape();
 		bg.setType(0x4a);
Index: src/uk/me/parabola/mkgmap/main/AbstractTestMap.java
===================================================================
--- src/uk/me/parabola/mkgmap/main/AbstractTestMap.java	(revision 4593)
+++ src/uk/me/parabola/mkgmap/main/AbstractTestMap.java	(working copy)
@@ -55,7 +55,7 @@
 
 		Map map;
 		try {
-			map = Map.createMap("32860003", ".", params, "32860003", SrtTextReader.sortForCodepage(1252));
+			map = Map.createMap("32860003", ".", params, "32860003", SrtTextReader.sortForCodepage(1252), false);
 		} catch (FileExistsException e) {
 			throw new ExitException("File exists already", e);
 		} catch (FileNotWritableException e) {
Index: src/uk/me/parabola/mkgmap/main/MapMaker.java
===================================================================
--- src/uk/me/parabola/mkgmap/main/MapMaker.java	(revision 4593)
+++ src/uk/me/parabola/mkgmap/main/MapMaker.java	(working copy)
@@ -107,10 +107,10 @@
 		params.setMapDescription(args.getDescription());
 		log.info("Started making", args.getMapname(), "(" + args.getDescription() + ")");
 		try {
-			Map map = Map.createMap(mapNamePrefix + args.getMapname(), args.getOutputDir(), params, args.getMapname(), sort);
+			Map map = Map.createMap(mapNamePrefix + args.getMapname(), args.getOutputDir(), params, args.getMapname(), sort, false);
 			setOptions(map, args);
 
-			MapBuilder builder = new MapBuilder();
+			MapBuilder builder = new MapBuilder(!mapNamePrefix.isEmpty(), false);
 			builder.config(args.getProperties());
 			builder.makeMap(map, src);
 
Index: src/uk/me/parabola/mkgmap/reader/overview/OverviewMapDataSource.java
===================================================================
--- src/uk/me/parabola/mkgmap/reader/overview/OverviewMapDataSource.java	(revision 4593)
+++ src/uk/me/parabola/mkgmap/reader/overview/OverviewMapDataSource.java	(working copy)
@@ -55,6 +55,10 @@
 		return tileAreaPath;
 	}
 
+	public void addToTileAreaPath(List<Coord> points) {
+		tileAreaPath.append(Java2DConverter.createPath2D(points), false);
+	}
+
 	/**
 	 * This is a fake source of data and is not read from a file, so always
 	 * return false here.
@@ -158,10 +162,6 @@
 	 */
 	public void addShape(MapShape shape) {
 		mapper.addShape(shape);
-		if (shape.getType() == 0x4a) {
-			tileAreaPath.append(Java2DConverter.createPath2D(shape.getPoints()),false);
-			
-		}
 	}
 
 	public void addRoad(MapRoad road) {
_______________________________________________
mkgmap-dev mailing list
mkgmap-dev@lists.mkgmap.org.uk
http://www.mkgmap.org.uk/mailman/listinfo/mkgmap-dev

Reply via email to