程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何使用kml文件在地图上绘制路径?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何使用kml文件在地图上绘制路径??

开发过程中遇到如何使用kml文件在地图上绘制路径?的问题如何解决?下面主要结合日常开发的经验,给出你关于如何使用kml文件在地图上绘制路径?的解决方法建议,希望对你解决如何使用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&#65306;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&#65306;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&#65306;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,请注明来意。