Местоположение getspeed return 0 [duplicate]

17
задан Mike Mackintosh 5 September 2012 в 03:34
поделиться

10 ответов

location.getSpeed ​​() возвращает только то, что было установлено с помощью location.setSpeed ​​(). Это значение, которое вы можете установить для объекта местоположения.

Чтобы вычислить скорость с помощью GPS, вам нужно будет сделать небольшую математику:

Speed = distance / time

необходимо выполнить:

(currentGPSPoint - lastGPSPoint) / (time between GPS points)

Все преобразованы в ft / sec или, тем не менее, вы хотите показать скорость. Так я сделал это, когда сделал приложение для бегунов.

В частности, вам нужно будет рассчитать абсолютные расстояния:

(sqrt((currentGPSPointX - lastGPSPointX)^2) + (currentGPSPointY - lastGPSPointY)^2)) / (time between GPS points)

Это может помочь сделать новый TrackPoint или что-то еще, что сохраняет местоположение GPS и время, в которое он был взят внутри.

17
ответ дан Mike Mackintosh 20 August 2018 в 14:13
поделиться
  • 1
    AH, Большое спасибо! Я изменю код, чтобы выполнить математику. :) – user591539 27 January 2011 в 04:47
  • 2
    он вернет расстояние в метрах или километре? – Shashwat Gupta 7 July 2017 в 05:28
  • 3
    Я видел проблемы с getSpeed ​​(), возвращающими нуль, хотя «hasSpeed ​​()» истинно, и было движение. На одном устройстве 6.0.1 он всегда возвращает ноль! Из службы Fused Location. Регулярный LocationManager обеспечивает скорость, но выглядит менее точной и реже в своих обновлениях. Поэтому я пошел со своим собственным вычислением скорости, как предлагается здесь. – Dave Hubbard 18 August 2017 в 19:34

(1) Я считаю, что вы можете использовать метод requestLocationUpdates(), а затем создать класс LocationListener с методом onLocationChange, установленным для отображения getSpeed(). Вот как я недавно видел это с помощью Location.getLatitude и Location.getLongitude, поэтому считаю, что вы можете просто использовать getSpeed ​​() таким же образом, правильно?

(2) После простого чтения окна описания eclipse , хотя я вижу, что он говорит точно, что сказал предыдущий человек: «if hasSpeed ​​() является ложным, возвращается 0.0f». Но, возможно, это поможет: http://www.ehow.com/how_5708473_convert-latitude-feet.html :)

1
ответ дан Andro Selva 20 August 2018 в 14:13
поделиться

Эй, я тоже страдал от того же, но теперь я решил его решить!

speed=location.getSpeed()*18/5

Также укажите interval как 1000*2 и fastest interval как 1000*1. ] для большей точности

0
ответ дан Aswath shobi 20 August 2018 в 14:13
поделиться
  • 1
    Откуда этот магический номер 18/5? Кроме того, как это помогает решить проблему & quot; getSpeed() возвращает 0 & quot; ? – juzraai 15 July 2018 в 17:25
  • 2
    Метод getSpeed ​​() возвращает значение в m / s, которое всегда возвращает ноль, поэтому конвертирует в км / ч с использованием 18/5 1 м / с = 18/5 км / час – Aswath shobi 16 July 2018 в 05:23

Я также столкнулся с этой проблемой раньше, надеюсь, это поможет.

Он возвращает 0, потому что ваше устройство не может получить блокировку на GPS или не может подключиться к GPS.

Я попытался получить скорость с помощью старого устройства lenovo, и он возвращает 0, потому что он не может заблокировать gps.

Я попытался использовать галактическую галактику samsung, и она вернула мою скорость (имеет лучший GPS-датчик) .

Датчик GPS в вашем телефоне может быть не очень хорошим, или вы находитесь в зоне с слабым сигналом GPS, например, внутри дома или здания.

0
ответ дан black1011 20 August 2018 в 14:13
поделиться

Я базово вычисляю мгновенную скорость, а затем использую метод setSpeed ​​(), чтобы добавить его в местоположение. Его довольно точно, потому что я сравнивал его внутри транспортного средства, где я мог проверить тахеометр.

private double calculateInstantaneousSpeed(Location location) {



    double insSpeed = 0;
    if (y1 == null && x1 <= -1) {
        //mark the location y1 at time x1
        y1 = location;
        x1 = duration.getDurationAsSeconds();


    } else {
         //mark the location y2 at time x2
        y2 = location;
        x2 = duration.getDurationAsSeconds();


        //calculate the slope of the curve (instantaneous speed)
        dy = y1.distanceTo(y2);
        dx = x2 - x1;

        insSpeed = dy / dx;

        y1 = y2;
        x1 = x2;

    }

    Singleton.getInstance().instantaneousSpeedSamples.add(insSpeed);
    //System.out.println("Instantaneous Speed m/s: "+insSpeed);
    return insSpeed;
}
0
ответ дан D3bian0s 20 August 2018 в 14:13
поделиться

getspeed () работает отлично. Вам не нужно делать математику, используя формулу расстояния. Это уже есть в speedpeed. Пока есть широта и долгота, скорость будет достигнута.

1
ответ дан Dosa 20 August 2018 в 14:13
поделиться
  • 1
    не работая со мной. всегда ноль – MSaudi 5 February 2014 в 14:42
  • 2
    Я не думаю, что это правда, у меня есть долгота и широта, но getSpeed ​​() всегда возвращает 0.0 – ConquerorsHaki 29 March 2016 в 15:33

На сферическом расстоянии планеты следует рассчитывать с помощью этих формул:

private static Double distance(Location one, Location two) {
       int R = 6371000;        
       Double dLat = toRad(two.getLatitude() - one.getLatitude());
       Double dLon = toRad(two.getLongitude() - one.getLongitude());
       Double lat1 = toRad(one.getLatitude());
       Double lat2 = toRad(two.getLatitude());         
       Double a = Math.sin(dLat / 2) * Math.sin(dLat / 2)
               + Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);        
       Double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));        
       Double d = R * c;
       return d;
   }
private static double toRad(Double d) {
       return d * Math.PI / 180;
   }
4
ответ дан Hyli 20 August 2018 в 14:13
поделиться
  • 1
    что, если пользователь на склоне тогда? – anil_pulikoden 1 March 2017 в 10:37

Есть мой пользовательский LocationListener, используемый для получения скорости вручную и по объекту местоположения, если имеет скорость.

 new LocationListener() {
        private Location mLastLocation;

        @Override
        public void onLocationChanged(Location pCurrentLocation) {
            //calcul manually speed
            double speed = 0;
            if (this.mLastLocation != null)
                speed = Math.sqrt(
                        Math.pow(pCurrentLocation.getLongitude() - mLastLocation.getLongitude(), 2)
                                + Math.pow(pCurrentLocation.getLatitude() - mLastLocation.getLatitude(), 2)
                ) / (pCurrentLocation.getTime() - this.mLastLocation.getTime());
            //if there is speed from location
            if (pCurrentLocation.hasSpeed())
                //get location speed
                speed = pCurrentLocation.getSpeed();
            this.mLastLocation = pCurrentLocation;
            ////////////
            //DO WHAT YOU WANT WITH speed VARIABLE
            ////////////
        }

        @Override
        public void onStatusChanged(String s, int i, Bundle bundle) {

        }

        @Override
        public void onProviderEnabled(String s) {

        }

        @Override
        public void onProviderDisabled(String s) {

        }
    };
8
ответ дан Kevin ABRIOUX 20 August 2018 в 14:13
поделиться
  • 1
    я использовал ваш код, он работает так, как будто он возвращает скорость как 2,25, но скорость моего автомобиля составляет около 60 км / ч. Как точно рассчитать скорость движения? – prasanthMurugan 21 November 2016 в 13:22
  • 2
    – AKASH WANGALWAR 19 September 2018 в 08:46
  • 3
    – Kevin ABRIOUX 19 September 2018 в 08:57

метод getSpeed ​​() действительно работает отлично, но вам нужно использовать высокий интервал запроса, например, 1 секунду, и вам нужна высокая точность, сначала я делал 3-секундный интервал и PRIORITY_BALANCED_POWER_ACCURACY, и я продолжал получать 0 значений, пока не меняю, как я говорю , Я использую платный провайдер местоположения api.

public class Main3Activity extends AppCompatActivity {

private FusedLocationProviderClient mFusedLocationClient;
private int speed;
private double lat;
private double lng;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);

    mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
}

@Override
protected void onResume() {
    super.onResume();
    if(!runtime_permissions()) {
        requestLocations();
    }
}

@Override
protected void onPause() {
    super.onPause();
    //stop location updates when Activity is no longer active
    if (mFusedLocationClient != null) {
        mFusedLocationClient.removeLocationUpdates(mLocationCallback);
    }
}

@SuppressLint("MissingPermission")
private void requestLocations(){
    LocationRequest mLocationRequest = new LocationRequest();
    mLocationRequest.setInterval(1000);;
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

    mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper());
}

LocationCallback mLocationCallback = new LocationCallback() {
    @Override
    public void onLocationResult(LocationResult locationResult) {
        List<Location> locationList = locationResult.getLocations();
        if (locationList.size() > 0) {
            //The last location in the list is the newest
            Location location = locationList.get(locationList.size() - 1);

            lat = location.getLatitude();
            lng = location.getLongitude();

            //speed in km/h
            speed = (int) ((location.getSpeed() * 3600) / 1000);

        }
    }
};

private boolean runtime_permissions() {
    if(Build.VERSION.SDK_INT >= 23 && ContextCompat.checkSelfPermission(this,
            Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){

        requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION},100);

        return true;
    }
    return false;
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(requestCode == 100){
        if( grantResults[0] == PackageManager.PERMISSION_GRANTED){
            onResume();
        }else{
            runtime_permissions();
        }
    }
}

}

0
ответ дан Max Barboza 20 August 2018 в 14:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: