This v2 patch makes "squarer" subdivisions than v1 - otherwise works
the same.
diff --git a/src/uk/me/parabola/imgfmt/app/trergn/RGNFile.java b/src/uk/me/parabola/imgfmt/app/trergn/RGNFile.java
index f0300e8..5c0dc77 100644
--- a/src/uk/me/parabola/imgfmt/app/trergn/RGNFile.java
+++ b/src/uk/me/parabola/imgfmt/app/trergn/RGNFile.java
@@ -147,7 +147,7 @@ public class RGNFile extends ImgFile {
position(indPointPtrOff);
long off = currPos - currentDivision.getRgnPointer() - HEADER_LEN;
if (off > 0xffff)
- throw new IllegalStateException("Too many items in indexed points section");
+ throw new IllegalStateException("IndPoint offset too large");
getWriter().putChar((char) off);
position(currPos);
@@ -160,7 +160,7 @@ public class RGNFile extends ImgFile {
position(polylinePtrOff);
long off = currPos - currentDivision.getRgnPointer() - HEADER_LEN;
if (off > 0xffff)
- throw new IllegalStateException("Too many items in polyline section");
+ throw new IllegalStateException("Polyline offset too large");
if (log.isDebugEnabled())
log.debug("setting polyline offset to", off);
@@ -176,7 +176,7 @@ public class RGNFile extends ImgFile {
long off = currPos - currentDivision.getRgnPointer() - HEADER_LEN;
log.debug("currpos=", currPos, ", off=", off);
if (off > 0xffff)
- throw new IllegalStateException("Too many items in the polygon section");
+ throw new IllegalStateException("Polygon offset too large");
if (log.isDebugEnabled())
log.debug("setting polygon offset to ", off, " @", polygonPtrOff);
diff --git a/src/uk/me/parabola/mkgmap/build/MapArea.java b/src/uk/me/parabola/mkgmap/build/MapArea.java
index 137de17..3bc60cc 100644
--- a/src/uk/me/parabola/mkgmap/build/MapArea.java
+++ b/src/uk/me/parabola/mkgmap/build/MapArea.java
@@ -359,6 +359,13 @@ public class MapArea implements MapDataSource {
}
/**
+ * Return number of shapes in this area.
+ */
+ public int getNumShapes() {
+ return nActiveShapes;
+ }
+
+ /**
* Return number of points in this area.
*/
public int getNumPoints() {
diff --git a/src/uk/me/parabola/mkgmap/build/MapSplitter.java b/src/uk/me/parabola/mkgmap/build/MapSplitter.java
index ac490df..e714fde 100644
--- a/src/uk/me/parabola/mkgmap/build/MapSplitter.java
+++ b/src/uk/me/parabola/mkgmap/build/MapSplitter.java
@@ -51,6 +51,9 @@ class MapSplitter {
// The maximum number of lines. NET points to lines in subdivision
// using bytes.
// Theoretical maximum about 0x100, which still gives errors.
+ // mb 4/9/2009 - I think this is because the number of lines doesn't take
+ // into account the fact that the lines can be subsequently split
+ // by the line filters which increases the number
private static final int MAX_NUM_LINES = 0xf0;
private static final int MAX_NUM_POINTS = 0xff;
@@ -94,7 +97,7 @@ class MapSplitter {
// in them. For those that do, we further split them. This is done
// recursively until everything fits.
List<MapArea> alist = new ArrayList<MapArea>();
- addAreasToList(areas, alist);
+ addAreasToList(areas, alist, 0);
MapArea[] results = new MapArea[alist.size()];
return alist.toArray(results);
@@ -109,17 +112,32 @@ class MapSplitter {
* @param alist The list that will finally contain the complete list of
* map areas.
*/
- private void addAreasToList(MapArea[] areas, List<MapArea> alist) {
+ private void addAreasToList(MapArea[] areas, List<MapArea> alist, int depth) {
int res = zoom.getResolution();
for (MapArea area : areas) {
+ Area bounds = area.getBounds();
+ String padding = " ";
+ log.info(padding.substring(0, depth * 2) +
+ bounds.getWidth() + "x" + bounds.getHeight() +
+ ", res = " + res +
+ ", depth = " + depth +
+ ", size = " + area.getSizeAtResolution(res) +
+ ", lines = " + area.getNumLines() +
+ ", shapes = " + area.getNumShapes() +
+ ", points = " + area.getNumPoints());
+
if (area.getSizeAtResolution(res) > MAX_RGN_SIZE
|| area.getNumLines() > MAX_NUM_LINES
|| area.getNumPoints() > MAX_NUM_POINTS) {
if (area.getBounds().getMaxDimention() > 100) {
if (log.isDebugEnabled())
log.debug("splitting area", area);
- MapArea[] sublist = area.split(2, 2, res);
- addAreasToList(sublist, alist);
+ MapArea[] sublist;
+ if(bounds.getWidth() > bounds.getHeight())
+ sublist = area.split(2, 1, res);
+ else
+ sublist = area.split(1, 2, res);
+ addAreasToList(sublist, alist, depth + 1);
continue;
} else {
log.warn("area too small to split", area);
_______________________________________________
mkgmap-dev mailing list
[email protected]
http://www.mkgmap.org.uk/mailman/listinfo/mkgmap-dev