2016-04-02 1 views
0

私はlatとlngを保存するためのArrayList()というArrayListを持っています。距離を計算するために、この配列内の要素を取得したいと思います。私はルートを追跡するために上記のコードを使用AndroidはArrayListから要素を取得しています<LatLng>()

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

2つのポイント間の距離または距離がほしいと思っていますか? –

+0

私は移動距離の合計を計算したい –

+0

GMapV2Direction md = new GMapV2Direction();ドキュメントdoc = md.getDocument(latLngIst、latlng2nd、GMapV2Direction.MODE_DRIVING); ArrayList traceOfMe = md.getDirection(doc); PolylineOptions polylineOpt = new PolylineOptions(); for(LatLng latlng:traceOfMe){ polylineOpt.add(latlng); } polylineOpt.color(Color.RED); ポリラインライン= mMap.addPolyline(polylineOpt); line.setWidth(10); – saeed

答えて

0

あなたの軌道のすべてのポイントを通過する必要があります。 パスの各セグメントでdistanceBetweenを呼び出します。

distanceBetweenメソッドは、float []を実行して結果を格納します。

結果[0] = 2点間の距離(メートル単位)。

1 =初期軸受(それは常に設定されていないようだ)結果

結果[2](それは常に設定されていないようです)最終ベアリング詳細について

マニュアルを参照= there

だから、そのようなことはここで仕事

private float calculateDistance(ArrayList<LatLng> points) { 
    float totalDistance = 0f; 
    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); 
     totalDistance += results[0]; 
    } 
    return totalDistance; 
} 

を行う必要があり、より最適化されたソリューションです:

次の2つの変数あなたonLocationChanged方法で、その後

LatLng previousLocation float totalDistance

を保存あなたのactiviyで

。あなたはそのようなaddToDistanceメソッドを呼び出します

// Goes inside your Location listener 
@Override 
public void onLocationChanged(Location location) { 
    updateWithNewLocation(location); 
    addToDistance(location); 
} 

// Goes inside your activity 
public void addToDistance(LatLng newPoint) { 
     if (previousLocation != null) { 
      float[] results = new float[3]; 
      Location.distanceBetween (previousLocation.latitude, previousLocation.longitude, newPoint.latitude, newPoint.longitude, results); 
     totalDistance += results[0]; 
     } 
     previousLocation = newPoint; 
} 
+0

私はこのメソッドを作成し、次にtrackToMeメソッドの中でcalculateDistance(traceOfMe)を追加します。 ? –

+0

距離をどのように使いたいかによって異なりますか? –

+0

トラッキングがオンになってから移動した距離を計算したいのですが、場所の変更があった場合、traceOfMe配列リストにはルートのlatとlngが格納されます。移動距離を計算するために使用したいだけです。 –

関連する問題