Draw A Line In A Route Map
I want to draw a line in a route map. For that I use a code from here http://csie-tw.blogspot.com/2009/06/android-driving-direction-route-path.html . But It not works . It show thi
Solution 1:
Use Below Code for that.
MainActivity.java
publicclassMainActivityextendsMapActivity {
LinearLayout linearLayout;
MapView mapView;
private Road mRoad;
@OverridepublicvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
newThread() {
@Overridepublicvoidrun() {
doublefromLat=49.85, fromLon = 24.016667, toLat = 50.45, toLon = 30.523333;
Stringurl= RoadProvider
.getUrl(fromLat, fromLon, toLat, toLon);
InputStreamis= getConnection(url);
mRoad = RoadProvider.getRoute(is);
mHandler.sendEmptyMessage(0);
}
}.start();
}
HandlermHandler=newHandler() {
publicvoidhandleMessage(android.os.Message msg) {
TextViewtextView= (TextView) findViewById(R.id.description);
textView.setText(mRoad.mName + " " + mRoad.mDescription);
MapOverlaymapOverlay=newMapOverlay(mRoad, mapView);
List<Overlay> listOfOverlays = mapView.getOverlays();
listOfOverlays.clear();
listOfOverlays.add(mapOverlay);
mapView.invalidate();
};
};
private InputStream getConnection(String url) {
InputStreamis=null;
try {
URLConnectionconn=newURL(url).openConnection();
is = conn.getInputStream();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return is;
}
@OverrideprotectedbooleanisRouteDisplayed() {
returnfalse;
}
}
classMapOverlayextendscom.google.android.maps.Overlay {
Road mRoad;
ArrayList<GeoPoint> mPoints;
publicMapOverlay(Road road, MapView mv) {
mRoad = road;
if (road.mRoute.length > 0) {
mPoints = newArrayList<GeoPoint>();
for (inti=0; i < road.mRoute.length; i++) {
mPoints.add(newGeoPoint((int) (road.mRoute[i][1] * 1000000),
(int) (road.mRoute[i][0] * 1000000)));
}
intmoveToLat= (mPoints.get(0).getLatitudeE6() + (mPoints.get(
mPoints.size() - 1).getLatitudeE6() - mPoints.get(0)
.getLatitudeE6()) / 2);
intmoveToLong= (mPoints.get(0).getLongitudeE6() + (mPoints.get(
mPoints.size() - 1).getLongitudeE6() - mPoints.get(0)
.getLongitudeE6()) / 2);
GeoPointmoveTo=newGeoPoint(moveToLat, moveToLong);
MapControllermapController= mv.getController();
mapController.animateTo(moveTo);
mapController.setZoom(7);
}
}
@Overridepublicbooleandraw(Canvas canvas, MapView mv, boolean shadow, long when) {
super.draw(canvas, mv, shadow);
drawPath(mv, canvas);
returntrue;
}
publicvoiddrawPath(MapView mv, Canvas canvas) {
intx1= -1, y1 = -1, x2 = -1, y2 = -1;
Paintpaint=newPaint();
paint.setColor(Color.GREEN);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(3);
for (inti=0; i < mPoints.size(); i++) {
Pointpoint=newPoint();
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;
}
}
}
Add following classes
Point.java
publicclassPoint{
String mName;
String mDescription;
String mIconUrl;
double mLatitude;
double mLongitude;
}
Road.java
publicclassRoad{
publicString mName;
publicString mDescription;
publicint mColor;
publicint mWidth;
publicdouble[][] mRoute = newdouble[][] {};
public Point[] mPoints = new Point[] {};
}
RoadProvider.java
publicclassRoadProvider {
publicstatic Road getRoute(InputStream is) {
KMLHandlerhandler=newKMLHandler();
try {
SAXParserparser= 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;
}
publicstatic String getUrl(double fromLat, double fromLon, double toLat,
double toLon) {// connect to map web serviceStringBufferurlString=newStringBuffer();
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");
return urlString.toString();
}
}
classKMLHandlerextendsDefaultHandler {
Road mRoad;
boolean isPlacemark;
boolean isRoute;
boolean isItemIcon;
private Stack<String> mCurrentElement = newStack<String>();
private String mString;
publicKMLHandler() {
mRoad = newRoad();
}
publicvoidstartElement(String uri, String localName, String name,
Attributes attributes)throws SAXException {
mCurrentElement.push(localName);
if (localName.equalsIgnoreCase("Placemark")) {
isPlacemark = true;
mRoad.mPoints = addPoint(mRoad.mPoints);
} elseif (localName.equalsIgnoreCase("ItemIcon")) {
if (isPlacemark)
isItemIcon = true;
}
mString = newString();
}
publicvoidcharacters(char[] ch, int start, int length)throws SAXException {
Stringchars=newString(ch, start, length).trim();
mString = mString.concat(chars);
}
publicvoidendElement(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;
}
} elseif (localName.equalsIgnoreCase("color") && !isPlacemark) {
mRoad.mColor = Integer.parseInt(mString, 16);
} elseif (localName.equalsIgnoreCase("width") && !isPlacemark) {
mRoad.mWidth = Integer.parseInt(mString);
} elseif (localName.equalsIgnoreCase("description")) {
if (isPlacemark) {
Stringdescription= cleanup(mString);
if (!isRoute)
mRoad.mPoints[mRoad.mPoints.length - 1].mDescription = description;
else
mRoad.mDescription = description;
}
} elseif (localName.equalsIgnoreCase("href")) {
if (isItemIcon) {
mRoad.mPoints[mRoad.mPoints.length - 1].mIconUrl = mString;
}
} elseif (localName.equalsIgnoreCase("coordinates")) {
if (isPlacemark) {
if (!isRoute) {
String[] xyParsed = split(mString, ",");
doublelon= Double.parseDouble(xyParsed[0]);
doublelat= 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, " ");
intlenNew= coodrinatesParsed.length;
intlenOld= mRoad.mRoute.length;
double[][] temp = newdouble[lenOld + lenNew][2];
for (inti=0; i < lenOld; i++) {
temp[i] = mRoad.mRoute[i];
}
for (inti=0; i < lenNew; i++) {
String[] xyParsed = split(coodrinatesParsed[i], ",");
for (intj=0; j < 2 && j < xyParsed.length; j++)
temp[lenOld + i][j] = Double
.parseDouble(xyParsed[j]);
}
mRoad.mRoute = temp;
}
}
}
}
mCurrentElement.pop();
if (localName.equalsIgnoreCase("Placemark")) {
isPlacemark = false;
if (isRoute)
isRoute = false;
} elseif (localName.equalsIgnoreCase("ItemIcon")) {
if (isItemIcon)
isItemIcon = false;
}
}
private String cleanup(String value) {
Stringremove="<br/>";
intindex= value.indexOf(remove);
if (index != -1)
value = value.substring(0, index);
remove = " ";
index = value.indexOf(remove);
intlen= 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[] points) {
Point[] result = newPoint[points.length + 1];
for (inti=0; i < points.length; i++)
result[i] = points[i];
result[points.length] = newPoint();
return result;
}
privatestatic String[] split(String strString, String strDelimiter) {
String[] strArray;
intiOccurrences=0;
intiIndexOfInnerString=0;
intiIndexOfDelimiter=0;
intiCounter=0;
if (strString == null) {
thrownewIllegalArgumentException("Input string cannot be null.");
}
if (strDelimiter.length() <= 0 || strDelimiter == null) {
thrownewIllegalArgumentException(
"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 = newString[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;
}
}
main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ><TextViewandroid:id="@+id/description"android:layout_width="fill_parent"android:layout_height="wrap_content" /><com.google.android.maps.MapViewandroid:id="@+id/mapview"android:layout_width="fill_parent"android:layout_height="fill_parent"android:apiKey="Your API Key"android:clickable="true" /></LinearLayout>
Add below permissions into your android manifest file.
<uses-permissionandroid:name="android.permission.INTERNET"/>
Post a Comment for "Draw A Line In A Route Map"