1

我想在谷歌地图中绘制从源到目的地的路线图。源是从 GP 跟踪的,目的地是从用户那里得到的。我希望在这些点之间显示路线。我想在每次位置更新时重新绘制地图由全球定位系统

4

1 回答 1

2

这是我的地图活动的来源:

package tvarwebu.projects.map;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;

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.Overlay;
import com.google.android.maps.OverlayItem;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;

public class MapProjectActivity extends MapActivity {

GeoPoint myPoint = null;
GeoPoint nextPoint = null;
MapView map;
private Road mRoad;
int latSpan = -1;
boolean moving = false;
long lastTimestamp = 0;
int pointCount = 0;
int lat = 0;
int lng = 0;
Location currLoc = null;
OverlayItem currPoint;
MyItemizedOverlay currItemizedOverlay;
List<Overlay> mapOverlays;
LocationManager lm;

@Override
protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.main);

map = (MapView) findViewById(R.id.mapView);
map.setBuiltInZoomControls(true);
map.setStreetView(true);
map.setSatellite(false);

// Your position initialize
lat = 53324388;
lng = -6263194;

myPoint = new GeoPoint(lat, lng);

Drawable drawable = this.getResources().getDrawable(
R.drawable.flag_green);

MyItemizedOverlay itemizedoverlay = new MyItemizedOverlay(drawable,
this);

OverlayItem overlayitem = new OverlayItem(myPoint, "Start Position",
"Your start position");

itemizedoverlay.addOverlay(overlayitem);

// Position of next point
int lat2 = 53348084;
int lng2 = -6292434;

nextPoint = new GeoPoint(lat2, lng2);

OverlayItem overlayitem2 = new OverlayItem(nextPoint, "Position",
"Position of next point");

itemizedoverlay.addOverlay(overlayitem2);

mapOverlays = map.getOverlays();
mapOverlays.add(itemizedoverlay);

Drawable draw2 = this.getResources().getDrawable(R.drawable.flag_red);

MyItemizedOverlay over2 = new MyItemizedOverlay(draw2, this);
over2.addOverlay(overlayitem2);

mapOverlays.add(over2);

// zooming to both points
int maxLatitude = Math.max(lat, lat2);
int minLatitude = Math.min(lat, lat2);
int maxLongitude = Math.max(lng, lng2);
int minLongitude = Math.min(lng, lng2);

MapController mc = map.getController();
mc.zoomToSpan(maxLatitude - minLatitude, maxLongitude - minLongitude);
mc.animateTo(new GeoPoint((maxLatitude + minLatitude) / 2,
(maxLongitude + minLongitude) / 2));

map.invalidate();

//Drawing path in new Thread
new Thread() {

@Override
public void run() {
double fromLat = Double.valueOf(myPoint.getLatitudeE6()) / 1000000.0,
fromLon = Double.valueOf(myPoint.getLongitudeE6()) / 1000000.0;
double toLat = Double.valueOf(nextPoint.getLatitudeE6()) / 1000000.0,
toLon = Double.valueOf(nextPoint.getLongitudeE6()) / 1000000.0;

String url = RoadProvider
.getUrl(fromLat, fromLon, toLat, toLon);
InputStream is = getConnection(url);
mRoad = RoadProvider.getRoute(is);
mHandler.sendEmptyMessage(0);
}
}.start();

}

Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
MapOverlay mapOverlay = new MapOverlay(mRoad, map);
List<Overlay> listOfOverlays = map.getOverlays();
// listOfOverlays.clear();
listOfOverlays.add(mapOverlay);
map.invalidate();
};
};

private InputStream getConnection(String url) {
InputStream is = null;
try {
URLConnection conn = new URL(url).openConnection();
is = conn.getInputStream();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return is;
}

@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
// Map extends overlay for drawing path
class MapOverlay extends com.google.android.maps.Overlay {
Road mRoad;
ArrayList<GeoPoint> mPoints;

public MapOverlay(Road road, MapView mv) {
mRoad = road;
// mRoute is field of route points getting from Google Maps
if (road.mRoute.length > 0) {
mPoints = new ArrayList<GeoPoint>();
for (int i = 0; i < road.mRoute.length; i++) {
mPoints.add(new GeoPoint(
(int) (road.mRoute[i][1] * 1000000),
(int) (road.mRoute[i][0] * 1000000)));
}

}
}

@Override
public void draw(Canvas canvas, MapView mv, boolean shadow) {
drawPath(mv, canvas);
}

public void drawPath(MapView mv, Canvas canvas) {
int x1 = -1, y1 = -1, x2 = -1, y2 = -1;
Paint paint = new Paint();
latSpan = mv.getLatitudeSpan();
paint.setColor(Color.parseColor("#998447cc"));
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(6);
if (mPoints != null) {
for (int i = 0; i < mPoints.size(); i++) {
Point point = new Point();
mv.getProjection().toPixels(mPoints.get(i), point);
x2 = point.x;
y2 = point.y;
if (i > 0) {
canvas.drawLine(x1, y1, x2, y2, paint);
}
x1 = x2;
y1 = y2;
}
}
}
}
}

此外,您将需要以下文件:

道路.java

package tvarwebu.projects.map;

public class Road {
public String mName;
public String mDescription;
public int mColor;
public int mWidth;
public double[][] mRoute = new double[][] {};
public Point[] mPoints = new Point[] {};

}

Point.java

package tvarwebu.projects.map;

public class Point {
String mName;
String mDescription;
String mIconUrl;
double mLatitude;
double mLongitude;
}

RoadProvider.java

package tvarwebu.projects.map;

import java.io.IOException;
import java.io.InputStream;
import java.util.Stack;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class RoadProvider {

public static Road getRoute(InputStream is) {
KMLHandler handler = new KMLHandler();
try {
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
parser.parse(is, handler);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return handler.mRoad;
}

public static String getUrl(double fromLat, double fromLon, double toLat,
double toLon) {// connect to map web service
StringBuffer urlString = new StringBuffer();
urlString.append("http://maps.google.com/maps?f=d&hl=en");
urlString.append("&saddr=");// from
urlString.append(Double.toString(fromLat));
urlString.append(",");
urlString.append(Double.toString(fromLon));
urlString.append("&daddr=");// to
urlString.append(Double.toString(toLat));
urlString.append(",");
urlString.append(Double.toString(toLon));
urlString.append("&ie=UTF8&0&om=0&output=kml");

String ggg = urlString.toString();
return urlString.toString();
}
}

class KMLHandler extends DefaultHandler {
Road mRoad;
boolean isPlacemark;
boolean isRoute;
boolean isItemIcon;
private Stack mCurrentElement = new Stack();
private String mString;

public KMLHandler() {
mRoad = new Road();
}

public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException {
mCurrentElement.push(localName);
if (localName.equalsIgnoreCase("Placemark")) {
isPlacemark = true;
mRoad.mPoints = addPoint(mRoad.mPoints);
} else if (localName.equalsIgnoreCase("ItemIcon")) {
if (isPlacemark)
isItemIcon = true;
}
mString = new String();
}

public void characters(char[] ch, int start, int length)
throws SAXException {
String chars = new String(ch, start, length).trim();
mString = mString.concat(chars);
}

public void endElement(String uri, String localName, String name) throws SAXException {
if (mString.length() > 0) {
if (localName.equalsIgnoreCase("name")) {
if (isPlacemark) {
isRoute = mString.equalsIgnoreCase("Route");
if (!isRoute) {
mRoad.mPoints[mRoad.mPoints.length - 1].mName = mString;
}
} else {
mRoad.mName = mString;
}
} else if (localName.equalsIgnoreCase("color") && !isPlacemark) {
mRoad.mColor = Integer.parseInt(mString, 16);
} else if (localName.equalsIgnoreCase("width") && !isPlacemark) {
mRoad.mWidth = Integer.parseInt(mString);
} else if (localName.equalsIgnoreCase("description")) {
if (isPlacemark) {
String description = cleanup(mString);
if (!isRoute)
mRoad.mPoints[mRoad.mPoints.length - 1].mDescription = description;
else
mRoad.mDescription = description;
}
} else if (localName.equalsIgnoreCase("href")) {
if (isItemIcon) {
mRoad.mPoints[mRoad.mPoints.length - 1].mIconUrl = mString;
}
} else if (localName.equalsIgnoreCase("coordinates")) {
if (isPlacemark) {
if (!isRoute) {
String[] xyParsed = split(mString, ",");
double lon = Double.parseDouble(xyParsed[0]);
double lat = Double.parseDouble(xyParsed[1]);
mRoad.mPoints[mRoad.mPoints.length - 1].mLatitude = lat;
mRoad.mPoints[mRoad.mPoints.length - 1].mLongitude = lon;
} else {
String[] coodrinatesParsed = split(mString, " ");
int count = 0;
if(mRoad.mRoute.length < 2)
mRoad.mRoute = new double[coodrinatesParsed.length][2];
else {
double[][] mRouteTmp = mRoad.mRoute;
mRoad.mRoute = new double[mRouteTmp.length + coodrinatesParsed.length][2];
//for (int i = 0; i < mRouteTmp.length; i++) {
//  mRoad.mRoute[i] = mRouteTmp[i];
//  mRoad.mRoute[i][i] = mRouteTmp[i][i];
//}
System.arraycopy(mRouteTmp, 0, mRoad.mRoute, 0, mRouteTmp.length);

count = mRouteTmp.length;
}

for (int i = count; i < (mRoad.mRoute.length); i++) {
String[] xyParsed = split(coodrinatesParsed[i - count], ",");
for (int j = 0; j < 2 && j < xyParsed.length; j++)
mRoad.mRoute[i][j] = Double
.parseDouble(xyParsed[j]);
}
}
}
}
}
mCurrentElement.pop();
if (localName.equalsIgnoreCase("Placemark")) {
isPlacemark = false;
if (isRoute)
isRoute = false;
} else if (localName.equalsIgnoreCase("ItemIcon")) {
if (isItemIcon)
isItemIcon = false;
}
}

private String cleanup(String value) {
String remove = "<br/>";
int index = value.indexOf(remove);
if (index != -1)
value = value.substring(0, index);
remove = " ";
index = value.indexOf(remove);
int len = remove.length();
while (index != -1) {
value = value.substring(0, index).concat(
value.substring(index + len, value.length()));
index = value.indexOf(remove);
}
return value;
}

public Point[] addPoint(Point[] mPoints) {
Point[] result = new Point[mPoints.length + 1];
for (int i = 0; i < mPoints.length; i++)
result[i] = mPoints[i];
result[mPoints.length] = new Point();
return result;
}

private static String[] split(String strString, String strDelimiter) {
String[] strArray;
int iOccurrences = 0;
int iIndexOfInnerString = 0;
int iIndexOfDelimiter = 0;
int iCounter = 0;
if (strString == null) {
throw new IllegalArgumentException("Input string cannot be null.");
}
if (strDelimiter.length() <= 0 || strDelimiter == null) {
throw new IllegalArgumentException(
"Delimeter cannot be null or empty.");
}
if (strString.startsWith(strDelimiter)) {
strString = strString.substring(strDelimiter.length());
}
if (!strString.endsWith(strDelimiter)) {
strString += strDelimiter;
}
while ((iIndexOfDelimiter = strString.indexOf(strDelimiter,
iIndexOfInnerString)) != -1) {
iOccurrences += 1;
iIndexOfInnerString = iIndexOfDelimiter + strDelimiter.length();
}

strArray = new String[iOccurrences];
iIndexOfInnerString = 0;
iIndexOfDelimiter = 0;
while ((iIndexOfDelimiter = strString.indexOf(strDelimiter,
iIndexOfInnerString)) != -1) {
strArray[iCounter] = strString.substring(iIndexOfInnerString,
iIndexOfDelimiter);
iIndexOfInnerString = iIndexOfDelimiter + strDelimiter.length();
iCounter += 1;
}

return strArray;
}
}

MyItemizedOverlay.java:

package tvarwebu.projects.map;

import java.util.ArrayList;
import android.app.AlertDialog;
import android.content.Context;
import android.graphics.drawable.Drawable;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;

public class MyItemizedOverlay extends ItemizedOverlay<OverlayItem> {
private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
private Context mContext;

public MyItemizedOverlay(Drawable defaultMarker, Context context) {
super(boundCenterBottom(defaultMarker));
mContext = context;
}

public void addOverlay(OverlayItem overlay) {
mOverlays.add(overlay);
populate();
}

@Override
protected OverlayItem createItem(int i) {
return mOverlays.get(i);
}

@Override
public int size() {
return mOverlays.size();
}

public void removeLast(){
mOverlays.remove(mOverlays.size()-1);
}

@Override
protected boolean onTap(int index) {
OverlayItem item = mOverlays.get(index);
AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
dialog.setTitle(item.getTitle());
dialog.setMessage(item.getSnippet());
dialog.show();
return true;
}
}

希望这篇文章能帮助你解决这个问题 :) 查看 MapView 上绘制路线的完整源代码。

于 2012-10-25T10:47:10.470 回答