Page 4 of 5 FirstFirst ... 2 3 4 5 LastLast
Results 46 to 60 of 65

Thread: Hoe Locatie gebied met een bepaalde straal bepalen ?

  1. #46
    O, en als je van deze regel
    Code:
    LSensors  := LManager.GetSensorsByCategory(TSensorCategory.Location);
    Dit maakt
    Code:
    LSensors  := LManager.GetSensorsByCategory(TSensorCategory.Orientation);
    En als dat niet lukt
    Code:
    LSensors  := LManager.GetSensorsByCategory(TSensorCategory.Motion);

  2. #47
    Beide wijzigingen geven de foutmelding "Invalid class typecast"

  3. #48
    Tsja... Dan zal er toch even iemand anders naar moeten kijken die ook Firemonkey heeft want ik zit nog op XE dus kan niets uittesten.

    (Volgens de documentatie zie TSensorCategory.Orientation gewoon tot de categorieën moeten behoren.)

  4. #49
    Ik heb de code weer zoals in #45.

    Dit valt mij op:

    Bij die code krijg je de GPS locatie niet te zien, maar als ik er 2 labels en een Button aan toe voeg, krijg ik deze zo wel te zien:
    Code:
    procedure TForm1.Button2Click(Sender: TObject);
    begin
     Label1.Text := Format('%2.7f', [LocationSensor1.Sensor.Latitude]);
     Label2.Text := Format('%2.7f', [LocationSensor1.Sensor.Longitude]);
    end;
    Kan je daar nog iets mee ?

    Nu was het verkrijgen van de GPS locatie niet het probleem, maar dit viel mij op...

  5. #50
    Nee, want dat is de GPS sensor. Maar je moet bij die GetSensorsByCategory functie orientation opgeven want het kompas is onderdeel van de orientation sensoren.

  6. #51
    Maar je moet bij die GetSensorsByCategory functie orientation opgeven
    Dat geeft helaas de fout melding "Invalid class typecast"

    Tsja... Dan zal er toch even iemand anders naar moeten kijken die ook Firemonkey heeft want ik zit nog op XE dus kan niets uittesten.
    Ik ben ook al dagen vanalles aan het proberen, en kom geen stap verder.

    Heel erg bedankt voor je hulp en je geduld, met een beetje geluk komt er nog iemand langs met de oplossing.
    Tevens sluit ik niet geheel uit dat het een bug is in XE8, want daar was ik ook al iets van tegen gekomen.

    De eerste opzet die ik wou maken werkt perfect en heb ik dan ook in gebruik.
    De 2e opzet zet ik maar even in de koelkast, en wie weet gaat dat ooit ook nog lukken

    Heb ik echter nog één vraagje, de code in post #2.
    houdt die rekening met de "curve van de aarde" ?
    Last edited by MMSoft; 20-Sep-16 at 21:38.

  7. #52
    Ik heb XE10.1 geinstalleerd, en nu werkt dit wel gewoon:

    Label1.Text := FloatToStr( OrientationSensor1.Sensor.HeadingX );
    Label2.Text := FloatToStr( OrientationSensor1.Sensor.HeadingY );
    Label3.Text := FloatToStr( OrientationSensor1.Sensor.HeadingZ );

    Ik kan dan ook niets anders zeggen dat het een Bug is in XE8.

    Ik krijg er waardes uit waar ik (nog) niets mee kan, maar heb nu in ieder geval data.
    Last edited by MMSoft; 24-Sep-16 at 17:01.

  8. #53
    Ik heb intussen een perfect werkend compass (waarde 0...360).
    De hoek bereken tussen 2 GPS punten doe ik met deze code (zie #20).

    De navigatie richting bepaal ik zo:
    Code:
      Hoek := InitialBearing(LocationSensor1.Sensor.Latitude,
              LocationSensor1.Sensor.Longitude, Locatie_Lat, Locatie_Long); // in graden start point, end point, hoek
    
      Richting_Pijl := Compass_waarde + Hoek;
      if Richting_Pijl >= 360 then Richting_Pijl := Richting_Pijl - 360;
    Dit leek goed te werken, maar vandaag kwam ik hierbij toch een probleem tegen waarbij de pijl totaal niet klopte.

    Dus doe ik het zo goed, of moet dat anders ?

  9. #54
    Je zou de compass-waarde en de Latitude en Longitude van beide punten op het scherm moeten zetten zodat je een screenshot kunt maken van de dan geldende waarde. Dan kun je daarna kijken waarom het niet werkt.

    Of was de compass-waarde niet goed???
    Je zou ter referentie ook een pijl richting noorden weer kunnen geven. Dan kun je direct zien of die waarde klopt of niet (tenzij je niet weer waar het noorden is op dat moment )

  10. #55
    Links boven staat de huidige positie.
    Boven de knop "Save Positie" de gewenste positie
    De Linker pijl is het compass, en daarnaast staat de compass waarde.
    De Rechter pijl je de Navigatie pijl, met links onder naast deze pijl deze waarde
    En net daarboven de berekende Hoek waarde.

    De pijl wijst schuin naar rechts dat moet zijn schuin naar links.
    Ik reed richting het zuiden.

    Click image for larger version. 

Name:	1e.jpg 
Views:	147 
Size:	73.1 KB 
ID:	7401

    Click image for larger version. 

Name:	2e.jpg 
Views:	152 
Size:	73.1 KB 
ID:	7402
    Attached Thumbnails Attached Thumbnails Click image for larger version. 

Name:	21-10-16 06:43:32.jpg 
Views:	121 
Size:	47.7 KB 
ID:	7399   Click image for larger version. 

Name:	21-10-16 06:43:35.jpg 
Views:	136 
Size:	48.0 KB 
ID:	7400  
    Last edited by MMSoft; 21-Oct-16 at 18:31.

  11. #56
    Compass waarde:
    Noord = 0/360
    Oost = 270
    Zuid = 180
    West = 90

    Hoek waarde:
    Naar Noord = 360/0
    Naar Oost = 90
    Naar Zuid = 180
    Naar West = 270


    Ik heb het idee dat ik eerst de hoek waarde om moet draaien

    Code:
    Hoek := 360 - Hoek;
    
    Richting_Pijl := Compass_waarde + Hoek;
    if Richting_Pijl >= 360 then Richting_Pijl := Richting_Pijl - 360;
    Binnenkort maar weer eens testen.
    Last edited by MMSoft; 22-Oct-16 at 18:19.

  12. #57
    Vandaag weer getest, en het wil nog steeds niet goed werken.

    Klopt de berekening wel die ik uit mijn formule krijg denken jullie ?
    Ik krijg als hoek de waardes: 164,6727 en 164,4901.

    Code:
    // Hoek vanaf huidige GPS locatie naar een op te geven GPS locatie berekenen:
    
     Hoek := InitialBearing(LocationSensor1.Sensor.Latitude,
              LocationSensor1.Sensor.Longitude, Locatie_Lat, Locatie_Long); // in graden start point, end point, hoek
    
    
    function modulo(x, y: Extended): Extended;
    var
      d: Extended;
    begin
      d := x / y;
      Result := (d - floor(d)) * y;
    end;
    
    function degrees(Rads: Extended): Extended;
    begin
     Result := Rads * (180 / Pi);
    end;
    
    function sgn(a: extended): extended;
    begin
     if a < 0 then sgn := -1
     else sgn := 1;
    end;
    
    function atan2(y, x: extended): extended;
    begin
     if x > 0 then atan2 := arctan(y / x)
     else if x < 0 then atan2 := arctan(y / x) + pi
     else atan2 := pi / 2 * sgn(y);
    end;
    
    function InitialBearing(lat1, lon1, lat2, lon2: double): double; // in graden
    begin
     Result := modulo(degrees(atan2( sin(lon2 - lon1) * cos(lat2),
     cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(lon2 - lon1))), 360);
    end;
    Als ik dit bereken op: http://www.stapeltellen.nl/afstandhoek
    Dan krijg ik als waardes: 119,9 en 119,6

    Wie kan hier iets over vertellen ?

  13. #58
    Dit is een andere http://www.onlineconversion.com/map_...e_bearings.htm

    Het lijkt inderdaad alsof de formule niet klopt.

    Ik zie dat Android zelf trouwens ook een functie daarvoor heeft
    https://developer.android.com/refere.../Location.html
    http://stackoverflow.com/a/9569292/1037511
    Wat geeft bearing = loc1.bearingTo(loc2); in dat geval?

  14. #59
    Quote Originally Posted by MMSoft View Post
    Vandaag weer getest, en het wil nog steeds niet goed werken.

    Klopt de berekening wel die ik uit mijn formule krijg denken jullie ?
    Ik krijg als hoek de waardes: 164,6727 en 164,4901.

    Als ik dit bereken op: http://www.stapeltellen.nl/afstandhoek
    Dan krijg ik als waardes: 119,9 en 119,6

    Wie kan hier iets over vertellen ?
    HEBBES.

    Je moet de coordinaten eerst converteren naar radians.

    Delphi Code:
    1. function rads(value: extended): extended;
    2. begin
    3.   Result := value / (180 / Pi);
    4. end;
    5.  
    6. //..
    7.  Hoek := InitialBearing(Rads(LocationSensor1.Sensor.Latitude),
    8.           Rads(LocationSensor1.Sensor.Longitude), Rads(Locatie_Lat), Rads(Locatie_Long)); // in graden start point, end point, hoek

    Gevonden op deze site:
    http://www.igismap.com/formula-to-fi...ude-longitude/

    Ik vroeg me al af waarom ik in Delphi/Lazarus deze berekening niet goed kreeg !!
    X = cos(38.627089) * sin(4.38101)
    X = 0.05967668696

    Je moet dus cos(rads(38.627089)) * sin(Rads(4.38101)) doen.
    (en ook zo bij de rest van de berekening)

  15. #60
    Wat geeft bearing = loc1.bearingTo(loc2); in dat geval?
    Code:
    procedure TForm1.Button5Click(Sender: TObject);
    var
     loc1: Double;
     loc2: Double;
    begin
     loc1 := 51.7486897 5.5328644;  // Hoe geef ik een complete locatie op ?
    
     Hoek := loc1.bearingTo(loc2);  //bearingTo geeft ook een fout melding, in welke Unit zit deze ?
    end;



    Ik heb nu de function rads toegevoegd, en zet de GPS posities eerst om naar radialen:

    Code:
    Hoek := InitialBearing(Rads(LocationSensor1.Sensor.Latitude),
            Rads(LocationSensor1.Sensor.Longitude), Rads(Locatie_Lat), Rads(Locatie_Long)); // hoek in graden start point, end point
    
    function rads(value: extended): extended;
    begin
     Result := value / (180 / Pi);
    end;
    Ik krijg nu ook netjes 119,9 als hoek waarde bij de geteste posities.

    Je moet dus cos(rads(38.627089)) * sin(Rads(4.38101)) doen.
    (en ook zo bij de rest van de berekening)
    Moet ik hier verder nog iets mee doen (want dat is voor mij een beetje onduidelijk) ?
    Last edited by MMSoft; 23-Oct-16 at 21:14.

Page 4 of 5 FirstFirst ... 2 3 4 5 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •