Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Kompass-Abfrage

  1. #1
    S-Man ist offline Neuer Benutzer
    Registriert seit
    07.12.2009
    Beiträge
    6

    Standard Kompass-Abfrage

    Hallo,

    ich habe eine DB mit einer Spalte (direction), die Gradzahlen enthält (0-360°) als Double Werte.

    Ich bekomme von meiner Anwendung einen Grad-Wert x und möchte nun alle Einträge haben, wo direction - 10 <= x <= direction + 10 ist.

    Momentan sieht meine Anfrage so aus:
    Code:
    SELECT * FROM table WHERE
    (abs(direction - $X) <= 10) OR (abs(direction - $X -360) <= 10) OR (abs(direction - $X +360) <= 10)
    Das läuft soweit ok, nur bei nicht-integer-Werten für $X gibt er "invalid syntax for integer" aus. Warum brauche ich denn da zwingend einen Integer-Wert? Und wie geht das anders?

    Ich habe auch PostGIS zu laufen, falls es da schon sowas wie eine Kompass-Funktion gibt, was ich glatt vermutet hätte. Hab aber keine gefunden.

    Gruß S-Man

  2. #2
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von S-Man Beitrag anzeigen
    Hallo,

    ich habe eine DB mit einer Spalte (direction), die Gradzahlen enthält (0-360°) als Double Werte.

    Ich bekomme von meiner Anwendung einen Grad-Wert x und möchte nun alle Einträge haben, wo direction - 10 <= x <= direction + 10 ist.

    Momentan sieht meine Anfrage so aus:
    Code:
    SELECT * FROM table WHERE
    (abs(direction - $X) <= 10) OR (abs(direction - $X -360) <= 10) OR (abs(direction - $X +360) <= 10)
    Das läuft soweit ok, nur bei nicht-integer-Werten für $X gibt er "invalid syntax for integer" aus. Warum brauche ich denn da zwingend einen Integer-Wert? Und wie geht das anders?

    Ich habe auch PostGIS zu laufen, falls es da schon sowas wie eine Kompass-Funktion gibt, was ich glatt vermutet hätte. Hab aber keine gefunden.

    Gruß S-Man

    Was genau enthält Deine Variable? Vielleicht ein Komma statt Punkt?


    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  3. #3
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von akretschmer Beitrag anzeigen
    Was genau enthält Deine Variable? Vielleicht ein Komma statt Punkt?


    Andreas
    Nachtrag: vielleicht kannst/solltest Du auch mit Funktionen wie degrees(), radians() und pi() hantieren, um Winkel (um die es ja geht) besser darzustellen. Das könnte Dir das rumgemache mit den Fallunterscheidungen ersparen.

    Andreas, zu lange aus der Schule, um das genau mathematisch herbeten zu können ...
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  4. #4
    S-Man ist offline Neuer Benutzer
    Registriert seit
    07.12.2009
    Beiträge
    6

    Standard

    Nein, ist schon ein Punkt Die Fehlermeldung bezieht sich ausdrücklich auf integer.

    Danke für den Hinweis mit den Funktionen. Werd mal schauen, ob mir das was bringt.

  5. #5
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von S-Man Beitrag anzeigen
    Nein, ist schon ein Punkt Die Fehlermeldung bezieht sich ausdrücklich auf integer.
    Ich hab versucht, diese Fehlermeldung zu provozieren. Ohne Erfolg. Am nächsten war da noch:

    Code:
    test=*# SELECT * FROM kompass WHERE (abs(direction - 9,1) <= 10) OR (abs(direction - 9,1 -360) <= 10) OR (abs(direction - 9,1 +360) <= 10);
    ERROR:  function abs(double precision, integer) does not exist                                                                             
    ZEILE 1: SELECT * FROM kompass WHERE (abs(direction - 9,1) <= 10) OR ...
    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  6. #6
    S-Man ist offline Neuer Benutzer
    Registriert seit
    07.12.2009
    Beiträge
    6

    Standard

    Hm, vllt liegts doch am PHP-Code, aber das wär komisch, da die Fehlermeldung tatsächlich nur kommt, wenn ich die SQL Anweisung so baue... Momentan helfe ich mir mit einem round(), was nicht so viel ausmacht. Aber doof isses schon. mit trigonometrie komme ich imho nicht weiter, glaube ich, da ich ja Winkel habe und keine Strecken brauche, sondern einen neuen Winkel...
    Ich kann ja mal den kompletten code zeigen:

    Code:
    $query = pg_query_params("
       SELECT * FROM table WHERE ((abs(direction - $1) <= 9) OR (abs(direction - $1 -360) <= 9) OR (abs(direction - $1 +360) <= 9))", 
    array( round($_POST['orientation'])))

  7. #7
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von S-Man Beitrag anzeigen
    Hm, vllt liegts doch am PHP-Code, aber das wär komisch, da die Fehlermeldung tatsächlich nur kommt, wenn ich die SQL Anweisung so baue... Momentan helfe ich mir mit einem round(), was nicht so viel ausmacht. Aber doof isses schon. mit trigonometrie komme ich imho nicht weiter, glaube ich, da ich ja Winkel habe und keine Strecken brauche, sondern einen neuen Winkel...
    Ich kann ja mal den kompletten code zeigen:

    Code:
    $query = pg_query_params("
       SELECT * FROM table WHERE ((abs(direction - $1) <= 9) OR (abs(direction - $1 -360) <= 9) OR (abs(direction - $1 +360) <= 9))", 
    array( round($_POST['orientation'])))
    Nun, da weiß oder sehe ich immer noch nicht, was als reines SQL rauskommt ...


    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  8. #8
    S-Man ist offline Neuer Benutzer
    Registriert seit
    07.12.2009
    Beiträge
    6

    Standard

    Ohne round im php-teil, der ja mein WorkAround ist, kommt das gewünschte zurück, solange
    $_POST['orientation'] ein integer ist,

    sonst diese Fehlermeldung:
    Warning: pg_query_params() [function.pg-query-params]: Query failed: ERROR: invalid input syntax for integer: "3.2" in download_screen.php on line

    Hilft das?

  9. #9
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von S-Man Beitrag anzeigen
    sonst diese Fehlermeldung:
    Warning: pg_query_params() [function.pg-query-params]: Query failed: ERROR: invalid input syntax for integer: "3.2" in download_screen.php on line

    Hilft das?
    Ja. 3.2 ist kein INT.

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  10. #10
    S-Man ist offline Neuer Benutzer
    Registriert seit
    07.12.2009
    Beiträge
    6

    Standard

    Ja, davon rede ich ja die ganze Zeit

    Ich verstehe nicht, warum man einen Integer braucht. Ich wüsste gern, wie das mit Doubles funktioniert

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum