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

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

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

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

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

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

Нужно ли мне иметь карты 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 ]

2 голосов
/ 30 марта 2012

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

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

0 голосов
/ 12 марта 2012

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

Например, double distance = startLocation.distanceTo (finishLocation) / 1000;

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

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

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

Место 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. Надеюсь, это поможет ....

0 голосов
/ 12 марта 2012

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

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

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

0 голосов
/ 12 марта 2012

Полагаю, вопрос в том, чтобы идти пешком ..

Вы ходите по улицам или когда летит ворона?

Если это улицы и вы подключены к сети, используйте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;

}
0 голосов
/ 12 марта 2012

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

Пришло время использовать простые объекты даты и сравнить 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); 
...