Index: src/uk/me/parabola/splitter/Area.java
===================================================================
--- src/uk/me/parabola/splitter/Area.java	(revision 412)
+++ src/uk/me/parabola/splitter/Area.java	(working copy)
@@ -13,6 +13,7 @@
 package uk.me.parabola.splitter;
 
 import java.awt.Rectangle;
+import java.awt.geom.Rectangle2D;
 
 /**
  * A map area in map units.  There is a constructor available for creating
@@ -67,6 +68,19 @@
 	}
 
 	/**
+	 * Apply bbox to area.
+	 * @param area the area
+	 * @param bbox the bounding box
+	 * @return A new area instance that covers the intersection of area and bbox. 
+	 */
+	public static Area calcArea (Area area, Rectangle bbox) {
+		Rectangle dest = new Rectangle();
+		Rectangle2D.intersect(area.getRect(), bbox, dest);
+		return new Area(dest.y, dest.x, dest.y + dest.height, dest.x + dest.width);
+	}
+
+
+	/**
 	 * Creates an empty area.
 	 */
 	private Area() {
Index: src/uk/me/parabola/splitter/DensityMapCollector.java
===================================================================
--- src/uk/me/parabola/splitter/DensityMapCollector.java	(revision 412)
+++ src/uk/me/parabola/splitter/DensityMapCollector.java	(working copy)
@@ -44,11 +44,11 @@
 	}
 
 	@Override
-	public void boundTag(Area bounds) {
+	public void boundTag(Area fileBbox) {
 		if (this.bounds == null)
-			this.bounds = bounds;
+			this.bounds = fileBbox;
 		else
-			this.bounds = this.bounds.add(bounds);
+			this.bounds = this.bounds.add(fileBbox);
 	}
 
 	@Override
@@ -76,8 +76,8 @@
 		}
 		return details.getBounds();
 	}
-	public SplittableDensityArea getRoundedArea(int resolution, int searchLimit) {
-		Area roundedBounds = RoundingUtils.round(getExactArea(), resolution);
+	
+	public SplittableDensityArea getSplitArea(int searchLimit, Area roundedBounds) {
 		return new SplittableDensityArea(densityMap.subset(roundedBounds), searchLimit);
 	} 
 
Index: src/uk/me/parabola/splitter/Main.java
===================================================================
--- src/uk/me/parabola/splitter/Main.java	(revision 412)
+++ src/uk/me/parabola/splitter/Main.java	(working copy)
@@ -101,6 +101,7 @@
 	// A polygon file in osmosis polygon format
 	private String polygonFile;
 	private List<PolygonDesc> polygons = new ArrayList<>();
+	Rectangle polgonsBoundingBox = null;
 
 	// The path where the results are written out to.
 	private File fileOutputDir;
@@ -528,6 +529,9 @@
 			}
 		}
 		if (polygons.isEmpty() == false){
+			if (polygons.size() == 1){
+				polgonsBoundingBox = polygons.get(0).area.getBounds(); 
+			}
 			if (checkPolygons() == false){
 				System.out.println("Warning: Bounding polygon is complex. Splitter might not be able to fit all tiles into the polygon!");
 			}
@@ -545,7 +549,11 @@
 			}
 		}
 		if (polygons.isEmpty() == false && numTiles > 0){
-			System.out.println("Polygons are ignored because parameter --num-tiles is used");
+			if (polygons.size() == 1){
+				System.out.println("Warning: Parameter polygon-file is only used to calculate the bounds because --num-tiles is used");
+			} else {
+				System.out.println("Warning: parameter polygon-file is ignored because --num-tiles is used");
+			}
 		}
 		searchLimit = params.getSearchLimit();
 		if (searchLimit < 1000){
@@ -579,6 +587,12 @@
 			pass1Collector.saveMap(densityOutData.getAbsolutePath());
 
 		Area exactArea = pass1Collector.getExactArea();
+		System.out.println("Exact map coverage read from input file(s) is " + exactArea);
+		if (polgonsBoundingBox != null){
+			exactArea = Area.calcArea(exactArea, polgonsBoundingBox);
+			System.out.println("Exact map coverage after applying bounding box of polygon-file is " + exactArea);
+		}
+
 		if (precompSeaDir != null){
 			System.out.println("Counting nodes of precompiled sea data ...");
 			long startSea = System.currentTimeMillis();
@@ -588,14 +602,12 @@
 			pass1Collector.mergeSeaData(seaCollector, trim, resolution);
 			System.out.println("Precompiled sea data pass took " + (System.currentTimeMillis()-startSea) + " ms");
 		}
-		
-		SplittableDensityArea splittableArea = pass1Collector.getRoundedArea(resolution, searchLimit);
+		Area roundedBounds = RoundingUtils.round(exactArea, resolution);
+		SplittableDensityArea splittableArea = pass1Collector.getSplitArea(searchLimit, roundedBounds);
 		if (splittableArea.hasData() == false)
 			return new AreaList(new ArrayList<Area>());
-		System.out.println("Exact map coverage is " + exactArea);
 		System.out.println("Rounded map coverage is " + splittableArea.getBounds());
 		
-		
 		splittableArea.setTrim(trim);
 		splittableArea.setMapId(mapId);
 		long startSplit = System.currentTimeMillis();
