【问题标题】:Road Path in androidAndroid中的道路路径
【发布时间】:2012-07-30 12:13:35
【问题描述】:

我是 android 新手,我正在测试一个在 android 中提供道路路径的应用程序。但是我这里有很多错误(如下所示)。

    public class MapRouteActivity extends MapActivity {

        LinearLayout linearLayout;
        MapView mapView;
        private Road mRoad;

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                mapView = (MapView) findViewById(R.id.mapview);
                mapView.setBuiltInZoomControls(true);

                new Thread() {
                        @Override
                        public void run() {
                                double fromLat = 49.85, fromLon = 24.016667, toLat = 50.45, toLon = 30.523333;
                                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) {
                        TextView textView = (TextView) findViewById(R.id.description);
                        textView.setText(mRoad.mName + " " + mRoad.mDescription);
                        MapOverlay mapOverlay = new MapOverlay(mRoad, mapView);
                        List<Overlay> listOfOverlays = mapView.getOverlays();
                        listOfOverlays.clear();
                        listOfOverlays.add(mapOverlay);
                        mapView.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() {
                return false;
        }
}

class MapOverlay extends com.google.android.maps.Overlay {
        Road mRoad;
        ArrayList<GeoPoint> mPoints;

        public MapOverlay(Road road, MapView mv) {
                mRoad = road;
                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)));
                        }
                        int moveToLat = (mPoints.get(0).getLatitudeE6() + (mPoints.get(
                                        mPoints.size() - 1).getLatitudeE6() - mPoints.get(0)
                                        .getLatitudeE6()) / 2);
                        int moveToLong = (mPoints.get(0).getLongitudeE6() + (mPoints.get(
                                        mPoints.size() - 1).getLongitudeE6() - mPoints.get(0)
                                        .getLongitudeE6()) / 2);
                        GeoPoint moveTo = new GeoPoint(moveToLat, moveToLong);

                        MapController mapController = mv.getController();
                        mapController.animateTo(moveTo);
                        mapController.setZoom(7);
                }
        }

        @Override
        public boolean draw(Canvas canvas, MapView mv, boolean shadow, long when) {
                super.draw(canvas, mv, shadow);
                drawPath(mv, canvas);
                return true;
        }

        public void drawPath(MapView mv, Canvas canvas) {
                int x1 = -1, y1 = -1, x2 = -1, y2 = -1;
                Paint paint = new Paint();
                paint.setColor(Color.GREEN);
                paint.setStyle(Paint.Style.STROKE);
                paint.setStrokeWidth(3);
                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;
                }
        }
}

当我午餐这段代码时,我遇到了所有这些错误,如下所示:

07-30 14:03:08.969: W/dalvikvm(6934): Unable to resolve superclass of Lcom/test/MapRouteActivity; (17)
07-30 14:03:08.969: W/dalvikvm(6934): Link of class 'Lcom/test/MapRouteActivity;' failed
07-30 14:03:08.969: W/dalvikvm(6934): threadid=1: thread exiting with uncaught exception (group=0x2aac87c8)
07-30 14:03:08.979: E/AndroidRuntime(6934): FATAL EXCEPTION: main
07-30 14:03:08.979: E/AndroidRuntime(6934): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.test/com.test.MapRouteActivity}: java.lang.ClassNotFoundException: com.test.MapRouteActivity in loader dalvik.system.PathClassLoader[/data/app/com.test-1.apk]
07-30 14:03:08.979: E/AndroidRuntime(6934):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
07-30 14:03:08.979: E/AndroidRuntime(6934):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
07-30 14:03:08.979: E/AndroidRuntime(6934):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
07-30 14:03:08.979: E/AndroidRuntime(6934):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
07-30 14:03:08.979: E/AndroidRuntime(6934):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-30 14:03:08.979: E/AndroidRuntime(6934):     at android.os.Looper.loop(Looper.java:123)
07-30 14:03:08.979: E/AndroidRuntime(6934):     at android.app.ActivityThread.main(ActivityThread.java:4627)
07-30 14:03:08.979: E/AndroidRuntime(6934):     at java.lang.reflect.Method.invokeNative(Native Method)
07-30 14:03:08.979: E/AndroidRuntime(6934):     at java.lang.reflect.Method.invoke(Method.java:521)
07-30 14:03:08.979: E/AndroidRuntime(6934):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
07-30 14:03:08.979: E/AndroidRuntime(6934):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
07-30 14:03:08.979: E/AndroidRuntime(6934):     at dalvik.system.NativeStart.main(Native Method)
07-30 14:03:08.979: E/AndroidRuntime(6934): Caused by: java.lang.ClassNotFoundException: com.test.MapRouteActivity in loader dalvik.system.PathClassLoader[/data/app/com.test-1.apk]
07-30 14:03:08.979: E/AndroidRuntime(6934):     at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
07-30 14:03:08.979: E/AndroidRuntime(6934):     at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
07-30 14:03:08.979: E/AndroidRuntime(6934):     at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
07-30 14:03:08.979: E/AndroidRuntime(6934):     at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
07-30 14:03:08.979: E/AndroidRuntime(6934):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
07-30 14:03:08.979: E/AndroidRuntime(6934):     ... 11 more

【问题讨论】:

    标签: android android-mapview


    【解决方案1】:

    使用下面的代码片段

    private List<Overlay> mapOverlays;
    
    private Projection projection;  
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    
    linearLayout = (LinearLayout) findViewById(R.id.zoomview);
    mapView = (MapView) findViewById(R.id.mapview);
    mapView.setBuiltInZoomControls(true);
    
    mapOverlays = mapView.getOverlays();        
    projection = mapView.getProjection();
    mapOverlays.add(new MyOverlay());        
    
    }
    
    @Override
    protected boolean isRouteDisplayed() {
    return false;
    
    }
    
    class MyOverlay extends Overlay{
    
    public MyOverlay(){
    
    }   
    
    public void draw(Canvas canvas, MapView mapv, boolean shadow){
    super.draw(canvas, mapv, shadow);
    
    Paint   mPaint = new Paint();
    mPaint.setDither(true);
    mPaint.setColor(Color.RED);
    mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
    mPaint.setStrokeJoin(Paint.Join.ROUND);
    mPaint.setStrokeCap(Paint.Cap.ROUND);
    mPaint.setStrokeWidth(2);
    
    GeoPoint gP1 = new GeoPoint(19240000,-99120000);
    GeoPoint gP2 = new GeoPoint(37423157, -122085008);
    
    Point p1 = new Point();
    Point p2 = new Point();
    Path path = new Path();
    
    projection.toPixels(gP1, p1);
    projection.toPixels(gP2, p2);
    
    path.moveTo(p2.x, p2.y);
    path.lineTo(p1.x,p1.y);
    
    canvas.drawPath(path, mPaint);
    }
    

    【讨论】:

      【解决方案2】:

      使用以下代码绘制路线路径。

      MainActivity.java

      public class MainActivity extends MapActivity {
          LinearLayout linearLayout;
          MapView mapView;
          private Road mRoad;
      
          @Override
          public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.main);
              mapView = (MapView) findViewById(R.id.mapview);
              mapView.setBuiltInZoomControls(true);
      
              new Thread() {
                  @Override
                  public void run() {
                      double fromLat = 49.85, fromLon = 24.016667, toLat = 50.45, toLon = 30.523333;
                      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) {
                  TextView textView = (TextView) findViewById(R.id.description);
                  textView.setText(mRoad.mName + " " + mRoad.mDescription);
                  MapOverlay mapOverlay = new MapOverlay(mRoad, mapView);
                  List<Overlay> listOfOverlays = mapView.getOverlays();
                  listOfOverlays.clear();
                  listOfOverlays.add(mapOverlay);
                  mapView.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() {
              return false;
          }
      }
      
      class MapOverlay extends com.google.android.maps.Overlay {
          Road mRoad;
          ArrayList<GeoPoint> mPoints;
      
          public MapOverlay(Road road, MapView mv) {
              mRoad = road;
              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)));
                  }
                  int moveToLat = (mPoints.get(0).getLatitudeE6() + (mPoints.get(
                          mPoints.size() - 1).getLatitudeE6() - mPoints.get(0)
                          .getLatitudeE6()) / 2);
                  int moveToLong = (mPoints.get(0).getLongitudeE6() + (mPoints.get(
                          mPoints.size() - 1).getLongitudeE6() - mPoints.get(0)
                          .getLongitudeE6()) / 2);
                  GeoPoint moveTo = new GeoPoint(moveToLat, moveToLong);
      
                  MapController mapController = mv.getController();
                  mapController.animateTo(moveTo);
                  mapController.setZoom(7);
              }
          }
      
          @Override
          public boolean draw(Canvas canvas, MapView mv, boolean shadow, long when) {
              super.draw(canvas, mv, shadow);
              drawPath(mv, canvas);
              return true;
          }
      
          public void drawPath(MapView mv, Canvas canvas) {
              int x1 = -1, y1 = -1, x2 = -1, y2 = -1;
              Paint paint = new Paint();
              paint.setColor(Color.GREEN);
              paint.setStyle(Paint.Style.STROKE);
              paint.setStrokeWidth(3);
              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;
              }
          }
      }
      

      添加以下类

      Point.java

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

      Road.java

      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[] {};
      }
      

      RoadProvider.java

      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");
              return urlString.toString();
          }
      }
      
      class KMLHandler extends DefaultHandler {
          Road mRoad;
          boolean isPlacemark;
          boolean isRoute;
          boolean isItemIcon;
          private Stack<String> mCurrentElement = new Stack<String>();
          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 lenNew = coodrinatesParsed.length;
                              int lenOld = mRoad.mRoute.length;
                              double[][] temp = new double[lenOld + lenNew][2];
                              for (int i = 0; i < lenOld; i++) {
                                  temp[i] = mRoad.mRoute[i];
                              }
                              for (int i = 0; i < lenNew; i++) {
                                  String[] xyParsed = split(coodrinatesParsed[i], ",");
                                  for (int j = 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;
              } 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 = "&#160;";
              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[] points) {
              Point[] result = new Point[points.length + 1];
              for (int i = 0; i < points.length; i++)
                  result[i] = points[i];
              result[points.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;
          }
      }
      

      main.xml

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          android:orientation="vertical" >
      
          <TextView
              android:id="@+id/description"
              android:layout_width="fill_parent"
              android:layout_height="wrap_content" />
      
          <com.google.android.maps.MapView
              android:id="@+id/mapview"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:apiKey="Your API Key"
              android:clickable="true" />
      
      </LinearLayout>
      

      将以下权限添加到您的 android 清单文件中。

      <uses-permission android:name="android.permission.INTERNET"/>
      

      【讨论】:

      • 无论如何......我昨天测试了你的代码,但 textView “description”是“null null”并且应用程序崩溃了我该怎么办??
      • 我没有找到解决方案我有'nullPointer Exacption'但我不知道从哪里'以及由什么引起的
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      • 2017-09-12
      • 2016-12-02
      • 2012-03-23
      相关资源
      最近更新 更多