Distanz messen

  • 10 Antworten
  • Neuster Beitrag
H

hundsmiachn

Neues Mitglied
Threadstarter
Hallo

Ich bin gerade dabei mir eine kleine BikeApp zu schreiben, die mir einfach die Fahrzeit und die gefahrene Distanz misst. Beim Distanzmessen hab ich aber einige Probleme. Derzeit siehts so aus:

Code:
float []out = new float[1];
Location.distanceBetween(m_dLastLat, m_dLastLong, m_CurLoc.getLatitude(), m_CurLoc.getLongitude(), out);
if(out[0] > 10)
{
   m_dTripDistance += out[0];
   m_dLastLat = m_CurLoc.getLatitude();
   m_dLastLong = m_CurLoc.getLongitude();
}
Habe festgestellt dass das ungenau ist. Weiss jemand wie man die Distanz richtig, also mit der maximalen Genauigkeit, misst ?
Möchte also einfach eine gefahrene Strecke möglichst genau messen. Hab leider nur Beispiele mit einer Distanzmessung zw. 2 Punkten gefunden, nicht über
eine ganze Route also x-beliebig viele Punkte.

dank euch schon mal
mfg
Erich
 
DieGoldeneMitte

DieGoldeneMitte

Experte
Die Länge eines Polygonzugs (einer Serie von Punkten einer Route) ist die Summe der Abstände der jeweils aufeinander folgenden Punkte. Mehr ist da eigentlich nicht zu tun.

Was natürlich eine Herausforderung wäre, sind so Dinge wie Ausreißerpunkte erkennen und rausrechnen bzw Kurvenglättung (z.B.: http://de.wikipedia.org/wiki/Douglas-Peucker-Algorithmus) oder zu den Punkten die passende Straße finden (was offroader aber sicher nicht wollen :D).
 
Zuletzt bearbeitet:
S

sixi

Fortgeschrittenes Mitglied
Schau doch mal bei myTracks vorbei!
 
H

hundsmiachn

Neues Mitglied
Threadstarter
Dank euch, werd mir das mal ansehen.
Ich denke das Problem liegt einfach an den kleinen Abständen zwischen den Punkten, dadurch summieren sich die Fehler auf, oder ?

mfg
Erich
 
B

BFK

Fortgeschrittenes Mitglied
Hi,
wie schon DieGoldeneMitte sagte musst du einfach nur die Abstände addieren.

Am besten machst du das direkt bei onLocationChanged, da brauchst auch kein array mit Punkten usw.

Wenn du es aber dennoch später machen willst, dann hätte ich das so gemacht..:

Code:
private float gesamtEntfernung(Location loc_array, int gesamtpunkte)
{
   float gesamt_in_m = 0;
   for(int i = 0; i < gesamtpunkte; i++)
      {
        if(i != gesamtpunkte - 1)
          {
             gesamt_in_m += loc_array[i].distanceTo(loc_array[i+1]);
          }
      }
    return gesamt_in_m;
}
Das obere habe ich zwar nicht getestet, sollte aber funken.

Und mit "distanceBetween" sollte es natürlich auch gehen.

Ungenau ist es auf jeden Fall nicht (das habe ich getestet), es sei denn du übergibst ungenaue Koordinaten.
 
B

BFK

Fortgeschrittenes Mitglied
hundsmiachn schrieb:
Dank euch, werd mir das mal ansehen.
Ich denke das Problem liegt einfach an den kleinen Abständen zwischen den Punkten, dadurch summieren sich die Fehler auf, oder ?

mfg
Erich
Welche Werte hast du denn beim LocationManager für minTime und minDistance angegeben..?
 
H

hundsmiachn

Neues Mitglied
Threadstarter
Hallo

Hab bei beiden auf 0 gestellt, damit ich die maximale Anzahl an Wegpunkten bekomme, dezimieren kann ich sie später auch noch.

Hatte auch das Problem, dass der Weg sich immer erhöht hat, wenn ich stillstand, einfach durch die Schwankung der Coord, deshalb hab ich die Abfrage mit > 10 drin, er sollte also erst den Punkt addieren wenn er mindestens 10m vom vorigen entfernt ist.

mfg
Erich
 
B

BFK

Fortgeschrittenes Mitglied
hundsmiachn schrieb:
Hallo

Hab bei beiden auf 0 gestellt, damit ich die maximale Anzahl an Wegpunkten bekomme, dezimieren kann ich sie später auch noch.

Hatte auch das Problem, dass der Weg sich immer erhöht hat, wenn ich stillstand, einfach durch die Schwankung der Coord, deshalb hab ich die Abfrage mit > 10 drin, er sollte also erst den Punkt addieren wenn er mindestens 10m vom vorigen entfernt ist.

mfg
Erich
Ja aber genau deshalb ist minDistance ja da. Wenn du minDistance = 10 setzt, dann kommt ja keine weiteren Koordinaten rein, also brauchst du dich nicht selbst zu kümmern.
Ich finde, dass beide auf 0 zu setzen, bringt wriklich nicht viel, im Gegenteil du bekommst falsche Koordianten rein, weil ja das GPS-Signal sich ständig updatet und dich paar metern weiter anzeigt (alles weil ja das GPS-Signal um die 7-8 meter genau ist) und noch dazu wird dein Akku ständig geleert.

Deshalb rate ich dir minDistance auf 10 zu setzen und minTime auf 2000 (2 sec).
 
H

hundsmiachn

Neues Mitglied
Threadstarter
Hallo

Ich verwende ein Bluetooth GPS Receiver, deshalb habe ich das ganze auf Maximum gestellt, da spielt es mit dem Akku auch keine Rolle, und die Genaugkeit ist auch viel besser. Das Problem ist halt wenn ich den Locationmanager auf 10m einstelle, dass ich die Geschwindigkeit auch seltener bekomme, die Anzeige ist dann sehr träge ...

mfg
Erich
 
B

BFK

Fortgeschrittenes Mitglied
hundsmiachn schrieb:
Hallo

Ich verwende ein Bluetooth GPS Receiver, deshalb habe ich das ganze auf Maximum gestellt, da spielt es mit dem Akku auch keine Rolle, und die Genaugkeit ist auch viel besser. Das Problem ist halt wenn ich den Locationmanager auf 10m einstelle, dass ich die Geschwindigkeit auch seltener bekomme, die Anzeige ist dann sehr träge ...

mfg
Erich
Ja ok, du könntest aber wenn dir die Geschwindigkeit so wichtig ist, nen zweiten loc-listener benutzen.
Oder du kannst es auch so belassen, nur mir wär das ganze zu aufwendig, also das mit dem 10 m berchnen usw usw, deshalb das Ganze.
 
H

hundsmiachn

Neues Mitglied
Threadstarter
Hi

Soo aufwändig ist es ja nun auch nicht, die 10m Abfrage (-: (ein IF drüber)
Ich dachte halt, dass dadurch etwaige Rundungsfehler oder Ungenauigkeiten entstehen.

dank euch

mfg
Erich
 
Thread starter Similar threads Forum Replies Date
E Android App Entwicklung 5
Oben Unten