GPS - получение расстояния, времени при беге и ходьбе

У меня есть ситуация, когда мне нужно использовать технику GPS.

Мне нужно найти расстояние между двумя точками, когда человек идет.

Когда человек начинает ходить, он нажимает на Start button и когда он останавливается, он нажимает на stop button

после этого он должен показать ему

1. время взято 2. расстояние преодолено в км. 3. откуда, где (название места) например: от а до б

Нужно ли мне иметь карты Google для этого?

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

помогите пожалуйста как с этим идти

**

Отредактировано:

**

Это код, который я использую

private EditText editTextShowLocation;
    private Button buttonGetLocation;
    private ProgressBar progress;

    private LocationManager locManager;
    private LocationListener locListener = new MyLocationListener();

    private boolean gps_enabled = false;
    private boolean network_enabled = false;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        editTextShowLocation = (EditText) findViewById(R.id.editTextShowLocation);

        progress = (ProgressBar) findViewById(R.id.progressBar1);
        progress.setVisibility(View.GONE);

        buttonGetLocation = (Button) findViewById(R.id.buttonGetLocation);
        buttonGetLocation.setOnClickListener(this);

        locManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
    }

    @Override
    public void onClick(View v) {
        progress.setVisibility(View.VISIBLE);
        // exceptions will be thrown if provider is not permitted.
        try {
            gps_enabled = locManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        } catch (Exception ex) {
        }
        try {
            network_enabled = locManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        } catch (Exception ex) {
        }

        // don't start listeners if no provider is enabled
        if (!gps_enabled && !network_enabled) {
            AlertDialog.Builder builder = new Builder(this);
            builder.setTitle("Attention!");
            builder.setMessage("Sorry, location is not determined. Please enable location providers");
            builder.setPositiveButton("OK", this);
            builder.setNeutralButton("Cancel", this);
            builder.create().show();
            progress.setVisibility(View.GONE);
        }

        if (gps_enabled) {
            locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locListener);
        }
        if (network_enabled) {
            locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locListener);
        }
    }

    class MyLocationListener implements LocationListener {
        @Override
        public void onLocationChanged(Location location) {
            if (location != null) {
                // This needs to stop getting the location data and save the battery power.
                locManager.removeUpdates(locListener); 

                String londitude = "Londitude: " + location.getLongitude();
                String latitude = "Latitude: " + location.getLatitude();
                String altitiude = "Altitiude: " + location.getAltitude();
                String accuracy = "Accuracy: " + location.getAccuracy();
                String time = "Time: " + location.getTime();

                editTextShowLocation.setText(londitude + "\n" + latitude + "\n" + altitiude + "\n" + accuracy + "\n" + time);
                progress.setVisibility(View.GONE);
            } 
        }

        @Override
        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            // TODO Auto-generated method stub

        }
    }

    @Override
    public void onClick(DialogInterface dialog, int which) {
        if(which == DialogInterface.BUTTON_NEUTRAL){
            editTextShowLocation.setText("Sorry, location is not determined. To fix this please enable location providers");
        }else if (which == DialogInterface.BUTTON_POSITIVE) {
            startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
        }
    }

Он показывает широту логики, с которой я вхожу emulator control.

В этом я вручную вводить детали долготы и широты, перейдя в window->showview->other->emulator control для тестирования в эмуляторе, но что мне нужно, у меня будет два edittext, где я введу название места (A) и (B)

это должно дать мне расстояние

пожалуйста помоги

5 ответов

Решение

Попробуйте использовать Google Distance Matrix Api

https://developers.google.com/maps/documentation/distancematrix/

Вы можете использовать currentTimeinMillis(), чтобы узнать время начала и окончания вашего путешествия.

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

При этом формула расстояния даст вам расстояние между одной точкой и следующей, а не фактическое смещение. Если это не то, что вам нужно, а, скорее, вы хотите получить фактическое пройденное расстояние, вам нужно будет рассчитать это значение с более коротким интервалом.

Вы можете узнать расстояние между двумя точками (с точки зрения широты и долготы), используя сферическую тригонометрию

Пришло время использовать простые объекты даты и сравнить startTime и endTime.

(ИЛИ ЖЕ)

Вы можете получить приблизительное расстояние, используя код ниже

double distance;  

Location locationA = new Location("point A");  

locationA.setLatitude(latA);  
locationA.setLongitude(lngA);  

Location locationB = new Location("point B");  

locationB.setLatitude(latB);  
LocationB.setLongitude(lngB);  

distance = locationA.distanceTo(locationB); 

Для получения расстояния между 2 точками (от A до B) в Android есть функция под названием distanceTo.

Например, двойное расстояние = startLocation.distanceTo(finishLocation)/1000;

Как говорит npinti, вы можете использовать currentTimeinMillis() или использовать Timer и показывать его пользователю, когда он нажимает кнопку "Пуск". Это как секундомер.

отредактированный

Место А - Нью-Йорк

Место B - Париж

В этом случае вам сначала нужно преобразовать строку в Location(т.е. вам нужны широта и долгота). Для этого вы должны использовать понятие геокодирования.

List<Address> foundGeocode = null;
foundGeocode = new Geocoder(this).getFromLocationName("address here", 1);
 foundGeocode.get(0).getLatitude(); //getting latitude
 foundGeocode.get(0).getLongitude();//getting longitude

После этого вы можете рассчитать расстояние от метода distanceTo. Надеюсь, это поможет....

Я полагаю, что вопрос в том, чтобы ходить..

Ты идешь по улицам или как летит ворона?

Если это улицы, и вы подключены к сети, используйте API Google. Он рассчитывает маршрутизацию на основе двух точек и возвращает XML. Должно быть достаточно легко выяснить.

Если он летит... ну, тогда просто сделайте (a*a) + (b*b) = (c*c), это намного проще.. Вы могли бы сделать так, чтобы ваш пользователь нажал на большие повороты.. Или вы могли бы поддерживайте работоспособность каждые 10 секунд, начиная с момента их запуска, и наносите на карту точки. Все еще a*a+b*b=c*c, но только несколько шагов.

Конечно, вам придется запустить его в службе. И если бы у меня был выбор, я бы выбрал этот вариант. Вы можете настроить время цикла в зависимости от пройденной скорости. Быстрее будет меньше пауз. Это требует меньше от вашего датаплана.


РЕДАКТИРОВАТЬ
Ах.. Я вижу, что ты ищешь. Это не то, что я думал, что вы просили. Упростите.. конвертируйте широту / долготу в GPS. а затем сделать простую математику на последней сохраненной точке

void addDistance()
{
  newX = ...
  newY = ...
  deltaX = absolute(m_oldX - newX)
  deltaY = absolute(m_oldY = newY)
  m_distance += sqrt(deltaX^2 + deltaY^2);
  m_oldX = newX;
  m_oldY = newY;
}
void startOver()
{
  newX = ...
  newY = ...
  m_distance = 0;
  m_oldX = newX;
  m_oldY = newY;

}
Другие вопросы по тегам