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;
}