如何在Google Maps API V2中从我的位置绘制路线

13

我想制作一个导航应用程序,但是我在从我的位置到目的地画路线时遇到了问题。我已经获取了我的位置的经度和纬度变量,但我不知道如何绘制线条。我想绘制到这个位置的方向= -6.984873352070259,108.48140716552734。请帮帮我..我之前已经读过一些问题,但是我找不到解决方案..谢谢..很抱歉..这是我的代码

package com.apps.visitkuningan;

import android.app.Dialog;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.Menu;
import android.widget.Toast;


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.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;

public class Arahkan extends FragmentActivity implements LocationListener {

    GoogleMap googleMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 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) {

        // 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));

    }

    @Override
    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub
         Toast.makeText( getApplicationContext(), "Gps Disabled", Toast.LENGTH_SHORT ).show();
    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub
         Toast.makeText( getApplicationContext(), "Gps Enabled", Toast.LENGTH_SHORT).show();

    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }


}

我是Android编程的新手,希望你能帮助我。谢谢:)


请参考以下链接,了解有关绘制路径的相关编程内容: 绘制路径 - Melbourne Lopes
3个回答

18

假设您至少拥有两个位置对象,您可以绘制一条折线。该方法会在地图上绘制一条半透明的蓝色线,根据给定的位置列表。这段代码取自当前在Android Play商店上的一个应用程序(Simply Walking)。

private void drawPrimaryLinePath( ArrayList<Location> listLocsToDraw )
{
    if ( map == null )
    {
        return;
    }

    if ( listLocsToDraw.size() < 2 )
    {
        return;
    }

    PolylineOptions options = new PolylineOptions();

    options.color( Color.parseColor( "#CC0000FF" ) );
    options.width( 5 );
    options.visible( true );

    for ( Location locRecorded : listLocsToDraw )
    {
        options.add( new LatLng( locRecorded.getLatitude(),
                                 locRecorded.getLongitude() ) );
    }

    map.addPolyline( options );

}

你不需要解码路径吗?https://developers.google.com/maps/documentation/utilities/polylinealgorithm - IgorGanapolsky

9
首先,您可以使用Google Directions API获取两个位置坐标之间的方向。
public static ArrayList getDirections(double lat1, double lon1, double lat2, double lon2) {
    String url = "http://maps.googleapis.com/maps/api/directions/xml?origin=" +lat1 + "," + lon1  + "&destination=" + lat2 + "," + lon2 + "&sensor=false&units=metric";
    String tag[] = { "lat", "lng" };
    ArrayList list_of_geopoints = new ArrayList();
    HttpResponse response = null;
    try {
        HttpClient httpClient = new DefaultHttpClient();
        HttpContext localContext = new BasicHttpContext();
        HttpPost httpPost = new HttpPost(url);
        response = httpClient.execute(httpPost, localContext);
        InputStream in = response.getEntity().getContent();
        DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document doc = builder.parse(in);
        if (doc != null) {
            NodeList nl1, nl2;
            nl1 = doc.getElementsByTagName(tag[0]);
            nl2 = doc.getElementsByTagName(tag[1]);
            if (nl1.getLength() > 0) {
                list_of_geopoints = new ArrayList();
                for (int i = 0; i < nl1.getLength(); i++) {
                    Node node1 = nl1.item(i);
                    Node node2 = nl2.item(i);
                    double lat = Double.parseDouble(node1.getTextContent());
                    double lng = Double.parseDouble(node2.getTextContent());
                    list_of_geopoints.add(new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6)));
                }
            } else {
                // No points found
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return list_of_geopoints;
}

在您的Android应用程序中创建MapView布局后,您可以包含此自定义的Overlay类。

public class MyOverlay extends Overlay {

private ArrayList all_geo_points;

public MyOverlay(ArrayList allGeoPoints) {
    super();
    this.all_geo_points = allGeoPoints;
}

@Override
public boolean draw(Canvas canvas, MapView mv, boolean shadow, long when) {
    super.draw(canvas, mv, shadow);
    drawPath(mv, canvas);
    return true;
}

public void drawPath(MapView mv, Canvas canvas) {
    int xPrev = -1, yPrev = -1, xNow = -1, yNow = -1;
    Paint paint = new Paint();
    paint.setColor(Color.BLUE);
    paint.setStyle(Paint.Style.FILL_AND_STROKE);
    paint.setStrokeWidth(4);
paint.setAlpha(100);
    if (all_geo_points != null)
        for (int i = 0; i < all_geo_points.size() - 4; i++) {
            GeoPoint gp = all_geo_points.get(i);
            Point point = new Point();
            mv.getProjection().toPixels(gp, point);
            xNow = point.x;
            yNow = point.y;
            if (xPrev != -1) {
                canvas.drawLine(xPrev, yPrev, xNow, yNow, paint);
            }
            xPrev = xNow;
            yPrev = yNow;
        }
    }
}

在将此覆盖层添加到MapView的覆盖层之前,可以调用getDirections()函数。

MapView mv = (MapView) findViewById(R.id.mvGoogle);
mv.setBuiltInZoomControls(true);
MapController mc = mv.getController();
ArrayList all_geo_points = getDirections(17.3849, 78.4866, 28.63491, 77.22461);
GeoPoint moveTo = all_geo_points.get(0);
mc.animateTo(moveTo);
mc.setZoom(12);
mv.getOverlays().add(new MyOverlay(all_geo_points));

什么是HttpClient和HttpResponse? - IgorGanapolsky
对象用于执行URL调用。请参阅https://developers.google.com/maps/documentation/directions/。 - Adriano G. V. Esposito

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接