место прыжка на картах гугл по gps. (неточное расстояние)

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

пожалуйста, смотрите мой вывод для более подробной информации

Java-код

public class MainActivity extends FragmentActivity implements LocationListener{

protected LocationManager locationManager;
private GoogleMap googleMap;
Button btnStartMove,btnPause,btnResume,btnStop;
static double n=0;
Long s1,r1;
double dis=0.0;
Thread t1;
EditText userNumberInput;
boolean bool=false;
int count=0;

double speed = 1.6;
double lat1,lon1,lat2,lon2,lat3,lon3,lat4,lon4;
double dist = 0;
TextView distanceText;
float[] result;
private static final long MINIMUM_DISTANCE_CHANGE_FOR_UPDATES =1; // in Meters
private static final long MINIMUM_TIME_BETWEEN_UPDATES = 3000; //in milliseconds
boolean startDistance = false;
boolean firstTime = false;
@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,MINIMUM_TIME_BETWEEN_UPDATES,MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, this);
    if(isGooglePlay())
    {
        setUpMapIfNeeded();
    }
    distanceText=(TextView)findViewById(R.id.Distance);
    btnStartMove=(Button)findViewById(R.id.Start);//start moving

    //prepare distance...........
    Log.d("GPS Enabled", "GPS Enabled");  
    Criteria criteria = new Criteria();
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    String provider = locationManager.getBestProvider(criteria, true);
    Location location=locationManager.getLastKnownLocation(provider);

    btnStartMove.setOnClickListener(new OnClickListener() 
    {
        @Override
        public void onClick(View v) {
            startDistance = true;
//              lat3 = location.getLatitude();
//              lon3 = location.getLongitude();
        }
    });
    if(location!= null)
    {
        //Display current location in Toast
        String message = String.format(
                "Current Location \n Longitude: %1$s \n Latitude: %2$s",
                location.getLongitude(), location.getLatitude()
        );
        Toast.makeText(MainActivity.this, message,
                Toast.LENGTH_LONG).show();

        //Display current location in textview  
        //latitude.setText("Current Latitude: " + String.valueOf(location.getLatitude())); 
        //longitude.setText("Current Longitude: " + String.valueOf(location.getLongitude()));

        //lat3 = location.getLatitude();
        //lon3 = location.getLongitude();
    }
    else if(location == null)
    {
        Toast.makeText(MainActivity.this,
                "Location is null",    
                Toast.LENGTH_LONG).show();
    }


}

private void setUpMapIfNeeded() {

    if(googleMap == null)
    {
        Toast.makeText(MainActivity.this, "Getting map",
                Toast.LENGTH_LONG).show();
        googleMap =((SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.displayMap)).getMap();

        if(googleMap != null)
        {
            setUpMap();
        }
    }

}

private void setUpMap() 
{
    //Enable MyLocation Layer of Google Map
    googleMap.setMyLocationEnabled(true);

    //Get locationManager object from System Service LOCATION_SERVICE
    //LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

    //Create a criteria object to retrieve provider
    Criteria criteria = new Criteria();
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    //Get the name of the best provider
    String provider = locationManager.getBestProvider(criteria, true);
    if(provider == null)
    {
        onProviderDisabled(provider);
    }
    //set map type
    googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
    //Get current location
    Location myLocation = locationManager.getLastKnownLocation(provider);
    if(myLocation != null)
    {
        onLocationChanged(myLocation);
    }       
    locationManager.requestLocationUpdates(provider, 0, 0, this);
}

private boolean isGooglePlay() 
{
    int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);

    if (status == ConnectionResult.SUCCESS)
    {

        Toast.makeText(MainActivity.this, "Google Play Services is available",
                Toast.LENGTH_LONG).show();
        return(true);
    }
    else
    {
            GooglePlayServicesUtil.getErrorDialog(status, this, 10).show();

    }
    return (false);

 }

@Override
public void onLocationChanged(Location myLocation) {
    System.out.println("speed " + myLocation.getSpeed());
//      if(myLocation.getSpeed() > speed)
//      {
        //show location on map.................
        //Get latitude of the current location
        double latitude = myLocation.getLatitude();
        //Get longitude of the current location
        double longitude = myLocation.getLongitude();
        //Create a LatLng object for the current location
        LatLng latLng = new LatLng(latitude, longitude);
        //Show the current location in Google Map
        googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
        //Zoom in the Google Map
        googleMap.animateCamera(CameraUpdateFactory.zoomTo(20));
        googleMap.addMarker(new MarkerOptions().position(new LatLng(latitude, longitude)).title("You are here!"));

        //show distance............................

        if(startDistance == true)
        {

            Toast.makeText(MainActivity.this,
                      "Location has changed",    
                      Toast.LENGTH_LONG).show();
                if(myLocation != null)
                {
                    //latitude.setText("Current Latitude: " + String.valueOf(loc2.getLatitude())); 
                    //longitude.setText("Current Longitude: " + String.valueOf(loc2.getLongitude()));
                    float[] results = new float[1]; 
                    Location.distanceBetween(lat3, lon3, myLocation.getLatitude(), myLocation.getLongitude(), results);
                    System.out.println("Distance is: " + results[0]);               

                    dist += results[0];            
                    DecimalFormat df = new DecimalFormat("#.##"); // adjust this as appropriate
                if(count==1)
                {
                    distanceText.setText(df.format(dist) + "meters");
                }
                    lat3=myLocation.getLatitude();
                    lon3=myLocation.getLongitude();
                    count=1;
              }

        }
        startDistance=true;
    //}


}

@Override
public void onProviderDisabled(String provider) {
    Toast.makeText(MainActivity.this,
            "Provider disabled by the user. GPS turned off",
            Toast.LENGTH_LONG).show();
}

@Override
public void onProviderEnabled(String provider) {
    Toast.makeText(MainActivity.this,
            "Provider enabled by the user. GPS turned on",
            Toast.LENGTH_LONG).show();
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    Toast.makeText(MainActivity.this, "Provider status changed",
            Toast.LENGTH_LONG).show();
}
@Override
protected void onPause() {
super.onPause();
locationManager.removeUpdates(this);
}
@Override
protected void onResume() {
    super.onResume();
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,MINIMUM_TIME_BETWEEN_UPDATES,MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, this);
}}

введите здесь описание изображения

введите здесь описание изображения

похоже, нет никакого способа решить мою ошибку. Было рекомендовано использовать location.getSpeed, но он возвращает 0.


person Myst    schedule 06.02.2014    source источник
comment
ваше расстояние составляет 1 метр для обнаружения, а время для обновления составляет 3 секунды. ты считаешь это?   -  person Umit Kaya    schedule 06.02.2014
comment
я думал об этом. я хотел обновить расстояние для каждого минимума на 1 метр, чтобы оно могло быть более точным. так я должен увеличить сроки? но даже если я увеличу, это все равно останется неточным ..   -  person Myst    schedule 06.02.2014
comment
Аналогичный вопрос был задан и ответил здесь: stackoverflow.com/questions/22274271/   -  person Peter    schedule 26.05.2014
comment
Привет @Myst, ты когда-нибудь находил решение этой проблемы? у меня точно такая же проблема   -  person KvnH    schedule 19.08.2015
comment
У меня та же проблема stackoverflow.com/questions/47991613/ Есть какое-то решение?   -  person DmitryBoyko    schedule 27.12.2017