I’m doing an application where I need to detect if the user is selecting a longitude/latitude pair that’s on land or at sea on a MapView. I could get this answered by sending a request to the Google Maps service, but I’d rather it work offline too. So I’ve come up with two ways that this could function, and since I’m rather green on the Bitmap vs. memory area I thought I’d get your input.
The main idea is that I’m storing a small black and white bitmap of the map area I want to cover (say 200×200 px). When a user selects a longitude/latitude pair, then that pair is converted into a set of x,y pixels and I check if the pixel coordinates points to a black pixel(land) or a white pixel(sea/water). Here’s the two methods I’ve come up with so far.
Option A
Lazy load the Bitmap when the user is about to select the long/lat pair and use getPixel() to check if it’s at land or sea. Keep a WeakReference to the image at let it be garbage collected whenever the GC comes around.
Option B
Keep each pixel coordinate pair of the bitmap in a SQLite database and do a lookup everytime the user is about to select a long/lat pair.
I’m guessing that A is the best one speed-wise (ignoring the overhead of reading the bitmap from the disk in the first place), but is it costly to keep the bitmap in memory, battery-wise?
If you have any other suggestions on how to do this then I would love to here them 🙂
As you say, option A is fastest but, I am confused as to why you think that using a bitmap will impact battery.
All of the memory in your phone always holds a 1 or a 0. There is a very small difference in power (and I mean small) between a 1 and a 0 but across hundreds of megabytes, or gigs, of memory, we can assume a random 50/50 distribution of 1s and 0s. The memory you load your bitmap into was full of 1s and 0s before you load it and full of 1s and 0s after you load it. I suspect, without measuring, that the impact of loading the bitmap from memory (since this does use power as opposed to simply keeping it loaded) is much less than the equivalent number of memory reads the SQL approach would use.
Therefore, my conclusion is that keeping the bitmap loaded has no impact on battery and option A is preferred.
[EDIT]
Having thought some more about your question, are you actually asking “which uses more power”, reading a pixel from a loaded bitmap or querying a SQLite table”?