How to get screen center location of google map?
Asked Answered
T

4

14

I want to create a map with static marker to always show the location of center of screen. I've created a marker in layout with drawable image in the center. Now I need to get the center location coordinates and convert them to address. afterwards show the selected location in a text view as my selected location. Need help

Tim answered 27/7, 2015 at 7:24 Comment(0)
V
13
protected void userLocationMap() {

        mapFragment = ((SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map));
        googleMap = mapFragment.getMap();
        int status = GooglePlayServicesUtil
                .isGooglePlayServicesAvailable(getBaseContext());

        if (status != ConnectionResult.SUCCESS) { 
///if play services are not available
            int requestCode = 10;
            Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, this,
                    requestCode);
            dialog.show();

        } else {

            // Enabling MyLocation Layer of Google Map
            googleMap.setMyLocationEnabled(true);

            // Creating a LatLng object for the current location
            LatLng latLng = new LatLng(latitude, longitude);
            // Showing the current location in Google Map
            googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
            // Zoom in the Google Map
            googleMap.animateCamera(CameraUpdateFactory.zoomTo(15));
            Log.i("latitude", "==========" + latitude);
////locationTextView holds the address string
            locationTextView.setText(getCompleteAdressString(latitude, longitude));

            // create marker
            MarkerOptions marker = new MarkerOptions().position(
                    new LatLng(latitude, longitude)).title("My Location");
            // adding marker
            googleMap.addMarker(marker);
        }
    }

and the getcompleteAdress method is:::::==>

private String getCompleteAddressString(double LATITUDE, double LONGITUDE) {

        String strAdd = "";

        Geocoder geocoder = new Geocoder(this, Locale.getDefault());
        try {
            List<Address> addresses = geocoder.getFromLocation(LATITUDE,
                    LONGITUDE, 1);

            if (addresses != null) {

                Address returnedAddress = addresses.get(0);

                StringBuilder strReturnedAddress = new StringBuilder("");

                for (int i = 0; i < returnedAddress.getMaxAddressLineIndex(); i++) {

                    strReturnedAddress
                            .append(returnedAddress.getAddressLine(i)).append(
                                    ",");
                }

                strAdd = strReturnedAddress.toString();

                Log.w("My Current loction address",
                        "" + strReturnedAddress.toString());
            } else {
                Log.w("My Current loction address", "No Address returned!");
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log.w("My Current loction address", "Canont get Address!");
        }
        return strAdd;
    }

To change location as per clicks on====>

 googleMap.setOnMapClickListener(new OnMapClickListener() {

            @Override
            public void onMapClick(LatLng point) {
                Log.d("Map","Map clicked");
                marker.remove();
                double latitude = latLng.latitude;
                double longitude = latLng.longitude;
locationTextView.setText(getCompleteAdressString(latitude,longitude ));
                drawMarker(point);
            }
        });
Verdugo answered 27/7, 2015 at 7:43 Comment(2)
If you are not satified with our answers, please let us knowVerdugo
I have edited my answer to include your question in the comments. But question is not so clear.. If you are not satisfied please let us knowVerdugo
H
53

You can get center point of map at any time by calling this function on your GoogleMap variable instance

mMap.getCameraPosition().target 

Now if you want to get center point everytime map is changed then you need to implement OnCameraChangeListener listener and call the above line to get new center point.

Update: OnCameraChangeListener has been replaced with OnCameraMoveStartedListener, OnCameraMoveListener and OnCameraIdleListener listeners. Use the one that suits your use case.

Hereditament answered 27/7, 2015 at 7:39 Comment(4)
can you please provide some example or so?Tim
It works really well, and the code it's also cleaner than the accepted answerEmit
@Tim Such as: double CameraLat = mMap.getCameraPosition().target.latitude; double CameraLong = mMap.getCameraPosition().target.longitude;Unclench
Yep, this should be the accepted answer. If one guy gives an answer in 30 lines of code and another guy gives an answer in just one line of code (that has no visible implementation downsides), the one liner should always be the accepted answer.Bladdernut
V
13
protected void userLocationMap() {

        mapFragment = ((SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map));
        googleMap = mapFragment.getMap();
        int status = GooglePlayServicesUtil
                .isGooglePlayServicesAvailable(getBaseContext());

        if (status != ConnectionResult.SUCCESS) { 
///if play services are not available
            int requestCode = 10;
            Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, this,
                    requestCode);
            dialog.show();

        } else {

            // Enabling MyLocation Layer of Google Map
            googleMap.setMyLocationEnabled(true);

            // Creating a LatLng object for the current location
            LatLng latLng = new LatLng(latitude, longitude);
            // Showing the current location in Google Map
            googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
            // Zoom in the Google Map
            googleMap.animateCamera(CameraUpdateFactory.zoomTo(15));
            Log.i("latitude", "==========" + latitude);
////locationTextView holds the address string
            locationTextView.setText(getCompleteAdressString(latitude, longitude));

            // create marker
            MarkerOptions marker = new MarkerOptions().position(
                    new LatLng(latitude, longitude)).title("My Location");
            // adding marker
            googleMap.addMarker(marker);
        }
    }

and the getcompleteAdress method is:::::==>

private String getCompleteAddressString(double LATITUDE, double LONGITUDE) {

        String strAdd = "";

        Geocoder geocoder = new Geocoder(this, Locale.getDefault());
        try {
            List<Address> addresses = geocoder.getFromLocation(LATITUDE,
                    LONGITUDE, 1);

            if (addresses != null) {

                Address returnedAddress = addresses.get(0);

                StringBuilder strReturnedAddress = new StringBuilder("");

                for (int i = 0; i < returnedAddress.getMaxAddressLineIndex(); i++) {

                    strReturnedAddress
                            .append(returnedAddress.getAddressLine(i)).append(
                                    ",");
                }

                strAdd = strReturnedAddress.toString();

                Log.w("My Current loction address",
                        "" + strReturnedAddress.toString());
            } else {
                Log.w("My Current loction address", "No Address returned!");
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log.w("My Current loction address", "Canont get Address!");
        }
        return strAdd;
    }

To change location as per clicks on====>

 googleMap.setOnMapClickListener(new OnMapClickListener() {

            @Override
            public void onMapClick(LatLng point) {
                Log.d("Map","Map clicked");
                marker.remove();
                double latitude = latLng.latitude;
                double longitude = latLng.longitude;
locationTextView.setText(getCompleteAdressString(latitude,longitude ));
                drawMarker(point);
            }
        });
Verdugo answered 27/7, 2015 at 7:43 Comment(2)
If you are not satified with our answers, please let us knowVerdugo
I have edited my answer to include your question in the comments. But question is not so clear.. If you are not satisfied please let us knowVerdugo
E
6

This will provide center screen lat and lang

LatLng centerLatLang = 
mMap.getProjection().getVisibleRegion().latLngBounds.getCenter();
Endodontics answered 13/6, 2018 at 8:13 Comment(2)
This works especially good when the map has some set padding. Thanks RavichandraRimarimas
When zoom down, it show wrong locationUlibarri
T
2

I've managed to create the map for my current location. But it gives coordinates of my location only once and I need to get location while moving to some other location. posting my code

import java.io.IOException;
import java.util.List;
import java.util.Locale;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.OnCameraChangeListener;
import com.google.android.gms.maps.GoogleMap.OnMapClickListener;
import com.google.android.gms.maps.GoogleMap.OnMapLongClickListener;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.maps.GeoPoint;

import android.app.ActionBar;
import android.app.Activity;
import android.app.Dialog;
import android.graphics.Canvas;
import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;


public class MapLocation extends FragmentActivity implements LocationListener {

    GoogleMap googleMap;
    MarkerOptions markerOptions;
    LatLng latLng;

    ImageView icon;
    TextView selected;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map);

        icon = (ImageView)findViewById(R.id.icon_baby);
        icon.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                finish();

            }
        });


     // Getting Google Play availability status
        int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getBaseContext());

        // Showing status
        if(status!=ConnectionResult.SUCCESS){ // Google Play Services are not available

            int requestCode = 10;
            Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, this, requestCode);
            dialog.show();

        }else { // Google Play Services are available

            // Getting reference to the SupportMapFragment of activity_main.xml
            SupportMapFragment fm = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);

            // Getting GoogleMap object from the fragment
            googleMap = fm.getMap();

            // Enabling MyLocation Layer of Google Map
            googleMap.setMyLocationEnabled(true);

            // Getting LocationManager object from System Service LOCATION_SERVICE
            LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

            // Creating a criteria object to retrieve provider
            Criteria criteria = new Criteria();

            // Getting the name of the best provider
            String provider = locationManager.getBestProvider(criteria, true);

            // Getting Current Location
            Location location = locationManager.getLastKnownLocation(provider);

            if(location!=null){
                onLocationChanged(location);
            }
            locationManager.requestLocationUpdates(provider, 20000, 0, this);
        }
    }
    //@Override
    public void onLocationChanged(Location location) {

        TextView tvLocation = (TextView) findViewById(R.id.selected_location);

        // Getting latitude of the current location
        double latitude = location.getLatitude();

        // Getting longitude of the current location
        double longitude = location.getLongitude();

        // Creating a LatLng object for the current location
        LatLng latLng = new LatLng(latitude, longitude);

        // Showing the current location in Google Map
        googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));

        // Zoom in the Google Map
        googleMap.animateCamera(CameraUpdateFactory.zoomTo(15));

        // Setting latitude and longitude in the TextView tv_location
        tvLocation.setText("Latitude:" +  latitude  + ", Longitude:"+ longitude );
    }
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub

    }
    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub

    }
    @Override
    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub

    }
    }
Tim answered 27/7, 2015 at 8:19 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.