2016-04-02 6 views
2

私はlatとlngを保存するためのArrayList()を持っています。そして新しい点があるときに線が描画されます。私は合計配列を計算するために、この配列内の要素を取得します。しかし、どういうわけか私はcalculateDistanceメソッドを使って総距離を計算しますが、結果は正しくありません。だから私は何かが間違っていたかどうかを知りたい。旅行総距離の計算方法は?

private void whereAmI(){ 

    Location location = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
    updateWithNewLocation(location); 

    //GPS Listener 
    manager.addGpsStatusListener(gpsListener); 

    //Location Listener 
    int minTime = 0;//ms 
    int minDist = 0;//meter 
    manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, minTime, minDist, locationListener); 
} 

GpsStatus.Listener gpsListener = new GpsStatus.Listener() { 
    @Override 
    public void onGpsStatusChanged(int event) { 
     switch (event) { 
      case GpsStatus.GPS_EVENT_STARTED: 
       Log.d("x=", "GPS_EVENT_STARTED"); 
       Toast.makeText(MapsActivity.this, "GPS_EVENT_STARTED", Toast.LENGTH_SHORT).show(); 
       break; 
      case GpsStatus.GPS_EVENT_STOPPED: 
       Log.d("x=", "GPS_EVENT_STOPPED"); 
       Toast.makeText(MapsActivity.this, "GPS_EVENT_STOPPED", Toast.LENGTH_SHORT).show(); 
       break; 
      case GpsStatus.GPS_EVENT_FIRST_FIX: 
       Log.d("x=", "GPS_EVENT_FIRST_FIX"); 
       Toast.makeText(MapsActivity.this, "GPS_EVENT_FIRST_FIX", Toast.LENGTH_SHORT).show(); 
       break; 
      case GpsStatus.GPS_EVENT_SATELLITE_STATUS: 
       Log.d("x=", "GPS_EVENT_SATELLITE_STATUS"); 
       break; 
     } 
    } 
}; 

LocationListener locationListener = new LocationListener(){ 
    @Override 
    public void onLocationChanged(Location location) { 
     updateWithNewLocation(location); 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     updateWithNewLocation(null); 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 

    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     switch (status) { 
      case LocationProvider.OUT_OF_SERVICE: 
       Log.v("x=", "Status Changed: Out of Service"); 
       Toast.makeText(MapsActivity.this, "Status Changed: Out of Service", Toast.LENGTH_SHORT).show(); 
       break; 
      case LocationProvider.TEMPORARILY_UNAVAILABLE: 
       Log.v("x=", "Status Changed: Temporarily Unavailable"); 
       Toast.makeText(MapsActivity.this, "Status Changed: Temporarily Unavailable", Toast.LENGTH_SHORT).show(); 
       break; 
      case LocationProvider.AVAILABLE: 
       Log.v("x=", "Status Changed: Available"); 
       Toast.makeText(MapsActivity.this, "Status Changed: Available", Toast.LENGTH_SHORT).show(); 
       break; 
     } 
    } 

}; 

private void showMarkerMe(double lat, double lng){ 
    if (markerMe != null) { 
     markerMe.remove(); 
    } 

    MarkerOptions markerOpt = new MarkerOptions(); 
    markerOpt.position(new LatLng(lat, lng)); 
    markerOpt.title("I am here!"); 
    markerMe = mMap.addMarker(markerOpt); 

    //Toast.makeText(this, "lat:" + lat + ",lng:" + lng, Toast.LENGTH_SHORT).show(); 
} 

private void cameraFocusOnMe(double lat, double lng){ 
    CameraPosition camPosition = new CameraPosition.Builder() 
      .target(new LatLng(lat, lng)) 
      .zoom(16) 
      .build(); 

    mMap.animateCamera(CameraUpdateFactory.newCameraPosition(camPosition)); 
} 

private void trackToMe(double lat, double lng){ 
    if (traceOfMe == null) { 
     traceOfMe = new ArrayList<LatLng>(); 
    } 
    traceOfMe.add(new LatLng(lat, lng)); 

    calculateDistance(traceOfMe); 

    PolylineOptions polylineOpt = new PolylineOptions(); 
    for (LatLng latlng : traceOfMe) { 
     polylineOpt.add(latlng); 
    } 

    polylineOpt.color(Color.RED); 

    Polyline line = mMap.addPolyline(polylineOpt); 
    line.setWidth(10); 
} 

private void calculateDistance(ArrayList<LatLng> points) { 

    for (int i =0; i < points.size() -1; i++) { 
     LatLng pointA = points.get(i); 
     LatLng pointB = points.get(i + 1); 
     float[] results = new float[3]; 
     Location.distanceBetween (pointA.latitude, pointA.longitude, pointB.latitude, pointB.longitude, results); 
     totalD += results[0]; 
    } 
} 

private void updateWithNewLocation(Location location) { 

    String where = ""; 
    if (location != null) { 

     double lng = location.getLongitude(); 

     double lat = location.getLatitude(); 

     float speed = location.getSpeed(); 

     long time = location.getTime(); 
     String timeString = getTimeString(time); 

     speedList.add(""+ speed); 

     where = "Lng: " + lng + 
       " Lat: " + lat + 
       " Speed: " + speed + 
       "\nTime: " + timeString + 
       " Provider: " + "gps" + 
       " Distance: " + totalD ; 


     showMarkerMe(lat, lng); 
     cameraFocusOnMe(lat, lng); 
     trackToMe(lat, lng); 

    }else{ 
     where = "No location found."; 
    } 


    txt.setText(where); 
} 
+0

あなたは結果が間違っていると言いますか?私は140mの長いルートを歩いたときに –

+0

の例を挙げることができます、計算された距離は9950mでしたが、何とか描かれたパスは正しいです。だから私は上記のコードを使用する私の論理が間違っているかどうかを知りたい場合 –

+0

;)それはあまりにも、私は一見を与えるが、それは時間がかかるかもしれないと返す –

答えて

1

私はtotalD変数が宣言されている場所がわからないんだけど、それはあなたがリストに追加する各ポイントで値を蓄積しているように思えます。点Aから点Bまで10メートルの距離を歩いているとすると、最初のArrayListには2点しか含まれていないとし、距離を計算すると10メートルとして正しく計算され、totalD変数に割り当てられます。今度はさらにB点からC点まで歩き、さらに5メートル歩くと、ArrayListに3つの点A、B、Cがあり、合計距離は15メートル(10 + 5)になります。あなたの関数が書かれた方法で、あなたはポイントのリストを調べ、それを再設定することなくtotalDにすべて追加します。したがって、totalDはすでに前回の計算から10の値を持ち、今度はArrayListを再実行して合計15を得ることで、最初の計算でそこにあった15を前の10に加えます。あなたの合計は今や15(単に最後の計算の結果)ではなく、25(10 + 15、以前のすべての計算の結果を組み合わせたもの)です。だからあなたのcalculateDistance()方法の代わりに、

totalD += results[0]; 

であなたは、ローカル変数を持ってtempTotalDistanceを言うし、それにポイント間のすべての距離を追加し、グローバルtotalDにその最終値を割り当てる必要があります。新しいcalculateDistance()は次のように表示されます。

private void calculateDistance(ArrayList<LatLng> points) { 

    float tempTotalDistance; 

    for (int i =0; i < points.size() -1; i++) { 
     LatLng pointA = points.get(i); 
     LatLng pointB = points.get(i + 1); 
     float[] results = new float[3]; 
     Location.distanceBetween (pointA.latitude, pointA.longitude, pointB.latitude, pointB.longitude, results); 
     tempTotalDistance += results[0]; 
    } 

    totalD = tempTotalDistance; 
} 
+0

私はグローバル変数floatとしてtotalDを宣言します。totalD = 0f; 、最初にtempTotalDistanceを0として初期化する必要がありますか?あなたの答えと私のコード、plsの違いは何ですか?私が背後にある論理を知りたいので、たくさんのことを –

+0

ok、あなたが何を意味するのか、よく知っている!!!!!!!!!!!! –

+0

私は詳細な説明で答えを更新しました。浮動小数点数を宣言するときに浮動小数点数に0fを代入することができます。私の答えが正しい場合は、それを合格とマークしてください。ありがとう! – Levon