Pointer not displaying on my map - java

I have a map that I want to put a marker on, but the marker isn't showing up. Here is my code:
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.MyLocationOverlay;
import com.google.android.maps.OverlayItem;
public class MapDetailActivity extends MapActivity
{
private final static String TAG = MapDetailActivity.class.getSimpleName();
#Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
this.setContentView(R.layout.map_view);
// get longitude and latitude values from detail activity/object
Bundle bundle = this.getIntent().getExtras();
float latitude = bundle.getFloat("uie.top25.seattle.latitude");
float longitude = bundle.getFloat("uie.top25.seattle.longitude");
Log.i(TAG, "Latitude that is set : " + latitude);
Log.i(TAG, "Longitude that is set : " + longitude);
// create longitude and latitude map points
Double lat = latitude * 1E6;
Double lon = longitude * 1E6;
// create point on map
GeoPoint point = new GeoPoint(lat.intValue(), lon.intValue());
OverlayItem oi = new OverlayItem(point, null, null);
MapView mapView = (MapView) this.findViewById(R.id.myMapView);
MapController mapController = mapView.getController();
// set point on map
mapController.animateTo(point);
oi.setMarker(oi.getMarker(R.drawable.mm_20_red));
// set zoom level
mapController.setZoom(19);
}
#Override
protected boolean isRouteDisplayed()
{
// No driving directions, so this method returns false
return false;
}
}
Can someone tell me what I am doing wrong?

You must add your item to map using https://developers.google.com/maps/documentation/android/hello-mapview this documentation Part-2

You need to create an Overlay to display a marker, read this:
https://developers.google.com/maps/documentation/android/reference/com/google/android/maps/Overlay
If you couldn't be bothered reading all of that here's a ready to use tutorial:
http://android-er.blogspot.com/2009/11/display-marker-on-mapview-using.html

You will need to go through the documentation and examples, but the basic steps are:
1-Create your itemizedOverlay by extending the itemizedOverlay from google maps.
2-Add an overlay Item to your Itemized overlay, and set the marker or use the default one defined in the previous step.
3-Add the itemized overlay to the mapview overlays with:
mapview.getoverlays().add(myItemizedOverlay);
Just after you have add the overlay to the mapview overlays list, the overlay will be considered by mapview to be called for drawing on screen (calling the onDraw method)
good luck.

Related

Adding multiple markers and launching into new activity on click -GOOGLE MAPS-Android

How can I add multiple markers in my mapAcivity and launch into new acttivity by clicking on that marker. What I want to do is that when user searches for specific location in google map v2. He should be able to mark that location on click and launch into a new dialog activity, and then different actions will be called based on the co-ordinates of location. So far I have integrated the map but can't figure out how to add multiple markers. So far the code is
import android.content.Context;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationManager;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.util.Log;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
//import com.javaorigin.test.apk.R;
public class MapsActivity extends FragmentActivity
{
private GoogleMap newmap; // Might be null if Google Play services APK is not available.
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
Log.d("Map","MapCreated");
setUpMapIfNeeded();
}
#Override
protected void onResume() {
super.onResume();
setUpMapIfNeeded();
}
/**
* Sets up the map if it is possible to do so (i.e., the Google Play services APK is correctly
* installed) and the map has not already been instantiated.. This will ensure that we only ever
* call {#link #setUpMap()} once when {#link #newmap} is not null.
* <p/>
* If it isn't installed {#link SupportMapFragment} (and
* {#link com.google.android.gms.maps.MapView MapView}) will show a prompt for the user to
* install/update the Google Play services APK on their device.
* <p/>
* A user can return to this FragmentActivity after following the prompt and correctly
* installing/updating/enabling the Google Play services. Since the FragmentActivity may not
* have been completely destroyed during this process (it is likely that it would only be
* stopped or paused), {#link #onCreate(Bundle)} may not be called again so we should call this
* method in {#link #onResume()} to guarantee that it will be called.
*/
private void setUpMapIfNeeded() {
// Do a null check to confirm that we have not already instantiated the map.
if (newmap == null) {
// Try to obtain the map from the SupportMapFragment.
newmap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
.getMap();
// Check if we were successful in obtaining the map.
if (newmap != null) {
setUpMap();
Log.d("MAPS","Map working");
}
else Log.d("MAPS","not working");
}
}
/**
* This is where we can add markers or lines, add listeners or move the camera. In this case, we
* just add a marker near Africa.
* <p/>
* This should only be called once and when we are sure that {#link #newmap} is not null.
*/
private void setUpMap() {
newmap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker").snippet("Snippet"));
// Enable MyLocation Layer of Google Map
newmap.setMyLocationEnabled(true);
// Get LocationManager object from System Service LOCATION_SERVICE
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
// Create a criteria object to retrieve provider
Criteria criteria = new Criteria();
newmap.setTrafficEnabled(true);
// Get the name of the best provider
String provider = locationManager.getBestProvider(criteria, true);
// Get Current Location
Location myLocation = locationManager.getLastKnownLocation(provider);
// set map type
newmap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
// Get latitude of the current location
double latitude = myLocation.getLatitude();
// Get longitude of the current location
double longitude = myLocation.getLongitude();
// Create a LatLng object for the current location
LatLng latLng = new LatLng(latitude, longitude);
LatLng two = new LatLng(latitude+0.00005, longitude);
LatLng three = new LatLng(latitude+0.00007, longitude);
LatLng four = new LatLng(latitude+0.00009, longitude);
// Show the current location in Google Map
newmap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
// Zoom in the Google Map
newmap.animateCamera(CameraUpdateFactory.zoomTo(20));
newmap.addMarker(new MarkerOptions().position(new LatLng(latitude, longitude)).title("My location"));
newmap.addMarker(new MarkerOptions().position(two).title("two"));
newmap.addMarker(new MarkerOptions().position(three).title("three"));
newmap.addMarker(new MarkerOptions().position(four).title("four"));
Log.d("LATITUDE",String.valueOf(latitude));
Log.d("LONGITUDE",String.valueOf(longitude));
}
}
OnMarkerClickListener listener = new OnMarkerClickListener() {
#Override
public boolean onMarkerClick(final Marker marker) {
startActivity();
return true;
}
};
newmap.setOnMarkerClickListener(listener);
newmap.setOnMapClickListener(new OnMapClickListener() {
#Override
public void onMapClick(LatLng latLng) {
// Creating a marker
MarkerOptions markerOptions = new MarkerOptions();
// Setting the position for the marker
markerOptions.position(latLng);
// Setting the title for the marker.
// This will be displayed on taping the marker
markerOptions.title(latLng.latitude + " : " + latLng.longitude);
// Animating to the touched position
googleMap.animateCamera(CameraUpdateFactory.newLatLng(latLng));
// Placing a marker on the touched position
googleMap.addMarker(markerOptions);
}
});

Google maps api v2 show all markers title always without any click

I need that in my Map-application Google map markers title always will be shown without any user click. I want that this title even will not be possible hide.
Of course I searched online, and I found this: marker.showInfoWindow(); but it is not working because I have near to 30 markers and I need that all of them will be shown all the time (I guess marker.showInfoWindow(); working just when there is one marker).
............................................................................
(And I would like to know how to do that when map activity will start it will not show whole world from far, but from specific country. I mean already zoomed to this country.)
public class Map extends Activity {
static LatLng Sapphire = new LatLng(41.085078, 29.006100);
static LatLng Metrocity = new LatLng(41.076138, 29.010518);
static LatLng Istinye = new LatLng(41.114247, 29.058924);
private GoogleMap googleMap;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.map);
try {
if (googleMap == null) {
googleMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
}
googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
googleMap.setMyLocationEnabled(true);
googleMap.setTrafficEnabled(true);
googleMap.setIndoorEnabled(true);
googleMap.setBuildingsEnabled(true);
googleMap.getUiSettings().setZoomControlsEnabled(true);
Marker marker = googleMap.addMarker(new MarkerOptions().position(Sapphire).title("Istanbul Sapphire").snippet("Levent")); marker.showInfoWindow();
Marker marker1 = googleMap.addMarker(new MarkerOptions().position(Metrocity).title("Metrocity").snippet("Levent")); marker1.showInfoWindow();
Marker marker2 = googleMap.addMarker(new MarkerOptions().position(Istinye).title("Istinye Park").snippet("Istinye/ Pınar Mh.")); marker2.showInfoWindow();
} catch (Exception e) {
e.printStackTrace();
}
}
}

Not showing desired map

When I run the app, I get the world map, where you can see all the countries. But this is not what I want, I want it to show the map of my country or city as an example. Is there a way to do this? This is my code so far. I don't think the xml code should be necassary for this?
public class MainActivity extends Activity {
private GoogleMap gMap;
private LocationManager locationManager;
private Location location, g;
private double lati, longi;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
// gMap.setMyLocationEnabled(true);
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
System.out.println("Last known location: " + location);
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void showUsersPosition(View v) {
gMap.setMyLocationEnabled(true);
if(location != null) {
lati = location.getLatitude();
longi = location.getLongitude();
}
gMap.addMarker(new MarkerOptions().position(new LatLng(lati, longi)).title("You are here"));
}
}
I also have added a button, where I want to show the users location when this button is clicked. This happens in the method "showUsersPosition". But at this point, Location is null, even though I try to set it when the app is beeing started. Can anyone see why it is null? When the gMap.setMyLocation(true) is called, a symbole appears at the right corner, and if I click on this, it will show me my position. But I want it so that it does this when I click the button.
So the questions again are:
1. How to show the map of my country or city, and not the world map?
2. Why is Location null?
3. How do I make it show my exact location when the button is clicked
1)
You can use this on your fragment declaration to set the default latitude and longitude.
map:cameraTargetLat="Your Latitude"
map:cameraTargetLng="Your Longitude"
Do not forget to put xmlns:map="http://schemas.android.com/apk/res-auto" on your fragment if it is not there.
2) From the docs:
If the provider is currently disabled, null is returned.
Is the GPS turned on?. Also, you should use the new Location API.
3) The exactness of your Location will be based on the Provider used to get the Location. One of the advantages of using the new Fused Provider is that the system will try to get the best Location possible for you.

onMarkerClick using switch Case

I want to make marker Application using Google Maps but . I Have problem about onMarkerClick using switch Case, Iam using array to add Marker to My Application and when marker OnCLick he can call different Activity for each marker .I Have problom about that.. How I can using onMarkerClick with switch case for my application..??? Please Help . Here is My Code :
public static final String TAG = markerbanyak.TAG;
final LatLng CENTER = new LatLng(43.661049, -79.400917);
class Data {
public Data(float lng, float lat, String title, String snippet, String icon) {
super();
this.lat = (float)lat;
this.lng = (float)lng;
this.title = title;
this.snippet = snippet;
this.icon = icon;
}
float lat;
float lng;
String title;
String snippet;
String icon;
}
Data[] data = {
new Data(-79.400917f,43.661049f, "New New College Res",
"Residence building (new concrete high-rise)", "R.drawable.mr_kun"),
new Data(-79.394524f,43.655796f, "Baldwin Street",
"Here be many good restaurants!", "R.drawable.mr_kun"),
new Data(-79.402206f,43.657688f, "College St",
"Lots of discount computer stores if you forgot a cable or need to buy hardware.", "R.drawable.mr_kun"),
new Data(-79.390381f,43.659878f, "Queens Park Subway",
"Quickest way to the north-south (Yonge-University-Spadina) subway/metro line", "R.drawable.mr_kun"),
new Data(-79.403732f,43.666801f, "Spadina Subway",
"Quickest way to the east-west (Bloor-Danforth) subway/metro line", "R.drawable.mr_kun"),
new Data(-79.399696f,43.667873f, "St George Subway back door",
"Token-only admittance, else use Spadina or Bedford entrances!", "R.drawable.mr_kun"),
new Data(-79.384163f,43.655083f, "Eaton Centre (megamall)",
"One of the largest indoor shopping centres in eastern Canada. Runs from Dundas to Queen.", "R.drawable.mr_kun"),
};
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.peta);
SupportMapFragment supportMapFragment = (SupportMapFragment)
getSupportFragmentManager().findFragmentById(R.id.map);
// Getting a reference to the map
mMap = supportMapFragment.getMap();
Marker kuningan = mMap.addMarker(new MarkerOptions()
.position(KUNINGAN)
.title("Kuningan")
.snippet("Kuningan ASRI")
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.mr_kun)));
mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(KUNINGAN, 2));
// Zoom in, animating the camera.
mMap.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);
}
public void wisata(){
if (mMap==null) {
Log.d(TAG, "Map Fragment Not Found or no Map in it!!");
return;
}
for (Data d : data) {
LatLng location = new LatLng(d.lat, d.lng);
Marker wisata =mMap.addMarker(new MarkerOptions()
.position(location)
.title(d.title)
.snippet(d.snippet)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.mr_wis)));
// Let the user see indoor maps where available.
mMap.setIndoorEnabled(true);
// Enable my-location stuff
mMap.setMyLocationEnabled(true);
// Move the "camera" (view position) to our center point.
mMap.moveCamera(CameraUpdateFactory.newLatLng(CENTER));
// Then animate the markers while the map is drawing,
// since you can't combine motion and zoom setting!
final int zoom = 14;
mMap.animateCamera(CameraUpdateFactory.zoomTo(zoom), 2000, null);
mMap.setOnMarkerClickListener(new OnMarkerClickListener() {
#Override
public boolean onMarkerClick(Marker v) {
// TODO Auto-generated method stub
//(PLEASE HELP ME !!! :))
return false;
}
});
}
}
#Override
public boolean onMarkerClick(Marker v) {
// TODO Auto-generated method stub
//(PLEASE HELP ME !!! :))
if(v.getTitle().contains("New New College Res")){
// do if marker has this title
}else if(v.getTitle().contains("Baldwin Street")){
// do if marker has this title
} // and so on
return false;
}
});
Marker class if final so you can't extend it and add your own attributes. You will have to handle this using your own logic.
You can do this in two ways.
You already have a Data list with all marker data.
1) You could try to set "snippet" attribute of Marker with your array index of Data array and on onMarkerClick you can get Snippet change it back to int and that would be your Data Array's index. So you can get that your clicked Marker and it's Data object and do whatever you want to do.
2) Use HashMap.
It will look something like this
HashMap<Marker, Integer> hashMap = new HashMap<Marker, Integer>();
// now even in your loop where you are adding markers. you can also add that marker to this hashmap with the id of Data array's index.
hashMap.add(marker, indexOfDataArray);
// final in your onMarkerClick, you can just pass marker to hashMap and get indexOfDataArray and base of that do whatever you want to do.
int id = hashMap.get(marker);

I need to compare latitude and longitude coordinates that will tell a GPS user which Hooters restaurant is closest to his current position

I've done the prep work of finding accurate latitude/longitude (in decimal number notation) coordinates for all 6 Hooters restaurant locations in Wisconsin. I intend to store those coordinate values in an array of a separate class. I also already have a Location Listener in my code to get the user's current GPS location. See my code below:
package sam.finalmap.hooters;
// Camera is the view of the map.
import com.google.android.gms.maps.CameraUpdateFactory;
// the google map
import com.google.android.gms.maps.GoogleMap;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color; // for drawing a line.
import android.location.Location; // for detecting location changes with the GPS.
import android.location.LocationListener; // to listen for location changes
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.maps.MapFragment; // the Map class.
import com.google.android.gms.maps.model.LatLng; // for creating lattitudes and longitutes in memory.
import com.google.android.gms.maps.model.Polyline; // used to draw from one location to the other
import com.google.android.gms.maps.model.PolylineOptions;
/**
* Draws a map, uses GPS to get the current location, the draws a line from Eau CLaire (see constants)
* to the new position, which will be the closest Hooters restaurant to the user's current location.
* This is the AdapterView.
*
* #author daviddalsveen
*
*/
public class GMapsLocationPath extends Activity implements LocationListener {
/** Called when the activity is first created. */
private GoogleMap mMap;
// constants to hard code all 6 of Wisconsin's Hooters restaurant points on the map:
private static final float Appleton_LAT = 44.2655012f;
private static final float Appleton_LNG = -88.4768057f;
private static final float Brookfield_LAT = 43.03645f;
private static final float Brookfield_LNG = -88.124937f;
private static final float EastMadison_LAT = 43.132432f;
private static final float EastMadison_LNG = -89.3016256f;
private static final float GreenBay_LAT = 44.477903f;
private static final float GreenBay_LNG = -88.067014f;
private static final float Janesville_LAT = 42.7215666f;
private static final float Janesville_LNG = -88.9889661f;
private static final float LaCrosse_LAT = 43.8109318f;
private static final float LaCrosse_LNG = -91.2536215f;
private LocationManager locationManager;
private TextView tv; // a Textview for displaying lattitude and longitude.
private float curLat = 44.88f; // current position -- assigned constants for
// testing...
private float curLng = -91.47f;
#Override
public void onCreate(Bundle savedInstanceState) {
// called when the activity is first started.
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// recommended method by google to make the map object.
setUpMapIfNeeded();
// Sets the map type to be "normal"
mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
tv = (TextView) findViewById(R.id.label1);
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
500, 1, this);
Location location = locationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER);
// 500 is the minimum time interval to update, in milliseconds
// 1 is the distance in meters in which to sense an update.
// 'this' is the pending intent.
// center latitude and longitude for EC
float lat = Appleton_LAT;
float lng = Appleton_LNG;
// debug example...
Toast.makeText(this, "" + (int) (lat * 1E6), Toast.LENGTH_LONG).show();
if (location == null) { // no last known location
locationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER,
this, null);
// Create a new Lattitude Longitude Object, passing it the
// coordinates.
LatLng latLng = new LatLng(lat, lng);
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 10.0f));
// re-draw
} else {
// explicitly call and update view with last known location or the
// one set above.
onLocationChanged(location);
}
}
/**
* Checks to see that the map exists, if not, creates one.
*/
private void setUpMapIfNeeded() {
// Do a null check to confirm that we have not already instantiated the
// map.
if (mMap == null) {
mMap = ((MapFragment) getFragmentManager().findFragmentById(
R.id.map)).getMap();
// Check if we were successful in obtaining the map.
if (mMap != null) {
// The Map is verified. It is now safe to manipulate the map.
}// else?
}
}
// Java Interface RULE NOTE: that we must implement every method of
// interface LocationListener,
// whether we use the method or not.
/**
* Use the GPS to get the current location of the user
*
*/
public void onLocationChanged(final Location loc) {
String lat = String.valueOf(loc.getLatitude());
String lon = String.valueOf(loc.getLongitude());
Log.e("GPS", "location changed: lat=" + lat + ", lon=" + lon);
tv.setText("lat=" + lat + ", lon=" + lon);
curLat = Float.parseFloat(lat); // update the current lattitude and longitude.
curLng = Float.parseFloat(lon);
// Create a new Lattitude Longitude Object, passing it the coordinates.
LatLng latLng = new LatLng(curLat, curLng);
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 10.0f));
// re-draw
draw();
}
public void onProviderDisabled(String loc) {
Log.e("GPS", "provider disabled " + loc);
}
public void onProviderEnabled(String loc) {
Log.e("GPS", "provider enabled " + loc);
}
/**
* loc: name of location provider status: status of location provider
* (temporarily unavailable, etc) extras: optional bundle with additional
* status information
*/
public void onStatusChanged(String loc, int status, Bundle extras) {
Log.e("GPS", "status changed to " + loc + " [" + status + "]");
}
/**
* Draw a line from
*/
public void draw() {
float lat = 44.88f;
float lng = -91.48f;
// Instantiates a new Polyline object and adds points to define a
// endpoints of a line
PolylineOptions rectOptions = new PolylineOptions().add(
new LatLng(curLat, curLng))
.add(new LatLng(lat, lng)); // Closes the polyline.
// Set the rectangle's color to red
rectOptions.color(Color.RED);
// Get back the mutable Polyline
Polyline polyline = mMap.addPolyline(rectOptions);
}
}
What I want help with here is finding a way to parse through the array, and compare the difference of the user's location with each of the 6 restaurant locations, and whichever difference is smallest (whichever restaurant location is closest to the user) is the restaurant that will be selected and who's information will displayed.
That said, how do I tell it to use the smallest difference after it finishes parsing through the array and getting all 6 of the latitude/longitude differences?
/**
* My teacher suggested subtracting the current latitudes and longitudes from the restaurant latitudes and
* longitudes to see if they fall within a certain range (lets just say less than 10). Then, using the resulting
* differences as absolute values in an if statement (if absolute value < 10 for both are true), that restaurant
* would be the one selected:
*/
//float[] H_Latitude = {44.2655012f, 43.03645f, 43.132432f, 44.477903f, 42.7215666f, 43.8109318f};
//float[] H_Longitude = {-88.4768057f, -88.124937f, -89.3016256f, -88.067014f, -88.9889661f, -91.2536215f};
float LATdifference = curLat - H_Latitude;
float LNGdifference = curLng - H_Longitude;//I'm pretty sure I can't use "H_Longitude and H_Latitude", because
//they're merely the name of the array. So how do I access the elements inside of them? How do I successfully
//address them with a reference variable that I can use to dynamically subtract from curLat and curLng and get
//what I need to replace the "i" in the for loops:
for (float LATdifference = 0; i < 4; i++) {
System.out.println (count[i]);
}
Try Location.distanceBetween(): reference
You could feed the GPS coordinates into the Google Directions API and use the travel distance to determine the closest store.
The Android Location class has a distanceTo or distanceBetween method that you could use to get a straight line distance between 2 GPS points. You could use this to narrow it down to 2-3 candidates and then use the directions api to get a final answer.

Categories

Resources