猿问

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

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

我可以解析kml文件以便在Android中显示路径或点吗?能帮我一下吗?

这是kml示例代码,我想在Android Google地图中显示:

<?xml version="1.0" encoding="UTF-8"?><kml xmlns=" 
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>

当我将这个文件加载到标准的web Google地图时,它会很好地显示它,但是当我尝试使用Android谷歌地图时,它就不会这么做了。它只是带我去了一些地方,仅此而已。我想换个听者班。目前看来:

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
    }

谁能告诉我在这里做错什么了吗?


郎朗坤
浏览 1223回答 3
3回答

千万里不及你

在上面的代码中,据我所见,您不会将kml数据传递到代码中的任何位置。要显示路由,您应该解析kml数据,即通过SAX解析器,然后在地图上显示路由标记。请参阅下面的代码中的一个例子,但是它还没有完成-只是作为一个参考,并得到一些想法。这是一个简单的bean,用于保存我将要解析的路由信息。package&nbsp;com.myapp.android.model.navigation;import&nbsp;java.util.ArrayList;import&nbsp;java.util.Iterator;public&nbsp;class&nbsp;NavigationDataSet&nbsp; {&nbsp;private&nbsp;ArrayList<Placemark>&nbsp;placemarks&nbsp;=&nbsp;new&nbsp;ArrayList<Placemark>();private&nbsp;Placemark&nbsp;currentPlacemark;private&nbsp;Placemark&nbsp;routePla cemark;public&nbsp;String&nbsp;toString()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s=&nbsp;""; &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(Iterator<Placemark>&nbsp;iter=placemarks.iterator();iter.hasNext();)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Placemark&nbsp;p&nbsp;=&nbsp;(Placemark)iter.next(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;+=&nbsp;p.getTitle()&nbsp;+&nbsp;"\n"&nbsp;+&nbsp;p.getDescription()&nbsp;+&nbsp;"\n\n"; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;s;}public&nbsp;void&nbsp;addCurrentPlacemark()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;placemarks.add(currentPlacemark);}public&nbsp;ArrayList<Placemark>&nbsp;getPlacemarks()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;placemarks;}public&nbsp;void&nbsp;setPlacemarks(ArrayList<Placemark>&nbsp;placemarks)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;this.placemarks&nbsp;=&nbsp;placemarks;}public&nbsp;Placemark&nbsp;getCurrentPlacemark()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;currentPlacemark;}public&nbsp;void&nbsp;setCurrentPlacemark(Placemark&nbsp;currentPlacemark)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;this.currentPlacemark&nbsp;=&nbsp;currentPlacemark;}public&nbsp;Placemark&nbsp;getRoutePlacemark()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;routePlacemark;}public&nbsp;void&nbsp;setRoutePlacemark(Placemark&nbsp;routePlacemark)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;this.routePlacemark&nbsp;=&nbsp;routePlacemark;}}和解析kml的SAX Handler:package&nbsp;com.myapp.android.model.navigation;import&nbsp;android.util.Log;import&nbsp;com.myapp.android.myapp;import&nbsp;org.xml.sax.Attributes;import&nbsp;org .xml.sax.SAXException;import&nbsp;org.xml.sax.helpers.DefaultHandler;import&nbsp;com.myapp.android.model.navigation.NavigationDataSet;import&nbsp;com.mya pp.android.model.navigation.Placemark;public&nbsp;class&nbsp;NavigationSaxHandler&nbsp;extends&nbsp;DefaultHandler{&nbsp; &nbsp;//&nbsp;===========================================================&nbsp; &nbsp;//&nbsp;Fields&nbsp; &nbsp;//&nbsp;===========================================================&nbsp; &nbsp;private&nbsp;boolean&nbsp;in_kmltag&nbsp;=&nbsp;false;&nbsp; &nbsp;private&nbsp;boolean&nbsp;in_placemarktag&nbsp;=&nbsp;false;&nbsp; &nbsp;private&nbsp;boolean&nbsp;in_nametag&nbsp;=&nbsp;false; &nbsp;private&nbsp;boolean&nbsp;in_descriptiontag&nbsp;=&nbsp;false; &nbsp;private&nbsp;boolean&nbsp;in_geometrycollectiontag&nbsp;=&nbsp;false; &nbsp;private&nbsp;boolean&nbsp;in_linestringtag&nbsp;=&nbsp;false; &nbsp;private&nbsp;boolean&nbsp;in_pointtag&nbsp;=&nbsp;false; &nbsp;private&nbsp;boolean&nbsp;in_coordinatestag&nbsp;=&nbsp;false; &nbsp;private&nbsp;StringBuffer&nbsp;buffer; &nbsp;private&nbsp;NavigationDataSet&nbsp;navigationDataSet&nbsp;=&nbsp;new&nbsp;NavigationDataSet();&nbsp; &nbsp;//&nbsp;===========================================================&nbsp; &nbsp;//&nbsp;Getter&nbsp;&&nbsp;Setter&nbsp; &nbsp;//&nbsp;===========================================================&nbsp; &nbsp;public&nbsp;NavigationDataSet&nbsp;getParsedData()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;navigationDataSet.getCurrentPlacemark().setCoordinates(buffer.toString().trim()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;this.navigationDataSet;&nbsp; &nbsp;}&nbsp; &nbsp;//&nbsp;===========================================================&nbsp; &nbsp;//&nbsp;Methods&nbsp; &nbsp;//&nbsp;===========================================================&nbsp; &nbsp;@Override&nbsp; &nbsp;public&nbsp;void&nbsp;startDocument()&nbsp;throws&nbsp;SAXException&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.navigationDataSet&nbsp;=&nbsp;new&nbsp;NavigationDataSet();&nbsp; &nbsp;}&nbsp; &nbsp;@Override&nbsp; &nbsp;public&nbsp;void&nbsp;endDocument()&nbsp;throws&nbsp;SAXException&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Nothing&nbsp;to&nbsp;do &nbsp;}&nbsp; &nbsp;/**&nbsp;Gets&nbsp;be&nbsp;called&nbsp;on&nbsp;opening&nbsp;tags&nbsp;like:&nbsp; &nbsp;&nbsp;*&nbsp;<tag>&nbsp; &nbsp;&nbsp;*&nbsp;Can&nbsp;provide&nbsp;attribute(s),&nbsp;when&nbsp;xml&nbsp;was&nbsp;like:&nbsp; &nbsp;&nbsp;*&nbsp;<tag&nbsp;attribute="attributeValue">*/&nbsp; &nbsp;@Override&nbsp; &nbsp;public&nbsp;void&nbsp;startElement(String&nbsp;namespaceURI,&nbsp;String&nbsp;localName,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;qName,&nbsp;Attributes&nbsp;atts)&nbsp;throws&nbsp;SAXException&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(localName.equals("kml"))&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.in_kmltag&nbsp;=&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(localName.equals("Placemark"))&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.in_placemarktag&nbsp;=&nbsp;true;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;navigationDataSet.setCurrentPlacemark(new&nbsp;Placemark()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(localName.equals("name"))&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.in_nametag&nbsp;=&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(localName.equals("description"))&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.in_descriptiontag&nbsp;=&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(localName.equals("GeometryCollection"))&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.in_geometrycollectiontag&nbsp;=&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(localName.equals("LineString"))&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.in_linestringtag&nbsp;=&nbsp;true;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(localName.equals("point"))&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.in_pointtag&nbsp;=&nbsp;true;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(localName.equals("coordinates"))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer&nbsp;=&nbsp;new&nbsp;StringBuffer(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.in_coordinatestag&nbsp;=&nbsp;true;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;}&nbsp; &nbsp;/**&nbsp;Gets&nbsp;be&nbsp;called&nbsp;on&nbsp;closing&nbsp;tags&nbsp;like:&nbsp; &nbsp;&nbsp;*&nbsp;</tag>&nbsp;*/&nbsp; &nbsp;@Override&nbsp; &nbsp;public&nbsp;void&nbsp;endElement(String&nbsp;namespaceURI,&nbsp;String&nbsp;localName,&nbsp;String&nbsp;qName)&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;SAXException&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(localName.equals("kml"))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.in_kmltag&nbsp;=&nbsp;false;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(localName.equals("Placemark"))&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.in_placemarktag&nbsp;=&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;("Route".equals(navigationDataSet.getCurrentPlacemark().getTitle()))&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;navigationDataSet.setRoutePlacemark(navigationDataSet.getCurrentPlacemark()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;navigationDataSet.addCurrentPlacemark(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(localName.equals("name"))&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.in_nametag&nbsp;=&nbsp;false;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(localName.equals("description"))&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.in_descriptiontag&nbsp;=&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(localName.equals("GeometryCollection"))&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.in_geometrycollectiontag&nbsp;=&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(localName.equals("LineString"))&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.in_linestringtag&nbsp;=&nbsp;false;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(localName.equals("point"))&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.in_pointtag&nbsp;=&nbsp;false;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(localName.equals("coordinates"))&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.in_coordinatestag&nbsp;=&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;}&nbsp; &nbsp;/**&nbsp;Gets&nbsp;be&nbsp;called&nbsp;on&nbsp;the&nbsp;following&nbsp;structure:&nbsp; &nbsp;&nbsp;*&nbsp;<tag>characters</tag>&nbsp;*/&nbsp; &nbsp;@Override&nbsp;public&nbsp;void&nbsp;characters(char&nbsp;ch[],&nbsp;int&nbsp;start,&nbsp;int&nbsp;length)&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;if(this.in_nametag){&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(navigationDataSet.getCurrentPlacemark()==null)&nbsp;navigationDataSet.setCurrentPlacemark(new&nbsp;Placemark()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;navigationDataSet.getCurrentPlacemark().setTitle(new&nbsp;String(ch,&nbsp;start,&nbsp;length));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;if(this.in_descriptiontag){&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(navigationDataSet.getCurrentPlacemark()==null)&nbsp;navigationDataSet.setCurrentPlacemark(new&nbsp;Placemark()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;navigationDataSet.getCurrentPlacemark().setDescription(new&nbsp;String(ch,&nbsp;start,&nbsp;length));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;if(this.in_coordinatestag){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(navigationDataSet.getCurrentPlacemark()==null)&nbsp;navigationDataSet.setCurrentPlacemark(new&nbsp;Placemark()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//navigationDataSet.getCurrentPlacemark().setCoordinates(new&nbsp;String(ch,&nbsp;start,&nbsp;length)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer.append(ch,&nbsp;start,&nbsp;length); &nbsp;&nbsp;&nbsp;&nbsp;}}&nbsp;}还有一个简单的Placemark bean:package&nbsp;com.myapp.android.model.navigation;public&nbsp;class&nbsp;Placemark&nbsp;{String&nbsp;title;String&nbsp;description;String&nbsp;coordinates;String&nbsp;address; public&nbsp;String&nbsp;getTitle()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;title;}public&nbsp;void&nbsp;setTitle(String&nbsp;title)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;this.title&nbsp;=&nbsp;title;}public&nbsp;String&nbsp;getDescription()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;description;}public&nbsp;void&nbsp;setDescription(String&nbsp;description)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;this.description&nbsp;=&nbsp;description;}public&nbsp;String&nbsp;getCoordinates()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;coordinates;}public&nbsp;void&nbsp;setCoordinates(String&nbsp;coordinates)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;this.coordinates&nbsp;=&nbsp;coordinates;}public&nbsp;String&nbsp;getAddress()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;address;}public&nbsp;void&nbsp;setAddress(String&nbsp;address)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;this.address&nbsp;=&nbsp;address;}}最后,在我的模型中调用计算的服务类:package&nbsp;com.myapp.android.model.navigation;import&nbsp;java.io.IOException;import&nbsp;java.io.InputStream;import&nbsp;java.net.URL;import&nbsp;java.ne t.URLConnection;import&nbsp;javax.xml.parsers.SAXParser;import&nbsp;javax.xml.parsers.SAXParserFactory;import&nbsp;com.myapp.android.myapp;import&nbsp;org.xml .sax.InputSource;import&nbsp;org.xml.sax.XMLReader;import&nbsp;android.util.Log;public&nbsp;class&nbsp;MapService&nbsp;{public&nbsp;static&nbsp;final&nbsp;int&nbsp;MODE_ANY&nbsp;=&nbsp;0;public &nbsp;static&nbsp;final&nbsp;int&nbsp;MODE_CAR&nbsp;=&nbsp;1;public&nbsp;static&nbsp;final&nbsp;int&nbsp;MODE_WALKING&nbsp;=&nbsp;2;public&nbsp;static&nbsp;String&nbsp;inputStreamToString&nbsp;(InputStream&nbsp;in)&nbsp;throws&nbsp;I &nbsp;OException&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;out&nbsp;=&nbsp;new&nbsp;StringBuffer(); &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;b&nbsp;=&nbsp;new&nbsp;byte[4096]; &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;n;&nbsp;(n&nbsp;=&nbsp;in.read(b))&nbsp;!=&nbsp;-1;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.append(new&nbsp;String(b,&nbsp;0,&nbsp;n)); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;out.toString();}public&nbsp;static&nbsp;NavigationDataSet&nbsp;calculateRoute(Double&nbsp;startLat,&nbsp;Double&nbsp;startLng,&nbsp;Double&nbsp;targetLat,&nbsp;Double &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;targetLng,&nbsp;int&nbsp;mode)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;calculateRoute(startLat&nbsp;+&nbsp;","&nbsp;+&nbsp;startLng,&nbsp;targetLat&nbsp;+&nbsp;","&nbsp;+&nbsp;targetLng,&nbsp;mode);}public&nbsp;static&nbsp;NavigationDataSet&nbsp;calculateRoute &nbsp;&nbsp;&nbsp;&nbsp;(String&nbsp;startCoords,&nbsp;String&nbsp;targetCoords,&nbsp;int&nbsp;mode)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;urlPedestrianMode&nbsp;=&nbsp;"http://maps.google.com/maps?"&nbsp;+&nbsp;"saddr="&nbsp;+&nbsp;startCoords&nbsp;+&nbsp;"&daddr=" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;targetCoords&nbsp;+&nbsp;"&sll="&nbsp;+&nbsp;startCoords&nbsp;+&nbsp;"&dirflg=w&hl=en&ie=UTF8&z=14&output=kml"; &nbsp;&nbsp;&nbsp;&nbsp;Log.d(myapp.APP,&nbsp;"urlPedestrianMode:&nbsp;"+urlPedestrianMode); &nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;urlCarMode&nbsp;=&nbsp;"http://maps.google.com/maps?"&nbsp;+&nbsp;"saddr="&nbsp;+&nbsp;startCoords&nbsp;+&nbsp;"&daddr=" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;targetCoords&nbsp;+&nbsp;"&sll="&nbsp;+&nbsp;startCoords&nbsp;+&nbsp;"&hl=en&ie=UTF8&z=14&output=kml"; &nbsp;&nbsp;&nbsp;&nbsp;Log.d(myapp.APP,&nbsp;"urlCarMode:&nbsp;"+urlCarMode); &nbsp;&nbsp;&nbsp;&nbsp;NavigationDataSet&nbsp;navSet&nbsp;=&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;for&nbsp;mode_any:&nbsp;try&nbsp;pedestrian&nbsp;route&nbsp;calculation&nbsp;first,&nbsp;if&nbsp;it&nbsp;fails,&nbsp;fall&nbsp;back&nbsp;to&nbsp;car&nbsp;route &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(mode==MODE_ANY||mode==MODE_WALKING)&nbsp;navSet&nbsp;=&nbsp;MapService.getNavigationDataSet(urlPedestrianMode); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(mode==MODE_ANY&&navSet==null||mode==MODE_CAR)&nbsp;navSet&nbsp;=&nbsp;MapService.getNavigationDataSet(urlCarMode); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;navSet;}/** &nbsp;*&nbsp;Retrieve&nbsp;navigation&nbsp;data&nbsp;set&nbsp;from&nbsp;either&nbsp;remote&nbsp;URL&nbsp;or&nbsp;String &nbsp;*&nbsp;@param&nbsp;url &nbsp;*&nbsp;@return&nbsp;navigation&nbsp;set &nbsp;*/public&nbsp;static&nbsp;NavigationDataSet&nbsp;getNavigationDataSet(String&nbsp;url)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;urlString&nbsp;=&nbsp;"http://192.168.1.100:80/test.kml"; &nbsp;&nbsp;&nbsp;&nbsp;Log.d(myapp.APP,"urlString&nbsp;-->>&nbsp;"&nbsp;+&nbsp;url); &nbsp;&nbsp;&nbsp;&nbsp;NavigationDataSet&nbsp;navigationDataSet&nbsp;=&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;try &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;URL&nbsp;aUrl&nbsp;=&nbsp;new&nbsp;URL(url); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;URLConnection&nbsp;conn&nbsp;=&nbsp;aUrl.openConnection(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.setReadTimeout(15&nbsp;*&nbsp;1000);&nbsp;&nbsp;//&nbsp;timeout&nbsp;for&nbsp;reading&nbsp;the&nbsp;google&nbsp;maps&nbsp;data:&nbsp;15&nbsp;secs &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.connect(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Get&nbsp;a&nbsp;SAXParser&nbsp;from&nbsp;the&nbsp;SAXPArserFactory.&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SAXParserFactory&nbsp;spf&nbsp;=&nbsp;SAXParserFactory.newInstance();&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SAXParser&nbsp;sp&nbsp;=&nbsp;spf.newSAXParser();&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Get&nbsp;the&nbsp;XMLReader&nbsp;of&nbsp;the&nbsp;SAXParser&nbsp;we&nbsp;created.&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XMLReader&nbsp;xr&nbsp;=&nbsp;sp.getXMLReader(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Create&nbsp;a&nbsp;new&nbsp;ContentHandler&nbsp;and&nbsp;apply&nbsp;it&nbsp;to&nbsp;the&nbsp;XML-Reader*/&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NavigationSaxHandler&nbsp;navSax2Handler&nbsp;=&nbsp;new&nbsp;NavigationSaxHandler();&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xr.setContentHandler(navSax2Handler);&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Parse&nbsp;the&nbsp;xml-data&nbsp;from&nbsp;our&nbsp;URL.&nbsp;*/&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xr.parse(new&nbsp;InputSource(aUrl.openStream())); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Our&nbsp;NavigationSaxHandler&nbsp;now&nbsp;provides&nbsp;the&nbsp;parsed&nbsp;data&nbsp;to&nbsp;us.&nbsp;*/&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;navigationDataSet&nbsp;=&nbsp;navSax2Handler.getParsedData();&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Set&nbsp;the&nbsp;result&nbsp;to&nbsp;be&nbsp;displayed&nbsp;in&nbsp;our&nbsp;GUI.&nbsp;*/&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.d(myapp.APP,"navigationDataSet:&nbsp;"+navigationDataSet.toString()); &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Log.e(myapp.APP,&nbsp;"error&nbsp;with&nbsp;kml&nbsp;xml",&nbsp;e); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;navigationDataSet&nbsp;=&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;navigationDataSet;}}绘图:/** &nbsp;*&nbsp;Does&nbsp;the&nbsp;actual&nbsp;drawing&nbsp;of&nbsp;the&nbsp;route,&nbsp;based&nbsp;on&nbsp;the&nbsp;geo&nbsp;points&nbsp;provided&nbsp;in&nbsp;the&nbsp;nav&nbsp;set &nbsp;* &nbsp;*&nbsp;@param&nbsp;navSet&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Navigation&nbsp;set&nbsp;bean&nbsp;that&nbsp;holds&nbsp;the&nbsp;route&nbsp;information,&nbsp;incl.&nbsp;geo&nbsp;pos &nbsp;*&nbsp;@param&nbsp;color&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Color&nbsp;in&nbsp;which&nbsp;to&nbsp;draw&nbsp;the&nbsp;lines &nbsp;*&nbsp;@param&nbsp;mMapView01&nbsp;Map&nbsp;view&nbsp;to&nbsp;draw&nbsp;onto &nbsp;*/public&nbsp;void&nbsp;drawPath(NavigationDataSet&nbsp;navSet,&nbsp;int&nbsp;color,&nbsp;MapView&nbsp;mMapView01)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;Log.d(myapp.APP,&nbsp;"map&nbsp;color&nbsp;before:&nbsp;"&nbsp;+&nbsp;color);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;color&nbsp;correction&nbsp;for&nbsp;dining,&nbsp;make&nbsp;it&nbsp;darker &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(color&nbsp;==&nbsp;Color.parseColor("#add331"))&nbsp;color&nbsp;=&nbsp;Color.parseColor("#6C8715"); &nbsp;&nbsp;&nbsp;&nbsp;Log.d(myapp.APP,&nbsp;"map&nbsp;color&nbsp;after:&nbsp;"&nbsp;+&nbsp;color); &nbsp;&nbsp;&nbsp;&nbsp;Collection&nbsp;overlaysToAddAgain&nbsp;=&nbsp;new&nbsp;ArrayList(); &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(Iterator&nbsp;iter&nbsp;=&nbsp;mMapView01.getOverlays().iterator();&nbsp;iter.hasNext();)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;o&nbsp;=&nbsp;iter.next(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.d(myapp.APP,&nbsp;"overlay&nbsp;type:&nbsp;"&nbsp;+&nbsp;o.getClass().getName()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!RouteOverlay.class.getName().equals(o.getClass().getName()))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;mMapView01.getOverlays().remove(o); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;overlaysToAddAgain.add(o); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;mMapView01.getOverlays().clear(); &nbsp;&nbsp;&nbsp;&nbsp;mMapView01.getOverlays().addAll(overlaysToAddAgain); &nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;path&nbsp;=&nbsp;navSet.getRoutePlacemark().getCoordinates(); &nbsp;&nbsp;&nbsp;&nbsp;Log.d(myapp.APP,&nbsp;"path="&nbsp;+&nbsp;path); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(path&nbsp;!=&nbsp;null&nbsp;&&&nbsp;path.trim().length()&nbsp;>&nbsp;0)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;pairs&nbsp;=&nbsp;path.trim().split("&nbsp;"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.d(myapp.APP,&nbsp;"pairs.length="&nbsp;+&nbsp;pairs.length); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;lngLat&nbsp;=&nbsp;pairs[0].split(",");&nbsp;//&nbsp;lngLat[0]=longitude&nbsp;lngLat[1]=latitude&nbsp;lngLat[2]=height &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.d(myapp.APP,&nbsp;"lnglat&nbsp;="&nbsp;+&nbsp;lngLat&nbsp;+&nbsp;",&nbsp;length:&nbsp;"&nbsp;+&nbsp;lngLat.length); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(lngLat.length<3)&nbsp;lngLat&nbsp;=&nbsp;pairs[1].split(",");&nbsp;//&nbsp;if&nbsp;first&nbsp;pair&nbsp;is&nbsp;not&nbsp;transferred&nbsp;completely,&nbsp;take&nbsp;seconds&nbsp;pair&nbsp;//TODO&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GeoPoint&nbsp;startGP&nbsp;=&nbsp;new&nbsp;GeoPoint((int)&nbsp;(Double.parseDouble(lngLat[1])&nbsp;*&nbsp;1E6),&nbsp;(int)&nbsp;(Double.parseDouble(lngLat[0])&nbsp;*&nbsp;1E6)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mMapView01.getOverlays().add(new&nbsp;RouteOverlay(startGP,&nbsp;startGP,&nbsp;1)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GeoPoint&nbsp;gp1; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GeoPoint&nbsp;gp2&nbsp;=&nbsp;startGP; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;<&nbsp;pairs.length;&nbsp;i++)&nbsp;//&nbsp;the&nbsp;last&nbsp;one&nbsp;would&nbsp;be&nbsp;crash &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lngLat&nbsp;=&nbsp;pairs[i].split(","); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gp1&nbsp;=&nbsp;gp2; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(lngLat.length&nbsp;>=&nbsp;2&nbsp;&&&nbsp;gp1.getLatitudeE6()&nbsp;>&nbsp;0&nbsp;&&&nbsp;gp1.getLongitudeE6()&nbsp;>&nbsp;0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&&&nbsp;gp2.getLatitudeE6()&nbsp;>&nbsp;0&nbsp;&&&nbsp;gp2.getLongitudeE6()&nbsp;>&nbsp;0)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;for&nbsp;GeoPoint,&nbsp;first:latitude,&nbsp;second:longitude &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gp2&nbsp;=&nbsp;new&nbsp;GeoPoint((int)&nbsp;(Double.parseDouble(lngLat[1])&nbsp;*&nbsp;1E6),&nbsp;(int)&nbsp;(Double.parseDouble(lngLat[0])&nbsp;*&nbsp;1E6)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(gp2.getLatitudeE6()&nbsp;!=&nbsp;22200000)&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mMapView01.getOverlays().add(new&nbsp;RouteOverlay(gp1,&nbsp;gp2,&nbsp;2,&nbsp;color)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.d(myapp.APP,&nbsp;"draw:"&nbsp;+&nbsp;gp1.getLatitudeE6()&nbsp;+&nbsp;"/"&nbsp;+&nbsp;gp1.getLongitudeE6()&nbsp;+&nbsp;"&nbsp;TO&nbsp;"&nbsp;+&nbsp;gp2. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getLatitudeE6()&nbsp;+&nbsp;"/"&nbsp;+&nbsp;gp2.getLongitudeE6()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Log.d(myapp.APP,"pair:"&nbsp;+&nbsp;pairs[i]); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//routeOverlays.add(new&nbsp;RouteOverlay(gp2,gp2,&nbsp;3)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mMapView01.getOverlays().add(new&nbsp;RouteOverlay(gp2,&nbsp;gp2,&nbsp;3)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(NumberFormatException&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.e(myapp.APP,&nbsp;"Cannot&nbsp;draw&nbsp;route.",&nbsp;e); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;mMapView01.getOverlays().addAll(routeOverlays);&nbsp;//&nbsp;use&nbsp;the&nbsp;default&nbsp;color &nbsp;&nbsp;&nbsp;&nbsp;mMapView01.setEnabled(true);}这是RouteOverlay类:package&nbsp;com.myapp.android.activity.map.nav;import&nbsp;android.graphics.Bitmap;import&nbsp;android.graphics.Canvas;import&nbsp;android.graphics.Color; import&nbsp;android.graphics.Paint;import&nbsp;android.graphics.Point;import&nbsp;android.graphics.RectF;import&nbsp;com.google.android.maps.GeoPoint; import&nbsp;com.google.android.maps.MapView;import&nbsp;com.google.android.maps.Overlay;import&nbsp;com.google.android.maps.Projection; public&nbsp;class&nbsp;RouteOverlay&nbsp;extends&nbsp;Overlay&nbsp;{&nbsp;private&nbsp;GeoPoint&nbsp;gp1;private&nbsp;GeoPoint&nbsp;gp2;private&nbsp;int&nbsp;mRadius=6;private&nbsp;int&nbsp;mode=0; private&nbsp;int&nbsp;defaultColor;private&nbsp;String&nbsp;text="";private&nbsp;Bitmap&nbsp;img&nbsp;=&nbsp;null;public&nbsp;RouteOverlay(GeoPoint&nbsp;gp1,GeoPoint&nbsp;gp2,int&nbsp;mode)&nbsp; {&nbsp;//&nbsp;GeoPoint&nbsp;is&nbsp;a&nbsp;int.&nbsp;(6E) &nbsp;&nbsp;&nbsp;&nbsp;this.gp1&nbsp;=&nbsp;gp1; &nbsp;&nbsp;&nbsp;&nbsp;this.gp2&nbsp;=&nbsp;gp2; &nbsp;&nbsp;&nbsp;&nbsp;this.mode&nbsp;=&nbsp;mode; &nbsp;&nbsp;&nbsp;&nbsp;defaultColor&nbsp;=&nbsp;999;&nbsp;//&nbsp;no&nbsp;defaultColor}public&nbsp;RouteOverlay(GeoPoint&nbsp;gp1,GeoPoint&nbsp;gp2,int&nbsp;mode,&nbsp;int&nbsp;defaultColor)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;this.gp1&nbsp;=&nbsp;gp1; &nbsp;&nbsp;&nbsp;&nbsp;this.gp2&nbsp;=&nbsp;gp2; &nbsp;&nbsp;&nbsp;&nbsp;this.mode&nbsp;=&nbsp;mode; &nbsp;&nbsp;&nbsp;&nbsp;this.defaultColor&nbsp;=&nbsp;defaultColor;}public&nbsp;void&nbsp;setText(String&nbsp;t)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;this.text&nbsp;=&nbsp;t;}public&nbsp;void&nbsp;setBitmap(Bitmap&nbsp;bitmap)&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;this.img&nbsp;=&nbsp;bitmap;}public&nbsp;int&nbsp;getMode()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;mode;}@Overridepublic&nbsp;boolean&nbsp;draw&nbsp;(Canvas&nbsp;canvas,&nbsp;MapView&nbsp;mapView,&nbsp;boolean&nbsp;shadow,&nbsp;long&nbsp;when)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;Projection&nbsp;projection&nbsp;=&nbsp;mapView.getProjection(); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(shadow&nbsp;==&nbsp;false)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Paint&nbsp;paint&nbsp;=&nbsp;new&nbsp;Paint(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paint.setAntiAlias(true); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;point&nbsp;=&nbsp;new&nbsp;Point(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;projection.toPixels(gp1,&nbsp;point); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;mode=1&#65306;start &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(mode==1)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(defaultColor==999) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paint.setColor(Color.BLACK);&nbsp;//&nbsp;Color.BLUE &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paint.setColor(defaultColor); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RectF&nbsp;oval=new&nbsp;RectF(point.x&nbsp;-&nbsp;mRadius,&nbsp;point.y&nbsp;-&nbsp;mRadius, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point.x&nbsp;+&nbsp;mRadius,&nbsp;point.y&nbsp;+&nbsp;mRadius); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;start&nbsp;point &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;canvas.drawOval(oval,&nbsp;paint); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;mode=2&#65306;path &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if(mode==2)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(defaultColor==999) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paint.setColor(Color.RED); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paint.setColor(defaultColor); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;point2&nbsp;=&nbsp;new&nbsp;Point(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;projection.toPixels(gp2,&nbsp;point2); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paint.setStrokeWidth(5); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paint.setAlpha(defaultColor==Color.parseColor("#6C8715")?220:120); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;canvas.drawLine(point.x,&nbsp;point.y,&nbsp;point2.x,point2.y,&nbsp;paint); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;mode=3&#65306;end&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if(mode==3)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;the&nbsp;last&nbsp;path&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(defaultColor==999) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paint.setColor(Color.BLACK);&nbsp;&nbsp;//&nbsp;Color.GREEN &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paint.setColor(defaultColor); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;point2&nbsp;=&nbsp;new&nbsp;Point(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;projection.toPixels(gp2,&nbsp;point2); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paint.setStrokeWidth(5); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paint.setAlpha(defaultColor==Color.parseColor("#6C8715")?220:120); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;canvas.drawLine(point.x,&nbsp;point.y,&nbsp;point2.x,point2.y,&nbsp;paint); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RectF&nbsp;oval=new&nbsp;RectF(point2.x&nbsp;-&nbsp;mRadius,point2.y&nbsp;-&nbsp;mRadius, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point2.x&nbsp;+&nbsp;mRadius,point2.y&nbsp;+&nbsp;mRadius); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;end&nbsp;point&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paint.setAlpha(255); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;canvas.drawOval(oval,&nbsp;paint); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;super.draw(canvas,&nbsp;mapView,&nbsp;shadow,&nbsp;when);}}

弑天下

现在有一个测试版GoogleMaps KML导入实用程序.它是GoogleMaps Android API实用程序库..如文档所示,它允许从流加载kml文件。KmlLayer&nbsp;layer&nbsp;=&nbsp;new&nbsp;KmlLayer(getMap(),&nbsp;kmlInputStream,&nbsp;getApplicationContext());或当地资源KmlLayer&nbsp;layer&nbsp;=&nbsp;new&nbsp;KmlLayer(getMap(),&nbsp;R.raw.kmlFile,&nbsp;getApplicationContext());创建KmlLayer之后,调用addLayerToMap()将导入的数据添加到映射中。layer.addLayerToMap();
随时随地看视频慕课网APP

相关分类

Android
我要回答