大佬教程收集整理的这篇文章主要介绍了如何使用kml文件在地图上绘制路径?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在上面的代码中,就我所知,您没有将kml数据传递到代码中的mapVIEw。要显示路线,您应该通过SAX解析器解析kml数据,然后在地图上显示路线标记。
请参阅下面的代码作为示例,但是它还不完整-仅作为您的参考并获得一些想法。
这是一个简单的bean,用于保存将要解析的路由信息。
package com.myapp.androID.model.navigation;
import java.util.Array@R_502_6818@;
import java.util.Iterator;
public class NavigationDataSet {
private Array@R_502_6818@<Placemark> placemarks = new Array@R_502_6818@<Placemark>();
private Placemark currentPlacemark;
private Placemark routePlacemark;
public String toString() {
String s= "";
for (Iterator<Placemark> iter=placemarks.iterator();iter.hasNext();) {
Placemark p = (Placemark)iter.next();
s += p.gettitle() + "\n" + p.getDescription() + "\n\n";
}
return s;
}
public voID addCurrentPlacemark() {
placemarks.add(currentPlacemark);
}
public Array@R_502_6818@<Placemark> getPlacemarks() {
return placemarks;
}
public voID setPlacemarks(Array@R_502_6818@<Placemark> placemarks) {
this.placemarks = placemarks;
}
public Placemark getCurrentPlacemark() {
return currentPlacemark;
}
public voID setCurrentPlacemark(Placemark currentPlacemark) {
this.currentPlacemark = currentPlacemark;
}
public Placemark getRoutePlacemark() {
return routePlacemark;
}
public voID setRoutePlacemark(Placemark routePlacemark) {
this.routePlacemark = routePlacemark;
}
}
然后使用SAX Handler解析kml:
package com.myapp.androID.model.navigation;
import androID.util.Log;
import com.myapp.androID.myapp;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.Helpers.DefaultHandler;
import com.myapp.androID.model.navigation.NavigationDataSet;
import com.myapp.androID.model.navigation.Placemark;
public class NavigationSaxHandler extends DefaultHandler{
// ===========================================================
// FIElds
// ===========================================================
private Boolean in_kmltag = false;
private Boolean in_placemarktag = false;
private Boolean in_naMetag = false;
private Boolean in_descriptiontag = false;
private Boolean in_geometrycollectiontag = false;
private Boolean in_lineStringtag = false;
private Boolean in_pointtag = false;
private Boolean in_coordinatestag = false;
private StringBuffer buffer;
private NavigationDataSet navigationDataSet = new NavigationDataSet();
// ===========================================================
// Getter & Setter
// ===========================================================
public NavigationDataSet getParsedData() {
navigationDataSet.getCurrentPlacemark().setCoordinates(buffer.toString().trim());
return this.navigationDataSet;
}
// ===========================================================
// Methods
// ===========================================================
@OverrIDe
public voID startdocument() throws SAXException {
this.navigationDataSet = new NavigationDataSet();
}
@OverrIDe
public voID enddocument() throws SAXException {
// nothing to do
}
/** Gets be called on opening Tags like:
* <tag>
* Can provIDe attribute(s), when xml was like:
* <tag attribute="attributeValue">*/
@OverrIDe
public voID startElement(String namespaceURI, String localname,
String qname, Attributes atts) throws SAXException {
if (localname.equals("kml")) {
this.in_kmltag = true;
} else if (localname.equals("Placemark")) {
this.in_placemarktag = true;
navigationDataSet.setCurrentPlacemark(new Placemark());
} else if (localname.equals("name")) {
this.in_naMetag = true;
} else if (localname.equals("description")) {
this.in_descriptiontag = true;
} else if (localname.equals("GeometryCollection")) {
this.in_geometrycollectiontag = true;
} else if (localname.equals("lineString")) {
this.in_lineStringtag = true;
} else if (localname.equals("point")) {
this.in_pointtag = true;
} else if (localname.equals("coordinates")) {
buffer = new StringBuffer();
this.in_coordinatestag = true;
}
}
/** Gets be called on closing Tags like:
* </tag> */
@OverrIDe
public voID endElement(String namespaceURI, String localname, String qName)
throws SAXException {
if (localname.equals("kml")) {
this.in_kmltag = false;
} else if (localname.equals("Placemark")) {
this.in_placemarktag = false;
if ("Route".equals(navigationDataSet.getCurrentPlacemark().gettitle()))
navigationDataSet.setRoutePlacemark(navigationDataSet.getCurrentPlacemark());
else navigationDataSet.addCurrentPlacemark();
} else if (localname.equals("name")) {
this.in_naMetag = false;
} else if (localname.equals("description")) {
this.in_descriptiontag = false;
} else if (localname.equals("GeometryCollection")) {
this.in_geometrycollectiontag = false;
} else if (localname.equals("lineString")) {
this.in_lineStringtag = false;
} else if (localname.equals("point")) {
this.in_pointtag = false;
} else if (localname.equals("coordinates")) {
this.in_coordinatestag = false;
}
}
/** Gets be called on the following structure:
* <tag>characters</tag> */
@OverrIDe
public voID characters(char ch[], int start, int length) {
if(this.in_naMetag){
if (navigationDataSet.getCurrentPlacemark()==null) navigationDataSet.setCurrentPlacemark(new Placemark());
navigationDataSet.getCurrentPlacemark().settitle(new String(ch, start, length));
} else
if(this.in_descriptiontag){
if (navigationDataSet.getCurrentPlacemark()==null) navigationDataSet.setCurrentPlacemark(new Placemark());
navigationDataSet.getCurrentPlacemark().setDescription(new String(ch, start, length));
} else
if(this.in_coordinatestag){
if (navigationDataSet.getCurrentPlacemark()==null) navigationDataSet.setCurrentPlacemark(new Placemark());
//navigationDataSet.getCurrentPlacemark().setCoordinates(new String(ch, start, length));
buffer.append(ch, start, length);
}
}
}
和一个简单的placeMark bean:
package com.myapp.androID.model.navigation;
public class Placemark {
String title;
String description;
String coordinates;
String address;
public String gettitle() {
return title;
}
public voID settitle(String titlE) {
this.title = title;
}
public String getDescription() {
return description;
}
public voID setDescription(String description) {
this.description = description;
}
public String getCoordinates() {
return coordinates;
}
public voID setCoordinates(String coordinates) {
this.coordinates = coordinates;
}
public String getAddress() {
return address;
}
public voID setAddress(String address) {
this.address = address;
}
}
最后,模型中的服务类调用计算:
package com.myapp.androID.model.navigation;
import java.io.IOException;
import java.io.inputStream;
import java.net.URL;
import java.net.URLConnection;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import com.myapp.androID.myapp;
import org.xml.sax.inputsource;
import org.xml.sax.XMLReader;
import androID.util.Log;
public class Mapservice {
public static final int mode_ANY = 0;
public static final int mode_CAR = 1;
public static final int mode_WALKING = 2;
public static String inputStreamToString (inputStream in) throws IOException {
StringBuffer out = new StringBuffer();
byte[] b = new byte[4096];
for (int n; (n = in.read(b)) != -1;) {
out.append(new String(b, 0, n));
}
return out.toString();
}
public static NavigationDataSet calculateRoute(Double startLat, Double startLng, Double targetLat, Double targetLng, int mode) {
return calculateRoute(startLat + "," + startLng, targetLat + "," + targetLng, modE);
}
public static NavigationDataSet calculateRoute(String startCoords, String targetCoords, int mode) {
String urlPedeStrianMode = "@R_301_6822@://maps.Google.com/maps?" + "saddr=" + startCoords + "&daddr="
+ targetCoords + "&sll=" + startCoords + "&dirflg=w&hl=en&IE=UTF8&z=14&output=kml";
Log.d(myapp.APP, "urlPedeStrianMode: "+urlPedeStrianModE);
String urlCarMode = "@R_301_6822@://maps.Google.com/maps?" + "saddr=" + startCoords + "&daddr="
+ targetCoords + "&sll=" + startCoords + "&hl=en&IE=UTF8&z=14&output=kml";
Log.d(myapp.APP, "urlCarMode: "+urlCarModE);
NavigationDataSet navSet = null;
// for mode_any: try pedeStrian route calculation first, if it fails, fall BACk to car route
if (mode==MODE_ANY||mode==MODE_WALKING) navSet = Mapservice.getNavigationDataSet(urlPedeStrianModE);
if (mode==MODE_ANY&&navSet==null||mode==MODE_CAR) navSet = Mapservice.getNavigationDataSet(urlCarModE);
return navSet;
}
/**
* RetrIEve navigation data set from either remote URL or String
* @param url
* @return navigation set
*/
public static NavigationDataSet getNavigationDataSet(String url) {
// urlString = "@R_301_6822@://192.168.1.100:80/test.kml";
Log.d(myapp.APP,"urlString -->> " + url);
NavigationDataSet navigationDataSet = null;
try
{
final URL aUrl = new URL(url);
final URLConnection conn = aUrl.openConnection();
conn.setReadTimeout(15 * 1000); // timeout for reading the Google maps data: 15 secs
conn.connect();
/* Get a SAXParser from the SAXPArserFactory. */
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
/* Get the XMLReader of the SAXParser we created. */
XMLReader xr = sp.getXMLReader();
/* Create a new ContentHandler and apply it to the XML-Reader*/
NavigationSaxHandler navSax2Handler = new NavigationSaxHandler();
xr.setContentHandler(navSax2Handler);
/* Parse the xml-data from our URl. */
xr.parse(new inputsource(aUrl.openStream()));
/* Our NavigationSaxHandler Now provIDes the parsed data to us. */
navigationDataSet = navSax2Handler.getParsedData();
/* Set the result to be displayed in our GUI. */
Log.d(myapp.APP,"navigationDataSet: "+navigationDataSet.toString());
} catch (Exception E) {
// Log.e(myapp.APP, "error with kml xml", E);
navigationDataSet = null;
}
return navigationDataSet;
}
}
画画:
/**
* Does the actual drawing of the route, based on the geo points provIDed in the nav set
*
* @param navSet Navigation set bean that holds the route information, incl. geo pos
* @param color color in which to draw the lines
* @param mMapVIEw01 Map vIEw to draw onto
*/
public voID drawPath(NavigationDataSet navSet, int color, MapVIEw mMapVIEw01) {
Log.d(myapp.APP, "map color before: " + color);
// color correction for dining, make it darker
if (color == color.parsecolor("#add331")) color = color.parsecolor("#6C8715");
Log.d(myapp.APP, "map color after: " + color);
Collection overlaystoaddAgain = new Array@R_502_6818@();
for (Iterator iter = mMapVIEw01.getoverlays().iterator(); iter.hasNext();) {
Object o = iter.next();
Log.d(myapp.APP, "overlay type: " + o.getClass().getname());
if (!RouteOverlay.class.getname().equals(o.getClass().getname())) {
// mMapVIEw01.getoverlays().remove(o);
overlaystoaddAgain.add(o);
}
}
mMapVIEw01.getoverlays().clear();
mMapVIEw01.getoverlays().addAll(overlaystoaddAgain);
String path = navSet.getRoutePlacemark().getCoordinates();
Log.d(myapp.APP, "path=" + path);
if (path != null && path.trim().length() > 0) {
String[] pairs = path.trim().split(" ");
Log.d(myapp.APP, "pairs.length=" + pairs.length);
String[] lngLat = pairs[0].split(","); // lngLat[0]=longitude lngLat[1]=latitude lngLat[2]=height
Log.d(myapp.APP, "lnglat =" + lngLat + ", length: " + lngLat.length);
if (lngLat.length<3) lngLat = pairs[1].split(","); // if first pair is not transferred completely, take seconds pair //Todo
try {
GeoPoint startGP = new GeoPoint((int) (Double.parseDouble(lngLat[1]) * 1E6), (int) (Double.parseDouble(lngLat[0]) * 1E6));
mMapVIEw01.getoverlays().add(new RouteOverlay(startGP, startGP, 1));
GeoPoint gp1;
GeoPoint gp2 = startGP;
for (int i = 1; i < pairs.length; i++) // the last one would be crash
{
lngLat = pairs[i].split(",");
gp1 = gp2;
if (lngLat.length >= 2 && gp1.getLatitudeE6() > 0 && gp1.getLongitudeE6() > 0
&& gp2.getLatitudeE6() > 0 && gp2.getLongitudeE6() > 0) {
// for GeoPoint, first:latitude, second:longitude
gp2 = new GeoPoint((int) (Double.parseDouble(lngLat[1]) * 1E6), (int) (Double.parseDouble(lngLat[0]) * 1E6));
if (gp2.getLatitudeE6() != 22200000) {
mMapVIEw01.getoverlays().add(new RouteOverlay(gp1, gp2, 2, color));
Log.d(myapp.APP, "draw:" + gp1.getLatitudeE6() + "/" + gp1.getLongitudeE6() + " TO " + gp2.getLatitudeE6() + "/" + gp2.getLongitudeE6());
}
}
// Log.d(myapp.APP,"pair:" + pairs[i]);
}
//routeOverlays.add(new RouteOverlay(gp2,gp2, 3));
mMapVIEw01.getoverlays().add(new RouteOverlay(gp2, gp2, 3));
} catch (numberFormatException E) {
Log.e(myapp.APP, "CAnnot draw route.", E);
}
}
// mMapVIEw01.getoverlays().addAll(routeOverlays); // use the default color
mMapVIEw01.setEnabled(true);
}
这是RouteOverlay类:
package com.myapp.androID.activity.map.nav;
import androID.graphics.bitmap;
import androID.graphics.Canvas;
import androID.graphics.color;
import androID.graphics.Paint;
import androID.graphics.Point;
import androID.graphics.RectF;
import com.Google.androID.maps.GeoPoint;
import com.Google.androID.maps.MapVIEw;
import com.Google.androID.maps.Overlay;
import com.Google.androID.maps.Projection;
public class RouteOverlay extends Overlay {
private GeoPoint gp1;
private GeoPoint gp2;
privatE int mRadius=6;
private int mode=0;
privatE int defaultcolor;
private String text="";
private Bitmap img = null;
public RouteOverlay(GeoPoint gp1,GeoPoint gp2,int mode) { // GeoPoint is a int. (6E)
this.gp1 = gp1;
this.gp2 = gp2;
this.mode = mode;
defaultcolor = 999; // no defaultcolor
}
public RouteOverlay(GeoPoint gp1,GeoPoint gp2,int mode, int defaultcolor) {
this.gp1 = gp1;
this.gp2 = gp2;
this.mode = mode;
this.defaultcolor = defaultcolor;
}
public voID setText(String t) {
this.text = t;
}
public voID setBitmap(Bitmap bitmap) {
this.img = bitmap;
}
publi@R_674_8592@ getMode() {
return mode;
}
@OverrIDe
public Boolean draw (Canvas canvas, MapVIEw mapVIEw, Boolean shadow, long when) {
Projection projection = mapVIEw.getProjection();
if (shadow == falsE) {
Paint paint = new Paint();
paint.setAntiAlias(true);
Point point = new Point();
projection.topixels(gp1, point);
// mode=1:start
if(mode==1) {
if(defaultcolor==999)
paint.setcolor(color.bLACK); // color.bLUE
else
paint.setcolor(defaultcolor);
RectF oval=new RectF(point.x - mRadius, point.y - mRadius,
point.x + mRadius, point.y + mRadius);
// start point
canvas.drawoval(oval, paint);
}
// mode=2:path
else if(mode==2) {
if(defaultcolor==999)
paint.setcolor(color.RED);
else
paint.setcolor(defaultcolor);
Point point2 = new Point();
projection.topixels(gp2, point2);
paint.setstrokeWIDth(5);
paint.setAlpha(defaultcolor==color.parsecolor("#6C8715")?220:120);
canvas.drawline(point.x, point.y, point2.x,point2.y, paint);
}
/* mode=3:end */
else if(mode==3) {
/* the last path */
if(defaultcolor==999)
paint.setcolor(color.bLACK); // color.GREEN
else
paint.setcolor(defaultcolor);
Point point2 = new Point();
projection.topixels(gp2, point2);
paint.setstrokeWIDth(5);
paint.setAlpha(defaultcolor==color.parsecolor("#6C8715")?220:120);
canvas.drawline(point.x, point.y, point2.x,point2.y, paint);
RectF oval=new RectF(point2.x - mRadius,point2.y - mRadius,
point2.x + mRadius,point2.y + mRadius);
/* end point */
paint.setAlpha(255);
canvas.drawoval(oval, paint);
}
}
return super.draw(canvas, mapVIEw, shadow, when);
}
}
我可以解析kml文件以便在Android中显示路径或点吗?请你能帮我吗?
这是我想在Android Google Map中显示的kml示例代码:
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opENGIs.net/kml/2.2">
<Document>
<name>Paths</name>
<description>Examples of paths. Note that the tessellate tag is by default
set to 0. If you want to create tessellated lines,they must be authored
(or edited) directly in KMl.</description>
<Style id="yellowLineGreenPoly">
<Linestyle>
<color>7f00ffff</color>
<width>4</width>
</Linestyle>
<PolyStyle>
<color>7f00ff00</color>
</PolyStyle>
</Style>
<Placemark>
<name>Absolute Extruded</name>
<description>Transparent green wall with yellow outlines</description>
<styleUrl>#yellowLineGreenPoly</styleUrl>
<LineString>
<extrude>1</extrude>
<tessellate>1</tessellate>
<altitudeMode>absolute</altitudeMode>
<coordinates> -112.2550785337791,36.07954952145647,2357
-112.2549277039738,36.08117083492122,2357
-112.2552505069063,36.08260761307279,2357
-112.2564540158376,36.08395660588506,2357
-112.2580238976449,36.08511401044813,2357
-112.2595218489022,36.08584355239394,2357
-112.2608216347552,36.08612634548589,2357
-112.262073428656,36.08626019085147,2357
-112.2633204928495,36.08621519860091,2357
-112.2644963846444,36.08627897945274,2357
-112.2656969554589,36.08649599090644,2357
</coordinates>
<LineString>
</Placemark>
</Document>
</kml>
当我将此文件加载到标准网络google map时,它会很好地显示它,但是当我尝试使用android google map进行相同的操作时,它不会这样做。它只是带我到某些地方,仅此而已。我当时正在考虑更改监听器类。当前看起来像这样:
private class MyLOCATIOnListener implements LOCATIOnListener
{
@Override
public void onLOCATIOnChanged(LOCATIOn loC) {
if (loc != null) {
latitude = (loc.getLatitude() * 1E6);
longitude = (loc.getLongitude() * 1E6);
Toast.makeText(getBaseContext(),"LOCATIOn changed : Lat: " + latitude +
" Lng: " + longitude,Toast.LENGTH_SHORT).show();
GeoPoint p = new GeoPoint(
(int) (loc.getLatitude() * 1E6),(int) (loc.getLongitude() * 1E6));
mc.animateTo(p);
mapView.invalidate();
}
}
//---------------------------------------------------------------
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String provider,int status,Bundle extras) {
//TODO Auto-generated method stub
}
请有人能告诉我我在做什么错吗?
以上是大佬教程为你收集整理的如何使用kml文件在地图上绘制路径?全部内容,希望文章能够帮你解决如何使用kml文件在地图上绘制路径?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。