I have created another question (How to display a map (still image file) with a moving current location)
But it contains 2 (two) questions, so i need to segregate it.
I am trying to create a prototype that could guide a person to his destination place.
- place is a wide building with several floors.
- i can obtain/retrieve the maps (still images). e.g. current:1F destination:5F; so I can get the still images of 1st,2nd...5th floors (5 image files).
Scenario:
- start the application
- input the current location (or may automatically set using current location) & destination
- click the search route button to search the maps to use (still images) & mark the current location & destination
- update the current location upon moving/going to destination
Problem: I can get the current location coordinate via WiFi/cell tower/ip address but don't know how to put it into still image to mark the current location.
Would you share the concepts/ideas or include the code snippets. Big Help with my thesis.
Any guidance on the right direction is appreciated.
UPDATE
Actual Example with Actual,Expected Output,Test Case (parcel of codes here has gotten from mapsforge)
MercatorProjectionClass.java
/**
* A performance optimized implementation of the spherical Mercator projection.
*/
class MercatorProjectionClass {
/**
* Width and height of a map tile in pixel.
*/
static final int TILE_SIZE = 256;
/**
* Converts a latitude coordinate (in degrees) to a pixel Y coordinate at a certain zoom level.
*
* @param latitude
* the latitude coordinate that should be converted.
* @param zoom
* the zoom level at which the coordinate should be converted.
* @return the pixel Y coordinate of the latitude value.
*/
static double latitudeToPixelY(double latitude, byte zoom) {
double sinLatitude = Math.sin(latitude * (Math.PI / 180));
return (0.5 - Math.log((1 + sinLatitude) / (1 - sinLatitude)) / (4 * Math.PI))
* ((long) TILE_SIZE << zoom);
}
/**
* Converts a latitude coordinate (in degrees) to a tile Y number at a certain zoom level.
*
* @param latitude
* the latitude coordinate that should be converted.
* @param zoom
* the zoom level at which the coordinate should be converted.
* @return the tile Y number of the latitude value.
*/
static long latitudeToTileY(double latitude, byte zoom) {
return pixelYToTileY(latitudeToPixelY(latitude, zoom), zoom);
}
/**
* Converts a longitude coordinate (in degrees) to a pixel X coordinate at a certain zoom level.
*
* @param longitude
* the longitude coordinate that should be converted.
* @param zoom
* the zoom level at which the coordinate should be converted.
* @return the pixel X coordinate of the longitude value.
*/
static double longitudeToPixelX(double longitude, byte zoom) {
return (longitude + 180) / 360 * ((long) TILE_SIZE << zoom);
}
/**
* Converts a longitude coordinate (in degrees) to the tile X number at a certain zoom level.
*
* @param longitude
* the longitude coordinate that should be converted.
* @param zoom
* the zoom level at which the coordinate should be converted.
* @return the tile X number of the longitude value.
*/
static long longitudeToTileX(double longitude, byte zoom) {
return pixelXToTileX(longitudeToPixelX(longitude, zoom), zoom);
}
/**
* Converts a pixel X coordinate at a certain zoom level to a longitude coordinate.
*
* @param pixelX
* the pixel X coordinate that should be converted.
* @param zoom
* the zoom level at which the coordinate should be converted.
* @return the longitude value of the pixel X coordinate.
*/
static double pixelXToLongitude(double pixelX, byte zoom) {
return 360 * ((pixelX / ((long) TILE_SIZE << zoom)) - 0.5);
}
/**
* Converts a pixel X coordinate to the tile X number.
*
* @param pixelX
* the pixel X coordinate that should be converted.
* @param zoom
* the zoom level at which the coordinate should be converted.
* @return the tile X number.
*/
static long pixelXToTileX(double pixelX, byte zoom) {
return (long) Math.min(Math.max(pixelX / TILE_SIZE, 0), Math.pow(2, zoom) - 1);
}
/**
* Converts a pixel Y coordinate at a certain zoom level to a latitude coordinate.
*
* @param pixelY
* the pixel Y coordinate that should be converted.
* @param zoom
* the zoom level at which the coordinate should be converted.
* @return the latitude value of the pixel Y coordinate.
*/
static double pixelYToLatitude(double pixelY, byte zoom) {
double y = 0.5 - (pixelY / ((long) TILE_SIZE << zoom));
return 90 - 360 * Math.atan(Math.exp(-y * (2 * Math.PI))) / Math.PI;
}
/**
* Converts a pixel Y coordinate to the tile Y number.
*
* @param pixelY
* the pixel Y coordinate that should be converted.
* @param zoom
* the zoom level at which the coordinate should be converted.
* @return the tile Y number.
*/
static long pixelYToTileY(double pixelY, byte zoom) {
return (long) Math.min(Math.max(pixelY / TILE_SIZE, 0), Math.pow(2, zoom) - 1);
}
private static final byte ZOOM_LEVEL = 14;
/**
* @param args
*/
public static void main(String[] args) {
// Pixel Coordinate of Chicago,IL
double pixel_y = 1559345;
double pixel_x = 1075954;
// Lat Lng of Chicago,IL
double lat_y = 41.850033;
double lng_x = -87.65005229999997;
testPixelXYToLatitude(pixel_y, pixel_x, lat_y, lng_x);
testLatLngToPixelXY(pixel_y, pixel_x, lat_y, lng_x);
}
private static void testPixelXYToLatitude(
double pixel_y, double pixel_x,
double lat_y, double lng_x) {
double actual_lat_y = MercatorProjectionClass.pixelYToLatitude(pixel_y, ZOOM_LEVEL);
double actual_lng_x = MercatorProjectionClass.pixelXToLongitude(pixel_x, ZOOM_LEVEL);
String expectedstr_lat_y = Double.toString(lat_y).substring(0, 5);
String expectedstr_lng_x = Double.toString(lng_x).substring(0, 6);
String actualstr_lat_y = Double.toString(actual_lat_y).substring(0, 5);
String actualstr_lng_x = Double.toString(actual_lng_x).substring(0, 6);
String result = (actualstr_lat_y.equals(expectedstr_lat_y) && actualstr_lng_x.equals(expectedstr_lng_x))?"PASSED":"FAILED";
System.out.println("PixelXYToLatitude test result:" + result);
}
private static void testLatLngToPixelXY(
double pixel_y, double pixel_x,
double lat_y, double lng_x) {
double actual_pixel_y = MercatorProjectionClass.latitudeToPixelY(lat_y, ZOOM_LEVEL);
double actual_pixel_x = MercatorProjectionClass.longitudeToPixelX(lng_x, ZOOM_LEVEL);
String expectedstr_pixel_y = Integer.toString((Double.valueOf(pixel_y).intValue()));
String expectedstr_pixel_x = Integer.toString((Double.valueOf(pixel_x).intValue()));
String actualstr_pixel_y = Integer.toString(Double.valueOf(actual_pixel_y).intValue());
String actualstr_pixel_x = Integer.toString(Double.valueOf(actual_pixel_x).intValue());
String result = (actualstr_pixel_y.equals(expectedstr_pixel_y) && actualstr_pixel_x.equals(expectedstr_pixel_x))?"PASSED":"FAILED";
System.out.println("LatLngToPixelXY test result:" + result);
}
}
Output of the above code:
- PixelXYToLatitude test result:PASSED
- LatLngToPixelXY test result:PASSED
I have already the projection class to convert LatLng to Pixel. My Problem now is on how to mark into still image of a given LatLng using the above class.
Here's my still image (Chicago,IL):
I want to put a mark (here's the example but later on need to change the balloon to smaller pointer)