2013-02-27 2 views
0

Я пытаюсь нарисовать путь, когда фермер перемещается вокруг своей фермы ниже, это мои классы, моя проблема заключается в том, что я начинаю отслеживать движение строки, даже когда пользователь не перемещается, и путь не обновляется, поскольку он движетсяMap overlay not update

public class RouteOverlay extends Overlay { 

private GeoPoint gp1; 
private GeoPoint gp2; 
private int mode = 1; 

public RouteOverlay(GeoPoint paramGeoPoint1, GeoPoint paramGeoPoint2,int paramInt) 
{ 
    this.gp1 = paramGeoPoint1; 
    this.gp2 = paramGeoPoint2; 
    this.mode = paramInt; 
} 

public void draw(Canvas paramCanvas, MapView paramMapView, 
     boolean paramShadow) 
{ 

    super.draw(paramCanvas, paramMapView, paramShadow); 

    Projection projection = paramMapView.getProjection(); 
    Paint mPaint = new Paint(); 
    mPaint.setDither(true); 
    mPaint.setAntiAlias(true); 
    mPaint.setColor(Color.RED); 
    mPaint.setStyle(Paint.Style.FILL_AND_STROKE); 
    mPaint.setStrokeJoin(Paint.Join.ROUND); 
    mPaint.setStrokeCap(Paint.Cap.ROUND); 
    mPaint.setStrokeWidth(3); 
    mPaint.setAlpha(120); 

    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); 

    paramCanvas.drawPath(path, mPaint); 
} 

mainactivity:

public class MainActivity extends MapActivity { 



public final LocationListener locationListener = new LocationListener() { 

    public void onLocationChanged(Location location) { 
     coordinates.add(location); 
     mapView.getController().animateTo(getGeoByLocation(location)); 
     drawRoute(coordinates, mapView); 

    } 


}; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_area_measurement); 
    this.mapView = ((MapView) findViewById(R.id.mapview)); 
    this.mapView.setBuiltInZoomControls(false); 
    this.mapView.getController().setZoom(17); 
    this.coordinates = new ArrayList<Location>(); 

} 

    protected boolean isRouteDisplayed() { 
    return false; 
} 

private GeoPoint getGeoByLocation(Location location) { 
    GeoPoint gp = null; 

    try { 
     if (location != null) { 
      double geoLatitude = location.getLatitude() * 1E6; 
      double geoLongitude = location.getLongitude() * 1E6; 
      gp = new GeoPoint((int) geoLatitude, (int) geoLongitude); 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return gp; 
} 

public String getLocationProvider(LocationManager paramLocationManager) { 
    try { 
     Criteria localCriteria = new Criteria(); 
     localCriteria.setAccuracy(1); 
     localCriteria.setAltitudeRequired(false); 
     localCriteria.setBearingRequired(false); 
     localCriteria.setCostAllowed(true); 
     localCriteria.setPowerRequirement(3); 
     String str = paramLocationManager.getBestProvider(localCriteria, 
       true); 
     return str; 
    } catch (Exception localException) { 
     while (true) { 
      localException.printStackTrace(); 
     } 
    } 
} 

private void drawRoute(ArrayList<Location> paramArrayList,MapView paramMapView) { 
    List<Overlay> overlays = paramMapView.getOverlays(); 
    //Changed for smooth rendering 
     overlays.clear(); 
    for (int i = 1; i < paramArrayList.size(); i++) { 
     overlays.add(new RouteOverlay(getGeoByLocation(paramArrayList.get(i - 1)), getGeoByLocation(paramArrayList.get(i)),2)); 
    } 
} 

public void startRecording() { 
    this.isMeasuring = true; 
    lm = (LocationManager) getSystemService(LOCATION_SERVICE); 
    lm.requestLocationUpdates(getLocationProvider(lm),500,2,this.locationListener); 
    /*if (lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){ 
      gpsstatus.setText("Gps Is Enabled"); 
    }else 
    { gpsstatus.setText("Gps Is disabled");}*/ 
} 

ответ

0

Можете ли вы подтвердить, что вы всегда с помощью GPS для отслеживания маршрута? В противном случае вы можете получить неверные результаты, и ваш патч может быть нарисован, как на картах Apple. Для этих случаев всегда старайтесь использовать GPS, я уверен, что вы не хотите, чтобы на карте был выбран неправильный путь. Сетевой провайдер может триангулировать относительную точку на карте, но в этом случае он будет ошибочным в 99% случаев, поскольку позиция является относительной.

Приветствия

+0

я не уверен, как проверить, если возвращаемое значение от GPS – user2114562

+0

Ну, попробуйте использовать 'GPS_PROVIDER' ТОЛЬКО в вашем коде. Я думаю, это подойдет вашим потребностям наилучшим образом и не будет использовать 'NETWORK_PROVIDER'. Это даст вам правильное местоположение все время, но подумайте над этим: если вы рисуете маршрут на очень маленькой улице, даже GPS не может гарантировать вам, что возвращаемые координаты находятся посреди улицы. Вы также должны рассмотреть алгоритм, чтобы обнаружить соседнюю улицу (возможно, векторное сравнение) и цвет внутри улицы. Я на правильном пути или это что-то еще, чего вы хотите достичь? – g00dy

+0

Да, спасибо, я использую только gps_provider – user2114562