2013-08-31 3 views
2

Как пометить свое текущее местоположение на карте Google?Отметьте текущее местоположение на карте google

Я использую API google place. Мне нужно показать все близлежащие места с моей нынешней позиции. Все места отображаются на карте Google, но как показать свою текущую позицию? код приведен ниже:

public class PoliceStationMapActivity extends FragmentActivity implements LocationListener { 
    private ArrayList<Place> mArrayListPoliceStations; 
    private GoogleMap mMap; 
    private LocationManager locManager; 
    private double latitude; 
    private double longitude; 

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

    locManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
    if (locManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) 
     locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this); 
    else 
     Log.i("Test", "network provider unavailable"); 

    Location lastKnownLocation = locManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 

    latitude = lastKnownLocation.getLatitude(); 
    longitude = lastKnownLocation.getLongitude(); 

    if (lastKnownLocation != null) { 
     Log.i("Test", lastKnownLocation.getLatitude() + ", " + lastKnownLocation.getLongitude()); 
     locManager.removeUpdates(this); 
    } 

    mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap(); 
    if (mMap != null) { 
     new GetAllPoliceStationsTask().execute("" + latitude, "" + longitude); 
    } 
} 

private class GetAllPoliceStationsTask extends AsyncTask<String, Void, ArrayList<Place>> { 
    @Override 
    protected ArrayList<Place> doInBackground(String... param) { 
     ArrayList<Place> policeStationsList = RequestHandler.getInstance(PoliceStationMapActivity.this).getAllPlaces(param[0], param[1]); 
     return policeStationsList; 
    } 

    @Override 
    protected void onPostExecute(java.util.ArrayList<Place> result) { 
     if (result != null) { 
      mArrayListPoliceStations = result; 
      placeAllPoliceStationMarkersOnMap(mArrayListPoliceStations); 
     } 
    } 

} 

private void placeAllPoliceStationMarkersOnMap(ArrayList<Place> policeStationList) { 
    for (Place place : policeStationList) { 
     addPlaceMarkerOnMap(place); 
    } 
}; 

private void addPlaceMarkerOnMap(Place place) { 
    LatLng latLng = new LatLng(place.getLatitude(), place.getLongitude()); 
    Marker poiMarker = mMap.addMarker(new MarkerOptions().position(latLng).title(place.getName()).snippet(place.getVicinity())); 
    Marker currentMarker = mMap.addMarker(new MarkerOptions().position()); 
} 

@Override 
public void onLocationChanged(Location location) { 
    latitude = location.getLatitude(); 
    longitude = location.getLongitude(); 
} 

@Override 
public void onProviderDisabled(String provider) { 

} 

@Override 
public void onProviderEnabled(String provider) { 

} 

@Override 
public void onStatusChanged(String provider, int status, Bundle extras) { 

}` 

ответ

3

Во-первых, чтобы получить текущее местоположение:

private Location mCurrentLocation; 
mCurrentLocation = mLocationClient.getLastLocation(); 

Read here, чтобы узнать больше.

И тогда вы можете указать местоположение с помощью:

LatLng myLaLn = new LatLng(mCurrentLocation.getLatitude(), mCurrentLocation.getLongitude()); 

CameraPosition camPos = new CameraPosition.Builder().target(myLaLn) 
       .zoom(15) 
       .bearing(45) 
       .tilt(70) 
       .build(); 

CameraUpdate camUpd3 = CameraUpdateFactory.newCameraPosition(camPos); 

map.animateCamera(camUpd3); 

Я дам вам простой, но полный пример, чтобы показать карту и текущее местоположение:

(Полный проект доступный в github.com/josuadas/LocationDemo)

public class MainActivity extends FragmentActivity implements 
     GooglePlayServicesClient.ConnectionCallbacks, 
     GooglePlayServicesClient.OnConnectionFailedListener { 

    private final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000; 

    private LocationClient mLocationClient; 
    private Location mCurrentLocation; 
    private GoogleMap map; 

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

    @Override 
    protected void onResume() { 
     super.onResume(); 
     setUpMapIfNeeded(); 
     setUpLocationClientIfNeeded(); 
     mLocationClient.connect(); 
    } 

    private void setUpMapIfNeeded() { 
     // Do a null check to confirm that we have not already instantiated the 
     // map. 
     if (map == null) { 
      // Try to obtain the map from the SupportMapFragment. 
      map = ((SupportMapFragment) getSupportFragmentManager() 
        .findFragmentById(R.id.map)).getMap(); 
      // Check if we were successful in obtaining the map. 
      if (map == null) { 
       Toast.makeText(this, "Google maps not available", 
         Toast.LENGTH_LONG).show(); 
      } 
     } 
    } 

    private void setUpLocationClientIfNeeded() { 
     if (mLocationClient == null) { 
      Toast.makeText(getApplicationContext(), "Waiting for location", 
        Toast.LENGTH_SHORT).show(); 
      mLocationClient = new LocationClient(getApplicationContext(), this, // ConnectionCallbacks 
        this); // OnConnectionFailedListener 
     } 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     if (mLocationClient != null) { 
      mLocationClient.disconnect(); 
     } 
    } 

    /* 
    * Called by Location Services when the request to connect the client 
    * finishes successfully. At this point, you can request the current 
    * location or start periodic updates 
    */ 
    @Override 
    public void onConnected(Bundle dataBundle) { 
     mCurrentLocation = mLocationClient.getLastLocation(); 
     if (mCurrentLocation != null) { 
      Toast.makeText(getApplicationContext(), "Found!", 
        Toast.LENGTH_SHORT).show(); 
      centerInLoc(); 
     } 
    } 

    private void centerInLoc() { 
     LatLng myLaLn = new LatLng(mCurrentLocation.getLatitude(), 
       mCurrentLocation.getLongitude()); 
     CameraPosition camPos = new CameraPosition.Builder().target(myLaLn) 
       .zoom(15).bearing(45).tilt(70).build(); 

     CameraUpdate camUpd3 = CameraUpdateFactory.newCameraPosition(camPos); 
     map.animateCamera(camUpd3); 

     MarkerOptions markerOpts = new MarkerOptions().position(myLaLn).title(
       "my Location"); 
     map.addMarker(markerOpts); 
    } 

    /* 
    * Called by Location Services if the connection to the location client 
    * drops because of an error. 
    */ 
    @Override 
    public void onDisconnected() { 
     // Display the connection status 
     Toast.makeText(this, "Disconnected. Please re-connect.", 
       Toast.LENGTH_SHORT).show(); 
    } 

    /* 
    * Called by Location Services if the attempt to Location Services fails. 
    */ 
    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     /* 
     * Google Play services can resolve some errors it detects. If the error 
     * has a resolution, try sending an Intent to start a Google Play 
     * services activity that can resolve error. 
     */ 
     if (connectionResult.hasResolution()) { 
      try { 
       // Start an Activity that tries to resolve the error 
       connectionResult.startResolutionForResult(this, 
         CONNECTION_FAILURE_RESOLUTION_REQUEST); 
       /* 
       * Thrown if Google Play services canceled the original 
       * PendingIntent 
       */ 
      } catch (IntentSender.SendIntentException e) { 
       // Log the error 
       e.printStackTrace(); 
      } 
     } else { 
      /* 
      * If no resolution is available 
      */ 
      Log.e("Home", Integer.toString(connectionResult.getErrorCode())); 
     } 
    } 
} 

Note1: Я просто пропустил часть «Проверить на услуги Google Play», но ее следует добавить в качестве хорошей практики.

Примечание2: Вам нужен проект google-play-services_lib и ссылайтесь на него со своего.

Вы можете найти всю информацию о взаимодействии с картами Google в android here

1

См последовали фрагменты кода:

... 
MyLocationOverlay myLoc = null; 
MapView myMapView = null; 
GeoPoint mCurrentPoint; 

... 

myMapView = (MapView) findViewById(R.id.mapView); 

    myMapView.setBuiltInZoomControls(true); 
    myMapView.setStreetView(true); 

    mc = myMapView.getController(); 
    mc.setZoom(17); 
    myLoc = new CustomMyLocationOverlay(this, myMapView); 
    myLoc.runOnFirstFix(new Runnable() { 
     public void run() { 
      if (mCurrentPoint.equals(new GeoPoint(0,0))){ 
       mc.animateTo(myLoc.getMyLocation()); 
       mCurrentPoint = myLoc.getMyLocation(); 
      } 
     } 
    }); 

    myMapView.getOverlays().add(myLoc); 
    myMapView.postInvalidate(); 

    zoomToMyLocation(); 

    Drawable drawable = this.getResources().getDrawable(R.drawable.target); 
    mItemizedoverlay = new MyItemizedOverlay(drawable, this); 

    // here get your lat, longt as double and put in GeoPoint 

    mCurrentPoint = new GeoPoint((int)lat,(int)lon); 

    if (!mCurrentPoint.equals(new GeoPoint(0,0))){ 
     mc.animateTo(mCurrentPoint); 
     setMarker(); 
    } 

... 

public void zoomToMyLocation() { 
    mCurrentPoint = myLoc.getMyLocation(); 
    if (mCurrentPoint != null) { 
     myMapView.getController().animateTo(mCurrentPoint); 
     // myMapView.getController().setZoom(10); 
    } 
} 

map.xml

<com.google.android.maps.MapView 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/mapView" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:clickable="true" 
android:enabled="true" 
android:apiKey="xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"  
/> 

Надеется, что это поможет вам

1
mMap.setMyLocationEnabled(true); 

Эта строка отобразит значок в верхнем правом углу карты, после нажатия на который оно будет перенесено в текущее местоположение на карте.

Смежные вопросы