Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get screen coordinates from marker in google maps v2 android

I have a small android problem (google maps v2 api)

This is my code:

GoogleMaps mMap;
Marker marker =  mMap.addMarker(new MarkerOptions().position(new LatLng(20, 20)));

I am trying to find a way to get the current screen coordinates (x,y) for this marker object.

Perhaps someone has an idea? I tried getProjection but it does not see to work. Thanks! :)

like image 384
mangotasche Avatar asked Jan 20 '13 22:01

mangotasche


People also ask

How do I get the coordinates of a marker on Google Maps?

And I'm using the code below to get the coordinates of the marker. var lat = homeMarker. getPosition(). $a; var lng = homeMarker.

How do I add a marker to Google Maps Android?

For adding a custom marker to Google Maps navigate to the app > res > drawable > Right-Click on it > New > Vector Assets and select the icon which we have to show on your Map. You can change the color according to our requirements. After creating this icon now we will move towards adding this marker to our Map.

What are Android markers?

Markers are objects of type Marker , and are added to the map with the GoogleMap. addMarker(markerOptions) method. Markers are designed to be interactive. They receive click events by default, and are often used with event listeners to bring up info windows.


Video Answer


2 Answers

Yes, use Projection class. More specifically:

  1. Get Projection of the map:

    Projection projection = map.getProjection();
    
  2. Get location of your marker:

    LatLng markerLocation = marker.getPosition();
    
  3. Pass location to the Projection.toScreenLocation() method:

    Point screenPosition = projection.toScreenLocation(markerLocation);
    

That's all. Now screenPosition will contain the position of the marker relative to the top-left corner of the whole Map container :)

Edit

Remember, that the Projection object will only return valid values after the map has passed the layout process (i.e. it has valid width and height set). You're probably getting (0, 0) because you're trying to access position of the markers too soon, like in this scenario:

  1. Create the map from layout XML file by inflating it
  2. Initialize the map.
  3. Add markers to the map.
  4. Query Projection of the map for marker positions on the screen.

This is not a good idea since the the map doesn't have valid width and height set. You should wait until these values are valid. One of the solutions is attaching a OnGlobalLayoutListener to the map view and waiting for layout process to settle. Do it after inflating the layout and initializing the map - for example in onCreate():

// map is the GoogleMap object
// marker is Marker object
// ! here, map.getProjection().toScreenLocation(marker.getPosition()) will return (0, 0)
// R.id.map is the ID of the MapFragment in the layout XML file
View mapView = getSupportFragmentManager().findFragmentById(R.id.map).getView();
if (mapView.getViewTreeObserver().isAlive()) {
    mapView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            // remove the listener
            // ! before Jelly Bean:
            mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            // ! for Jelly Bean and later:
            //mapView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            // set map viewport
            // CENTER is LatLng object with the center of the map
            map.moveCamera(CameraUpdateFactory.newLatLngZoom(CENTER, 15));
            // ! you can query Projection object here
            Point markerScreenPosition = map.getProjection().toScreenLocation(marker.getPosition());
            // ! example output in my test code: (356, 483)
            System.out.println(markerScreenPosition);
        }
    });
}

Please read through the comments for additional informations.

like image 133
andr Avatar answered Oct 18 '22 01:10

andr


toScreenLocation appears to have been replaced by fromLatLngToPoint gmaps api doc for projection: https://developers.google.com/maps/documentation/javascript/reference/image-overlay#Projection

like image 26
user14108230 Avatar answered Oct 18 '22 01:10

user14108230