Deleting Blank Tiles

 

Creating raster tilesets almost invariably leads to the creation of some blank tiles – covering those areas of space where no features were present in the underlying dataset. Depending on the image format you use for your tiles, and the method you used to create them, those “blank” tiles may be pure white, or some other solid colour, or they may have an alpha channel set to be fully transparent.

Here’s an example of a directory of tiles I just created. In this particular z/x directory, more than half the tiles are blank. Windows explorer shows them as black but that’s because it doesn’t process the alpha channel correctly. They are actually all 256px x 256px PNG images, filled with ARGB (0, 0, 0, 0):

image

What to do with these tiles? Well, there’s two schools of thought:

  • The first is that they should be retained. They are, after all, valid image files that can be retrieved and overlaid on the map. Although they aren’t visually perceptible, the very presence of the file demonstrates that the dataset was tested at this location, and confirms that no features exist there. This provides important metadata about the dataset in itself, and confirms the tile generation process was complete. The blank images themselves are generally small, and so storage is not generally an issue.
  • The opposing school of thought is that they should be deleted. It makes no sense to keep multiple copies of exactly the same, blank tile. If a request is received for a tile that is not present in the dataset, the assumption can be made that it contains no data, and a single, generic blank tile can be returned in all such instances – there is no benefit of returning the specific blank tile associated with that tile request. This not only reduces disk space on the tile server itself, but the client needs only cache a single blank tile that can be re-used in all cases where no data is present.

I can see arguments in favour of both sides. But, for my current project, disk and cache space is at a premium, so I decided I wanted to delete any blank tiles from my dataset. To determine which files were blank, I initially thought of testing the filesize of the image. However, even though I knew that every tile was of a fixed dimension (256px x 256px), an empty tile can still vary in filesize according to the compression algorithm used. Then I thought I could loop through each pixel in the image and use GetPixel() to retrieve the data to see whether the entire image was the same colour, but it turns out that GetPixel() is slooooowwwww….

The best solution I’ve found is to use an unsafe method, BitMap.LockBits to provide direct access to the pixel byte data of the image, and then read and compare the byte values directly. In my case, my image tiles are 32bit PNG files, which use 4 bytes per pixel (BGRA), and my “blank” tiles are completely transparent (Alpha channel = 0). Therefore, in my case I used the following function, which returns true if all the pixels in the image are completely transparent, or false otherwise:

public static Boolean IsEmpty(string imageFileName)
{
  using (Bitmap b = ReadFileAsImage(imageFileName))
  {
    System.Drawing.Imaging.BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, b.PixelFormat);
    unsafe
    {
      int PixelSize = 4; // Assume 4Bytes per pixel ARGB
      for (int y = 0; y < b.Height; y++)
      {
        byte* p = (byte*)bmData.Scan0 + (y * bmData.Stride);
        for (int x = 0; x < b.Width; x++)         {           byte blue = p[x * PixelSize]; // Blue value. Just in case needed later           byte green = p[x * PixelSize + 1]; // Green. Ditto           byte red = p[x * PixelSize + 2]; // Red. Ditto           byte alpha = p[x * PixelSize + 3];           if (alpha > 0) return false;
        }
      }
    }
    b.UnlockBits(bmData);
  }

  return true;
}

 

It needs to be compiled with the /unsafe option (well, it did say in the title that this post was dangerous!). Then, I just walked through the directory structure of my tile images, passing each file into this function and deleting those where IsEmpty() returned true.

 

Bing Maps Control for Windows Phone 7 lagging

This is a video showing the Silverlight Bing Maps Control for Windows Phone 7 showing some serious lagging behaviour on my HTC 7 Trophy. As you can see the built-in Windows Phone maps app performs normally (note that it’s a native thing and doesn’t use the Bing Maps Control), but the two user apps, Map Mania and Slim Tanken, both show some serious lagging while pinching/zooming

http://www.youtube.com/v/kixSTJT99-g?f=videos&app=youtube_gdata

SketchUp: Speed Up Using Fast Styles

You might not realize that the display settings you choose to apply to your models can affect SketchUp’s speed and general responsiveness. Turning on fancy edge effects and other doodads will slow you down when your model gets big.

When you’re working on a big model, you want to make sure that you’re using a style whose Edge Settings panel looks like the one in the image below. Everything but “Edges” should be turned off.

The Face Settings panel is where you can choose not to display Transparency. When Transparency is turned on, SketchUp has to redraw your model on the screen several times—each time you change your viewpoint. If you don’t need to see through your windows just now, opt to temporarily view these faces without transparency.

The Background Settings panel is handy for turning off Sky and Ground, both of which cause your computer to do extra thinking while you’re working.

Unless you absolutely need them, you should use the checkbox in the Watermark Settings panel to turn off Watermarks.

The only toggles in the Modeling Settings panel you really need to worry about are the ones for Hidden Geometry and Section Planes. Obviously, you shouldn’t have wither of these displayed if speed is what you’re aiming for.


Once you’ve configured your own fast style, you should save it. Just give it a new name (I suggest “Fast Style”), hit Enter, and click the Create New Style button in the Styles Browser. You new style is saved in the “In Model” collection of styles, which is only associated with the model you’re currently working on.

Incidentally, almost all of the choices in SketchUp’s Default Styles collection are so-called “Fast styles” — their Edge Display settings are already configured for speed. Choosing any one of these styles will switch off extraneous effects.

Make a Fast Scene

True SketchUp whizzes invariably go one step further and add a special “Fast” scene that they can activate whenever they need to. Rather than having to mess with the Styles Browser every time they want to activate their Fast Style, they just click a scene tab at the top of the modeling window. This Fast scene is usually set up to do three things: Switch to a Fast style, turn off Shadows, and turn off Fog.

Follow these steps to add a Fast scene to your model:

  1. Apply a Fast style to your model by choosing it from the Style Browser’s Select tab.
  2. Make sure Shadows and Fog are both turned off. These toggles are in the View menu.
  3. Choose Window > Scenes to open the Scenes Manager.
  4. Expand the Scenes Manager by clicking the Show Details button in the upper right corner.
  5. Click the Add Scene button to add a new scene to your model.
  6. Rename your new scene “Fast” (or something similarly descriptive) and hit Enter on your keyboard.
  7. Make sure that only the “Style and Fog” and “Shadow Settings” checkboxes are selected in the Properties to Save section of the Scenes Manager.