package com.tutsplus.mapsdemo.activity; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.widget.Toast; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.model.BitmapDescriptorFactory; 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.gms.maps.model.Polyline; import com.google.android.gms.maps.model.PolylineOptions; import com.google.maps.android.SphericalUtil; import com.tutsplus.mapsdemo.R; import java.util.Arrays; /** * Created by Paul on 9/7/15. */ public class SphericalGeometryActivity extends BaseMapActivity implements GoogleMap.OnMarkerDragListener { private Marker mMarker1; private Marker mMarker2; private Polyline mPolyline; @Override protected void initMapSettings() { mGoogleMap.setOnMarkerDragListener( this ); MarkerOptions options = new MarkerOptions(); options.position( mCenterLocation ); options.draggable(true); options.icon(BitmapDescriptorFactory.defaultMarker()); mMarker1 = mGoogleMap.addMarker(options); options = new MarkerOptions(); options.position( new LatLng( mCenterLocation.latitude - 0.3, mCenterLocation.longitude + 0.3 ) ); options.draggable(true); options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)); mMarker2 = mGoogleMap.addMarker( options ); //https://www.google.com/search?q=geodesic mPolyline = mGoogleMap.addPolyline(new PolylineOptions().geodesic(true)); updateLine(); } @Override protected float getInitialMapZoomLevel() { return 10.0f; } @Override public void onMarkerDragStart(Marker marker) { } @Override public void onMarkerDrag(Marker marker) { updateLine(); } @Override public void onMarkerDragEnd(Marker marker) { updateLine(); } private void updateLine() { mPolyline.setPoints(Arrays.asList(mMarker1.getPosition(), mMarker2.getPosition())); } private void showDistance() { double distance = SphericalUtil.computeDistanceBetween( mMarker1.getPosition(), mMarker2.getPosition() ); if( distance < 1000 ) { Toast.makeText(this, String.format( "%4.2f%s", distance, "m" ), Toast.LENGTH_LONG).show(); } else { Toast.makeText(this, String.format("%4.3f%s", distance/1000, "km"), Toast.LENGTH_LONG).show(); } } private void showHeading() { double heading = SphericalUtil.computeHeading( mMarker1.getPosition(), mMarker2.getPosition() ); Toast.makeText( this, "Heading: " + heading, Toast.LENGTH_LONG ).show(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu items for use in the action bar MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_spherical_utils, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle presses on the action bar items switch (item.getItemId()) { case R.id.action_distance: showDistance(); return true; case R.id.action_heading: { showHeading(); return true; } default: return super.onOptionsItemSelected(item); } } }