根据纬度和经度,我应该使用哪种谷歌API来解决从原点到目的地的道路距离

时间:2015-10-20 05:03:05

标签: android api google-maps autocomplete

我正在创建一个需要在印度两个地点之间使用行车距离的应用程序,我很困惑使用哪个API。用户将在应用程序中输入源和目标,其余应自动完成。

2 个答案:

答案 0 :(得分:0)

我认为以下代码可以提供帮助。

Routing.java

public class Routing extends AsyncTask<LatLng, Void, Route>
{
private final GoogleMap map;
private LatLng start;
private LatLng dest;
private final LatLngBounds.Builder builder = new LatLngBounds.Builder();;
private final int[] lineColor = { Color.GREEN };
private final int pos;

public Routing(final Activity activity, final GoogleMap map) {
super();
this.map = map;
this.pos = 0;
}

private TextView txtDistance;

public Routing(final Activity activity, final GoogleMap map, final TextView txtDistance) {
super();
this.map = map;
this.pos = 0;
this.txtDistance = txtDistance;
}

@Override
protected Route doInBackground(final LatLng... points) {
try {
    start = points[0];
    dest = points[1];
    Parser parser;
    final String jsonURL = "http://maps.googleapis.com/maps/api/directions/json?";
    final StringBuffer sBuf = new StringBuffer(jsonURL);
    sBuf.append("origin=");
    sBuf.append(start.latitude);
    sBuf.append(',');
    sBuf.append(start.longitude);
    sBuf.append("&destination=");
    sBuf.append(dest.latitude);
    sBuf.append(',');
    sBuf.append(dest.longitude);
    sBuf.append("&sensor=true&mode=driving");
    System.out.println("sbuf: " + sBuf.toString());
    parser = new GoogleParser(sBuf.toString());
    final Route route = parser.parse();
    return route;
} catch (final Exception e) {}
return null;
}

@Override
protected void onPreExecute() {
/** Empty Method */
}// end onPreExecute method

@SuppressLint("ResourceAsColor")
@Override
protected void onPostExecute(final Route result) {
try {
    if (result == null) {
    map.moveCamera(CameraUpdateFactory.newLatLngZoom(dest, 15));
    map.animateCamera(CameraUpdateFactory.zoomTo(18), 2000, null);
    } else {
    final String text = result.getTextLength();
    final String startAddress = result.getStartAddress().toString().trim().replaceAll(", ", ",\n");
    final String endAddress = result.getEndAddress().toString().trim().replaceAll(", ", ",\n");
    txtDistance.setVisibility(View.GONE);
    if (text != null) {
        txtDistance.setVisibility(View.VISIBLE);
        txtDistance.setBackgroundResource(android.R.color.holo_orange_light);
        txtDistance.setText(" Total Distance : " + text + "\n Total Duration : " + result.getDuration() + "  ");
    }
    final List<LatLng> directionPoint = result.getPoints();
    final PolylineOptions rectLine = new PolylineOptions().width(10).color(lineColor[pos]);
    for (int i = 0; i < directionPoint.size(); i++) {
        rectLine.add(directionPoint.get(i));
    }
    map.addPolyline(rectLine);

    final Marker startLocation = map.addMarker(new MarkerOptions().position(start).title(startAddress).snippet("Main Location").icon(BitmapDescriptorFactory.fromResource(R.drawable.markera)));
    final Marker endLocation = map.addMarker(new MarkerOptions().position(dest).title(endAddress).snippet("Destination Location").icon(BitmapDescriptorFactory.fromResource(R.drawable.markerb)));
    builder.include(startLocation.getPosition());
    builder.include(endLocation.getPosition());
    final LatLngBounds bounds = builder.build();

    // Pan to see all markers in view.
    final int padding = 100; // offset from edges of the map in pixels
    final CameraUpdate cup = CameraUpdateFactory.newLatLngBounds(bounds, padding);

    map.moveCamera(cup);
    map.animateCamera(cup);

    }
} catch (final Exception e) {
    e.printStackTrace();
}
}// end onPostExecute method
}

在地图活动中添加以下行。

@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (Utils.isGPSTurnOn(getApplicationContext())) {
        onResume();
    }
}
@Override
protected void onResume() {
    super.onResume();
    if (Utils.isConnected(getApplicationContext())) {
        mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
        mMap.setMyLocationEnabled(true);
        final TextView txtDistance = (TextView) findViewById(R.id.txtSpeed);
        new Routing(getParent(), mMap, txtDistance).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, start, end);
    }
}

Utils.java

public class Utils
{
/**
 * @Method used to checks if device having network connection or not.
 * @param context the context
 * @return <code>true</code> if the phone is connected
 */
public static boolean isConnected(final Context context) {
try {
    final ConnectivityManager connMngr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

    final NetworkInfo wifiNetwork = connMngr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    if (wifiNetwork != null && wifiNetwork.isConnectedOrConnecting()) { return true; }

    final NetworkInfo mobileNetwork = connMngr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
    if (mobileNetwork != null && mobileNetwork.isConnectedOrConnecting()) { return true; }

    final NetworkInfo activeNetwork = connMngr.getActiveNetworkInfo();
    if (activeNetwork != null && activeNetwork.isConnectedOrConnecting()) { return true; }
} catch (final Exception e) {
    e.printStackTrace();
}
return false;
}

public static boolean isGPSTurnOn(final Context context) {
final LocationManager manager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
return manager.isProviderEnabled(LocationManager.GPS_PROVIDER);
}

}

activity_map.xml

<RelativeLayout  xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >

<fragment
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    class="com.google.android.gms.maps.MapFragment" />

<TextView
    android:id="@+id/txtSpeed"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:visibility="gone"
    android:textStyle="bold"
    android:text="@string/hello_world" />
 </RelativeLayout> 

答案 1 :(得分:0)

查看Google Places API,它拥有您需要的一切。

https://developers.google.com/places/android-api/?hl=en