Рисование линии/пути на картах Google
Я был занят в течение длительного времени, выясняя, как провести линию между двумя точками (GPS) на карте в HelloMapView, но не повезло.
может кто-нибудь пожалуйста, скажите мне, как это сделать.
предположим, я использую HelloMapView, который расширяет MapView. Нужно ли использовать оверлеи? Если да, то мне нужно переопределить метод onDraw() наложения и нарисовать линию здесь? Я действительно пробовал эти вещи, но безрезультатно.
спасибо заранее!
12 ответов:
Спасибо за помощь. Наконец-то я смог нарисовать линию на карте. Вот как я это сделал:
/** Called when the activity is first created. */ private List<Overlay> mapOverlays; private Projection projection; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); linearLayout = (LinearLayout) findViewById(R.id.zoomview); mapView = (MapView) findViewById(R.id.mapview); mapView.setBuiltInZoomControls(true); mapOverlays = mapView.getOverlays(); projection = mapView.getProjection(); mapOverlays.add(new MyOverlay()); } @Override protected boolean isRouteDisplayed() { return false; } class MyOverlay extends Overlay{ public MyOverlay(){ } public void draw(Canvas canvas, MapView mapv, boolean shadow){ super.draw(canvas, mapv, shadow); Paint mPaint = new Paint(); mPaint.setDither(true); mPaint.setColor(Color.RED); mPaint.setStyle(Paint.Style.FILL_AND_STROKE); mPaint.setStrokeJoin(Paint.Join.ROUND); mPaint.setStrokeCap(Paint.Cap.ROUND); mPaint.setStrokeWidth(2); GeoPoint gP1 = new GeoPoint(19240000,-99120000); GeoPoint gP2 = new GeoPoint(37423157, -122085008); Point p1 = new Point(); Point p2 = new Point(); Path path = new Path(); Projection projection=mapv.getProjection(); projection.toPixels(gP1, p1); projection.toPixels(gP2, p2); path.moveTo(p2.x, p2.y); path.lineTo(p1.x,p1.y); canvas.drawPath(path, mPaint); }
для тех, кто лишь хотите нарисовать простую линию-есть действительно и короткая короткая версия.
GoogleMap map; // ... get a map. // Add a thin red line from London to New York. Polyline line = map.addPolyline(new PolylineOptions() .add(new LatLng(51.5, -0.1), new LatLng(40.7, -74.0)) .width(5) .color(Color.RED));
// This Activity will draw a line between two selected points on Map public class MainActivity extends MapActivity { MapView myMapView = null; MapController myMC = null; GeoPoint geoPoint = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); myMapView = (MapView) findViewById(R.id.mapview); geoPoint = null; myMapView.setSatellite(false); String pairs[] = getDirectionData("ahmedabad", "vadodara"); String[] lngLat = pairs[0].split(","); // STARTING POINT GeoPoint startGP = new GeoPoint( (int) (Double.parseDouble(lngLat[1]) * 1E6), (int) (Double .parseDouble(lngLat[0]) * 1E6)); myMC = myMapView.getController(); geoPoint = startGP; myMC.setCenter(geoPoint); myMC.setZoom(15); myMapView.getOverlays().add(new DirectionPathOverlay(startGP, startGP)); // NAVIGATE THE PATH GeoPoint gp1; GeoPoint gp2 = startGP; for (int i = 1; i < pairs.length; i++) { lngLat = pairs[i].split(","); gp1 = gp2; // watch out! For GeoPoint, first:latitude, second:longitude gp2 = new GeoPoint((int) (Double.parseDouble(lngLat[1]) * 1E6), (int) (Double.parseDouble(lngLat[0]) * 1E6)); myMapView.getOverlays().add(new DirectionPathOverlay(gp1, gp2)); Log.d("xxx", "pair:" + pairs[i]); } // END POINT myMapView.getOverlays().add(new DirectionPathOverlay(gp2, gp2)); myMapView.getController().animateTo(startGP); myMapView.setBuiltInZoomControls(true); myMapView.displayZoomControls(true); } @Override protected boolean isRouteDisplayed() { // TODO Auto-generated method stub return false; } private String[] getDirectionData(String srcPlace, String destPlace) { String urlString = "http://maps.google.com/maps?f=d&hl=en&saddr=" + srcPlace + "&daddr=" + destPlace + "&ie=UTF8&0&om=0&output=kml"; Log.d("URL", urlString); Document doc = null; HttpURLConnection urlConnection = null; URL url = null; String pathConent = ""; try { url = new URL(urlString.toString()); urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setRequestMethod("GET"); urlConnection.setDoOutput(true); urlConnection.setDoInput(true); urlConnection.connect(); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); doc = db.parse(urlConnection.getInputStream()); } catch (Exception e) { } NodeList nl = doc.getElementsByTagName("LineString"); for (int s = 0; s < nl.getLength(); s++) { Node rootNode = nl.item(s); NodeList configItems = rootNode.getChildNodes(); for (int x = 0; x < configItems.getLength(); x++) { Node lineStringNode = configItems.item(x); NodeList path = lineStringNode.getChildNodes(); pathConent = path.item(0).getNodeValue(); } } String[] tempContent = pathConent.split(" "); return tempContent; } } //***************************************************************************** DirectionPathOverlay public class DirectionPathOverlay extends Overlay { private GeoPoint gp1; private GeoPoint gp2; public DirectionPathOverlay(GeoPoint gp1, GeoPoint gp2) { this.gp1 = gp1; this.gp2 = gp2; } @Override public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) { // TODO Auto-generated method stub Projection projection = mapView.getProjection(); if (shadow == false) { Paint paint = new Paint(); paint.setAntiAlias(true); Point point = new Point(); projection.toPixels(gp1, point); paint.setColor(Color.BLUE); Point point2 = new Point(); projection.toPixels(gp2, point2); paint.setStrokeWidth(2); canvas.drawLine((float) point.x, (float) point.y, (float) point2.x, (float) point2.y, paint); } return super.draw(canvas, mapView, shadow, when); } @Override public void draw(Canvas canvas, MapView mapView, boolean shadow) { // TODO Auto-generated method stub super.draw(canvas, mapView, shadow); } }
Это полный исходный код для рисования пути направления от исходной широты и долготы до широты и долготы назначения. Я изменил приведенный выше код, чтобы он соответствовал широте и долготе, а не источнику и месту назначения. Таким образом, любой, кто получает доступ к своей широте и долготе через свой gps, может получить направление от своего gps-устройства до координат места назначения.
благодаря вышеприведенным ответам мы могли бы сделать такое изменение и получить путь направление.
public class DrawMapActivity extends MapActivity { MapView myMapView = null; MapController myMC = null; GeoPoint geoPoint = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); myMapView = (MapView) findViewById(R.id.mapview); geoPoint = null; myMapView.setSatellite(false); double fromLat = 12.303534; double fromLong = 76.64611; double toLat = 12.9715987; double toLong = 77.5945627; String sourceLat = Double.toString(fromLat); String sourceLong = Double.toString(fromLong); String destinationLat = Double.toString(toLat); String destinationLong = Double.toString(toLong); String pairs[] = getDirectionData(sourceLat,sourceLong, destinationLat, destinationLong ); String[] lngLat = pairs[0].split(","); // STARTING POINT GeoPoint startGP = new GeoPoint((int) (Double.parseDouble(lngLat[1]) * 1E6), (int) (Double.parseDouble(lngLat[0]) * 1E6)); myMC = myMapView.getController(); geoPoint = startGP; myMC.setCenter(geoPoint); myMC.setZoom(10); myMapView.getOverlays().add(new DirectionPathOverlay(startGP, startGP)); // NAVIGATE THE PATH GeoPoint gp1; GeoPoint gp2 = startGP; for (int i = 1; i < pairs.length; i++) { lngLat = pairs[i].split(","); gp1 = gp2; // watch out! For GeoPoint, first:latitude, second:longitude gp2 = new GeoPoint((int) (Double.parseDouble(lngLat[1]) * 1E6),(int) (Double.parseDouble(lngLat[0]) * 1E6)); myMapView.getOverlays().add(new DirectionPathOverlay(gp1, gp2)); Log.d("xxx", "pair:" + pairs[i]); } // END POINT myMapView.getOverlays().add(new DirectionPathOverlay(gp2, gp2)); myMapView.getController().animateTo(startGP); myMapView.setBuiltInZoomControls(true); myMapView.displayZoomControls(true); } @Override protected boolean isRouteDisplayed() { // TODO Auto-generated method stub return false; } private String[] getDirectionData(String sourceLat, String sourceLong, String destinationLat, String destinationLong) { String urlString = "http://maps.google.com/maps?f=d&hl=en&" +"saddr="+sourceLat+","+sourceLong+"&daddr="+destinationLat+","+destinationLong + "&ie=UTF8&0&om=0&output=kml"; Log.d("URL", urlString); Document doc = null; HttpURLConnection urlConnection = null; URL url = null; String pathConent = ""; try { url = new URL(urlString.toString()); urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setRequestMethod("GET"); urlConnection.setDoOutput(true); urlConnection.setDoInput(true); urlConnection.connect(); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); doc = db.parse(urlConnection.getInputStream()); } catch (Exception e) { } NodeList nl = doc.getElementsByTagName("LineString"); for (int s = 0; s < nl.getLength(); s++) { Node rootNode = nl.item(s); NodeList configItems = rootNode.getChildNodes(); for (int x = 0; x < configItems.getLength(); x++) { Node lineStringNode = configItems.item(x); NodeList path = lineStringNode.getChildNodes(); pathConent = path.item(0).getNodeValue(); } } String[] tempContent = pathConent.split(" "); return tempContent; } } //***************************************************************************** class DirectionPathOverlay extends Overlay { private GeoPoint gp1; private GeoPoint gp2; public DirectionPathOverlay(GeoPoint gp1, GeoPoint gp2) { this.gp1 = gp1; this.gp2 = gp2; } @Override public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) { // TODO Auto-generated method stub Projection projection = mapView.getProjection(); if (shadow == false) { Paint paint = new Paint(); paint.setAntiAlias(true); Point point = new Point(); projection.toPixels(gp1, point); paint.setColor(Color.BLUE); Point point2 = new Point(); projection.toPixels(gp2, point2); paint.setStrokeWidth(2); canvas.drawLine((float) point.x, (float) point.y, (float) point2.x,(float) point2.y, paint); } return super.draw(canvas, mapView, shadow, when); } @Override public void draw(Canvas canvas, MapView mapView, boolean shadow) { // TODO Auto-generated method stub super.draw(canvas, mapView, shadow); } }
надеюсь, что это поможет для других пользователей переполнения стека
Это можно сделать с помощью intents тоже:
final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse( "http://maps.google.com/maps?" + "saddr="+YOUR_START_LONGITUDE+","+YOUR_START_LATITUDE+"&daddr="YOUR_END_LONGITUDE+","+YOUR_END_LATITUDE)); intent.setClassName( "com.google.android.apps.maps", "com.google.android.maps.MapsActivity"); startActivity(intent);
да, вам нужно использовать оверлеи.
вам нужно получить наложение MapView и добавить на него новое наложение.
ваш класс расширяет наложение, которое представляет собой прозрачный холст, на котором вы можете рисовать на нем, как и на любом другом холсте.
вы можете использовать mapView.getProjection () для получения проекции вида карты.
...
дополнительная информация находится здесь:http://blogoscoped.com/archive/2008-12-15-n14.html
это действительно легко с Google Maps Android API v2
просто скопируйте пример из документация для разработчиков
(конечно, вы должны сначала ввести свою карту)
GoogleMap map; // ... get a map. // Add a thin red line from London to New York. Polyline line = map.addPolyline(new PolylineOptions() .add(new LatLng(51.5, -0.1), new LatLng(40.7, -74.0)) .width(5) .color(Color.RED));
вы можете получить проекцию из объекта MapView, который передается в метод draw() : mapv.getProjection ().toPixels (gP1, p1);
public class MainActivity extends FragmentActivity { List<Overlay> mapOverlays; GeoPoint point1, point2; LocationManager locManager; Drawable drawable; Document document; GMapV2GetRouteDirection v2GetRouteDirection; LatLng fromPosition; LatLng toPosition; GoogleMap mGoogleMap; MarkerOptions markerOptions; Location location ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); v2GetRouteDirection = new GMapV2GetRouteDirection(); SupportMapFragment supportMapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); mGoogleMap = supportMapFragment.getMap(); // Enabling MyLocation in Google Map mGoogleMap.setMyLocationEnabled(true); mGoogleMap.getUiSettings().setZoomControlsEnabled(true); mGoogleMap.getUiSettings().setCompassEnabled(true); mGoogleMap.getUiSettings().setMyLocationButtonEnabled(true); mGoogleMap.getUiSettings().setAllGesturesEnabled(true); mGoogleMap.setTrafficEnabled(true); mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(12)); markerOptions = new MarkerOptions(); fromPosition = new LatLng(11.663837, 78.147297); toPosition = new LatLng(11.723512, 78.466287); GetRouteTask getRoute = new GetRouteTask(); getRoute.execute(); } /** * * @author VIJAYAKUMAR M * This class Get Route on the map * */ private class GetRouteTask extends AsyncTask<String, Void, String> { private ProgressDialog Dialog; String response = ""; @Override protected void onPreExecute() { Dialog = new ProgressDialog(MainActivity.this); Dialog.setMessage("Loading route..."); Dialog.show(); } @Override protected String doInBackground(String... urls) { //Get All Route values document = v2GetRouteDirection.getDocument(fromPosition, toPosition, GMapV2GetRouteDirection.MODE_DRIVING); response = "Success"; return response; } @Override protected void onPostExecute(String result) { mGoogleMap.clear(); if(response.equalsIgnoreCase("Success")){ ArrayList<LatLng> directionPoint = v2GetRouteDirection.getDirection(document); PolylineOptions rectLine = new PolylineOptions().width(10).color( Color.RED); for (int i = 0; i < directionPoint.size(); i++) { rectLine.add(directionPoint.get(i)); } // Adding route on the map mGoogleMap.addPolyline(rectLine); markerOptions.position(toPosition); markerOptions.draggable(true); mGoogleMap.addMarker(markerOptions); } Dialog.dismiss(); } } @Override protected void onStop() { super.onStop(); finish(); } }
вспомогательный класс маршрута
public class GMapV2GetRouteDirection { public final static String MODE_DRIVING = "driving"; public final static String MODE_WALKING = "walking"; public GMapV2GetRouteDirection() { } public Document getDocument(LatLng start, LatLng end, String mode) { String url = "http://maps.googleapis.com/maps/api/directions/xml?" + "origin=" + start.latitude + "," + start.longitude + "&destination=" + end.latitude + "," + end.longitude + "&sensor=false&units=metric&mode=driving"; try { HttpClient httpClient = new DefaultHttpClient(); HttpContext localContext = new BasicHttpContext(); HttpPost httpPost = new HttpPost(url); HttpResponse response = httpClient.execute(httpPost, localContext); InputStream in = response.getEntity().getContent(); DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document doc = builder.parse(in); return doc; } catch (Exception e) { e.printStackTrace(); } return null; } public String getDurationText (Document doc) { NodeList nl1 = doc.getElementsByTagName("duration"); Node node1 = nl1.item(0); NodeList nl2 = node1.getChildNodes(); Node node2 = nl2.item(getNodeIndex(nl2, "text")); Log.i("DurationText", node2.getTextContent()); return node2.getTextContent(); } public int getDurationValue (Document doc) { NodeList nl1 = doc.getElementsByTagName("duration"); Node node1 = nl1.item(0); NodeList nl2 = node1.getChildNodes(); Node node2 = nl2.item(getNodeIndex(nl2, "value")); Log.i("DurationValue", node2.getTextContent()); return Integer.parseInt(node2.getTextContent()); } public String getDistanceText (Document doc) { NodeList nl1 = doc.getElementsByTagName("distance"); Node node1 = nl1.item(0); NodeList nl2 = node1.getChildNodes(); Node node2 = nl2.item(getNodeIndex(nl2, "text")); Log.i("DistanceText", node2.getTextContent()); return node2.getTextContent(); } public int getDistanceValue (Document doc) { NodeList nl1 = doc.getElementsByTagName("distance"); Node node1 = nl1.item(0); NodeList nl2 = node1.getChildNodes(); Node node2 = nl2.item(getNodeIndex(nl2, "value")); Log.i("DistanceValue", node2.getTextContent()); return Integer.parseInt(node2.getTextContent()); } public String getStartAddress (Document doc) { NodeList nl1 = doc.getElementsByTagName("start_address"); Node node1 = nl1.item(0); Log.i("StartAddress", node1.getTextContent()); return node1.getTextContent(); } public String getEndAddress (Document doc) { NodeList nl1 = doc.getElementsByTagName("end_address"); Node node1 = nl1.item(0); Log.i("StartAddress", node1.getTextContent()); return node1.getTextContent(); } public String getCopyRights (Document doc) { NodeList nl1 = doc.getElementsByTagName("copyrights"); Node node1 = nl1.item(0); Log.i("CopyRights", node1.getTextContent()); return node1.getTextContent(); } public ArrayList<LatLng> getDirection (Document doc) { NodeList nl1, nl2, nl3; ArrayList<LatLng> listGeopoints = new ArrayList<LatLng>(); nl1 = doc.getElementsByTagName("step"); if (nl1.getLength() > 0) { for (int i = 0; i < nl1.getLength(); i++) { Node node1 = nl1.item(i); nl2 = node1.getChildNodes(); Node locationNode = nl2.item(getNodeIndex(nl2, "start_location")); nl3 = locationNode.getChildNodes(); Node latNode = nl3.item(getNodeIndex(nl3, "lat")); double lat = Double.parseDouble(latNode.getTextContent()); Node lngNode = nl3.item(getNodeIndex(nl3, "lng")); double lng = Double.parseDouble(lngNode.getTextContent()); listGeopoints.add(new LatLng(lat, lng)); locationNode = nl2.item(getNodeIndex(nl2, "polyline")); nl3 = locationNode.getChildNodes(); latNode = nl3.item(getNodeIndex(nl3, "points")); ArrayList<LatLng> arr = decodePoly(latNode.getTextContent()); for(int j = 0 ; j < arr.size() ; j++) { listGeopoints.add(new LatLng(arr.get(j).latitude, arr.get(j).longitude)); } locationNode = nl2.item(getNodeIndex(nl2, "end_location")); nl3 = locationNode.getChildNodes(); latNode = nl3.item(getNodeIndex(nl3, "lat")); lat = Double.parseDouble(latNode.getTextContent()); lngNode = nl3.item(getNodeIndex(nl3, "lng")); lng = Double.parseDouble(lngNode.getTextContent()); listGeopoints.add(new LatLng(lat, lng)); } } return listGeopoints; } private int getNodeIndex(NodeList nl, String nodename) { for(int i = 0 ; i < nl.getLength() ; i++) { if(nl.item(i).getNodeName().equals(nodename)) return i; } return -1; } private ArrayList<LatLng> decodePoly(String encoded) { ArrayList<LatLng> poly = new ArrayList<LatLng>(); int index = 0, len = encoded.length(); int lat = 0, lng = 0; while (index < len) { int b, shift = 0, result = 0; do { b = encoded.charAt(index++) - 63; result |= (b & 0x1f) << shift; shift += 5; } while (b >= 0x20); int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); lat += dlat; shift = 0; result = 0; do { b = encoded.charAt(index++) - 63; result |= (b & 0x1f) << shift; shift += 5; } while (b >= 0x20); int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); lng += dlng; LatLng position = new LatLng((double) lat / 1E5, (double) lng / 1E5); poly.add(position); } return poly; } }
просто я найду рисовать с некоторым прямоугольником в
mapview
просто мы хотим изменить краска, как нам нравитсяпустая накладка.java
public class EmptyOverlay extends Overlay { private float x1,y1; private MapExampleActivity mv = null; private Overlay overlay = null; public EmptyOverlay(MapExampleActivity mapV){ mv = mapV; } @Override public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) { // TODO Auto-generated method stub return super.draw(canvas, mapView, shadow, when); } @Override public boolean onTouchEvent(MotionEvent e, MapView mapView) { if(mv.isEditMode()){ if(e.getAction() == MotionEvent.ACTION_DOWN){ //when user presses the map add a new overlay to the map //move events will be catched by newly created overlay x1 = y1 = 0; x1 = e.getX(); y1 = e.getY(); overlay = new MapOverlay(mv, x1, y1); mapView.getOverlays().add(overlay); } if(e.getAction() == MotionEvent.ACTION_MOVE){ } //---when user lifts his finger--- if (e.getAction() == MotionEvent.ACTION_UP) { } return true; } return false; } }
MapExampleActivity.java
public class MapExampleActivity extends MapActivity { private MapView mapView; private boolean isEditMode = false; private Button toogle; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); toogle = (Button)findViewById(R.id.toogleMap); toogle.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { toogleEditMode(); } }); mapView = (MapView)findViewById(R.id.mapview); mapView.setBuiltInZoomControls(true); //display zoom controls //add one empty overlay acting as a overlay loader. This will catch press events and will add the actual overlays mapView.getOverlays().add(new EmptyOverlay(this)); mapView.postInvalidate(); } //toogle edit mode for drawing or navigating the map private void toogleEditMode(){ isEditMode = !isEditMode; } @Override protected boolean isRouteDisplayed() { // TODO Auto-generated method stub return false; } @Override protected boolean isLocationDisplayed() { return false; } public boolean isEditMode(){ return this.isEditMode; } public MapView getMapView(){ return this.mapView; } }
MapOverlay.java
public class MapOverlay extends Overlay { private float x1,y1,x2,y2; private GeoPoint p1=null,p2=null; private MapExampleActivity mv = null; private Paint paint = new Paint(); private boolean isUp = false; //constructor receiving the initial point public MapOverlay(MapExampleActivity mapV,float x,float y){ paint.setStrokeWidth(2.0f); x1 = x; y1 = y; mv = mapV; p1 = mapV.getMapView().getProjection().fromPixels((int)x1,(int)y1); } //override draw method to add our custom drawings @Override public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) { if(p1 != null && p2 != null){ //get the 2 geopoints defining the area and transform them to pixels //this way if we move or zoom the map rectangle will follow accordingly Point screenPts1 = new Point(); mapView.getProjection().toPixels(p1, screenPts1); Point screenPts2 = new Point(); mapView.getProjection().toPixels(p2, screenPts2); //draw inner rectangle paint.setColor(0x4435EF56); paint.setStyle(Style.FILL); canvas.drawRect(screenPts1.x, screenPts1.y, screenPts2.x, screenPts2.y, paint); //draw outline rectangle paint.setColor(0x88158923); paint.setStyle(Style.STROKE); canvas.drawRect(screenPts1.x, screenPts1.y, screenPts2.x, screenPts2.y, paint); } return true; } @Override public boolean onTouchEvent(MotionEvent e, MapView mapView) { if(mv.isEditMode() && !isUp){ if(e.getAction() == MotionEvent.ACTION_DOWN){ x1 = y1 = 0; x1 = e.getX(); y1 = e.getY(); p1 = mapView.getProjection().fromPixels((int)x1,(int)y1); } //here we constantly change geopoint p2 as we move out finger if(e.getAction() == MotionEvent.ACTION_MOVE){ x2 = e.getX(); y2 = e.getY(); p2 = mapView.getProjection().fromPixels((int)x2,(int)y2); } //---when user lifts his finger--- if (e.getAction() == MotionEvent.ACTION_UP) { isUp = true; } return true; } return false; } }
смотрите это http://n3vrax.wordpress.com/2011/08/13/drawing-overlays-on-android-map-view/
Try this one: Add itemizedOverlay class: public class AndroidGoogleMapsActivity extends MapActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Displaying Zooming controls MapView mapView = (MapView) findViewById(R.id.mapview); mapView.setBuiltInZoomControls(true); MapController mc = mapView.getController(); double lat = Double.parseDouble("48.85827758964043"); double lon = Double.parseDouble("2.294543981552124"); GeoPoint geoPoint = new GeoPoint((int)(lat * 1E6), (int)(lon * 1E6)); mc.animateTo(geoPoint); mc.setZoom(15); mapView.invalidate(); /** * Placing Marker * */ List<Overlay> mapOverlays = mapView.getOverlays(); Drawable drawable = this.getResources().getDrawable(R.drawable.mark_red); AddItemizedOverlay itemizedOverlay = new AddItemizedOverlay(drawable, this); OverlayItem overlayitem = new OverlayItem(geoPoint, "Hello", "Sample Overlay item"); itemizedOverlay.addOverlay(overlayitem); mapOverlays.add(itemizedOverlay); } @Override protected boolean isRouteDisplayed() { return false; } }
Это работает для меня. С помощью метода, упомянутого здесь, я смог нарисовать полилинии на Google Maps V2. Я нарисовал новую линию всякий раз, когда местоположение пользователя было изменено, поэтому полилиния выглядит как путь, по которому следует пользователь на карте.
исходный код at. Github: prasang7 / eTaxi-Meter
Пожалуйста, игнорируйте другие модули этого проекта, связанные с расчетом расстояния и пользовательского интерфейса, если вы не заинтересованы в них.