On issue #1, I scavenged some online code snippet and tweaked it to work
properly to translate from screen pixel to GeoPoint::
private GeoPoint pixelToGeoPoint(int selectedPixelX, int selectedPixelY)
{
Log.v(LOG_ID, "selectedPixel=[" + selectedPixelX + "," + selectedPixelY
+ "]");
// center point in udegrees
GeoPoint center = mapView.getMapCenter();
int centerUdegreesX = center.getLongitudeE6();
int centerUdegreesY = center.getLatitudeE6();
Log.v(LOG_ID, "centerUdegrees=[" + centerUdegreesX + "," +
centerUdegreesY + "]");
// dimension of view area in udegrees
int viewUdegreesX = mapView.getLongitudeSpan();
int viewUdegreesY = mapView.getLatitudeSpan();
Log.v(LOG_ID, "viewUdegrees=[" + viewUdegreesX + "," + viewUdegreesY +
"]");
// dimension of view area in pixels
int viewPixelsX = mapView.getWidth();
int viewPixelsY = mapView.getHeight();
Log.v(LOG_ID, "viewPixels=[" + viewPixelsX + "," + viewPixelsY + "]");
// center point in pixels
int centerPixelX = viewPixelsX / 2;
int centerPixelY = viewPixelsY / 2;
Log.v(LOG_ID, "centerPixel=[" + centerPixelX + "," + centerPixelY +
"]");
// udegrees per pixel
int udegreesPerPixelX = viewUdegreesX / viewPixelsY;
int udegreesPerPixelY = viewUdegreesY / viewPixelsX;
Log.v(LOG_ID, "udegreesPerPixel=[" + udegreesPerPixelX + "," +
udegreesPerPixelY + "]");
// delta from center of selection, in pixels
int deltaPixelX = selectedPixelX - centerPixelX;
int deltaPixelY = selectedPixelY - centerPixelY;
Log.v(LOG_ID, "deltaPixel=[" + deltaPixelX + "," + deltaPixelY + "]");
// delta from center of selection, in udegrees
int deltaUdegreesX = udegreesPerPixelX * deltaPixelX;
int deltaUdegreesY = -udegreesPerPixelY * deltaPixelY;
Log.v(LOG_ID, "deltaUdegrees=[" + deltaUdegreesX + "," + deltaUdegreesY
+ "]");
// selection in udegrees
int selectedUdegreesX = centerUdegreesX + deltaUdegreesX;
int selectedUdegreesY = centerUdegreesY + deltaUdegreesY;
Log.v(LOG_ID, "selectedUdegrees=[" + selectedUdegreesX + "," +
selectedUdegreesY + "]");
GeoPoint selectedPoint = new GeoPoint(selectedUdegreesY,
selectedUdegreesX);
return selectedPoint;
}
This works in the case where either entire view area is covered with map.
However, if you zoom out far enough, you can go off the top or bottom of the
map. In this case, mapView.getMapCenter() returns a point off the map (i.e.,
> 90 or < -90 degrees), but mapView.getLatitudeSpan() returns the height of
only the viewable area. So, it throws the math off. And I can't figure out a
way to grab either the center of the displayed map section, or the height in
microdegrees of the entire viewable area. I can't even find anything in the
API to return any indication that part of the view is off the map.
On Tue, Jun 9, 2009 at 2:02 PM, Philip Tucker<[email protected]> wrote:
> (If there's a better place to post questions concerning the Google
> Maps API please let me know, but it looks like this is the right
> spot.)
>
> Requirement:
> I have created a MapActivity containing a MapView. Drag and zoom work
> fine, and I've successfully added an ItemizedOverlay that displays and
> updates properly. Right now I can add OverlayItems to the map center
> via a button, but I would like to add functionality allowing the user
> to issue a long click to add an OverlayItem to the map at the selected
> location.
>
> Issue 1 (minor):
> It seems like there should be an easy way to determine the geo
> location for a click event in MapView, but from what I've gathered it
> requires writing my own pixel->latlong translation based on the view
> span. Not a deal breaker, but seems like a common enough use case to
> warrant addition to the API.
>
> Issue 2 (average):
> My first attempt was to use setLongClickable(true) and
> setOnLongClickListener, but that doesn't provide the click location.
> The only param it receives it the View object, but I couldn't find any
> way to determine the location of the click event.
>
> Issue 3 (major):
> My second attempt was to use setOnTouchListener. This seems completely
> broken to me. If I return true (ie, consume event) I continue getting
> all touch events, but drag and zoom of the MapView do not work. That
> seems like expected behavior.
> If I return false (ie, do not consume the event) the map view
> continues to work correctly. My listener receives ONLY the first touch
> event. Stepping through in debug, it looks like
> MapView.mOnTouchListener gets set to something like ZoomListener
> (that's not the exact name, but it's close to that) and then to null
> shortly after my listener is invoked.
> Is there another preferred way of handling touch events in MapView?
--
Philip Tucker
[email protected]
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---