Ankündigung

Einklappen
Keine Ankündigung bisher.

Geolocation Entfernungsmessung für 1000 Händler

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Geolocation Entfernungsmessung für 1000 Händler

    Ich stolpere mal wieder über die Umkreissuche bzw. über Umsetzbarkeit bei vielen Einträgen.
    Ein Kunde hat ein Händlernetz mit 1000+ Händlern.
    Es wird eine Umkreissuche (auf Basis PLZ) benötigt, es sollen aber nur die nächsten 5 Händler im Umkreis angezeigt werden.

    Erste Idee, eine CC Liste der Händler mit Umkreisfilter (50km) , die auf 5 Händler begrenzt ist. Frage hierzu: In welcher Reihenfolge werden die Händler im Umkreis gesucht?

    Wenn also innerhalb der 50km 10 Händler sind, ich aber nur 5 Händler anzeigen lasse, welche werden dann gekappt? Die mit der höheren ID oder die mit der längeren Entfernung.

    Wie sieht es mit den Kosten aus? Wenn ich 1000 Händler zu einer PLZ Abfrage, habe ich ja theoretisch 1000 Anfragen (aktuell 5$), ist das so korrekt? In diesem Fall sollten wohl besser alle Ergebnisse zu den Entfernungen gecached werden. Bei aktuell 8181 aktiven Ortpostleitzahlen wären das 8,1Mio Einträge. Hat jemand eine Idee, wie so etwas umgesetzt wird?



  • #2
    Es wird eine Umkreissuche (auf Basis PLZ) benötigt, es sollen aber nur die nächsten 5 Händler im Umkreis angezeigt werden.
    Die Umkreissuche gibt die Treffer nach der Distanz aufsteigend zurück.
    Eine Liste mit Limit auf 5 Einträge sollte gut funktionieren.

    ---
    Die API muss nur telefonieren, wenn keine Koordinaten bekannt sind. Also nur eine Adresse vorliegt. Die Marker sind für die Umkreissuche bereits mit Koordinaten ausgestattet (Pflicht für die Umkreissuche). Damit muss keine erneute API Abfrage gestellt werden für die Maps-Darstellung.

    Einzig die Such-Anfrage muss einmal telefonieren und aus der anfragenden PLZ oder Adresse die Koordinaten erfragen.
    http://www.premium-contao-themes.com

    Kommentar


    • #3
      Zitat von Tim Beitrag anzeigen

      Die Umkreissuche gibt die Treffer nach der Distanz aufsteigend zurück.
      Eine Liste mit Limit auf 5 Einträge sollte gut funktionieren.

      Hi,

      ich habe das eben mit dem Standard Listentemplate (customcatalog_default) und einem Umkreisfilter unter Eclipse X 3.0.19 getestet. Die einzelnen Katalogeinträge enthalten Geodaten. Im Listenmodul ist keine Sortierung eingestellt.

      Jetzt bekomme ich aber je nach Umkreis bei gleicher PLZ eine anders sortierte Liste ausgespielt - die Sortierung nach Nähe zur eingegebenen PLZ scheint nicht zu funktionieren..

      Kommentar


      • #4
        Läuft es nur bei uns krumm oder ist das ein allgemeines Problem, dass die Umkreissuche nicht von Haus aus nach der Nähe sortiert werden kann? Und in letzterem Fall, habt Ihr das auf der Agenda für zukünftige Updates oder müssen wir uns selbst drum kümmern? Bisherige Versuche mit den Codeschnipseln aus dem Forum (findDistance Methode etc.) haben leider zu sehr langen Ladezeiten geführt.

        Wir haben aktuell ein Projekt das dieses Feature erfordert -> Die X nächsten Einträge von der eingegebenen Adresse ausspielen.

        Wäre cool hierzu eine Rückmeldung zu erhalten

        Kommentar


        • #5
          Die Umkreissuche gibt die Treffer nach Distanz sortiert zurück. Das Problem ist, dass der Query für die CC Einträge gesondert davon läuft und von dieser Sortierung erstmal nichts weiss, ausser die Ids der Einträge, die getroffen haben.

          Ich hänge mal ein mod_customcatalog Template an, das den Query für die Umkreistreffer noch einmal durchläuft. Dessen Ergebnis sind die nach Distanz sortierten IDs. -> quasi was der Filter vorher macht.

          Diese werden im nächsten Schritt genutzt um den eigentlich Query für die CC Ausgabe zu sortieren.

          Das ganze baut darauf auf, dass vor dieser sortierten Liste ein Umkreisfilter einmal durchgelaufen ist und die gecached Werte vorliegen.

          Hier das Ganze in Aktion, basierend auf der Directory Demo: https://dev4-13.premium-contao-theme...urg&plzort=500

          Ich werde eine zugängliche Methode bereitstellen im Geodaten-Attribut, das die Treffer Ids zurückgibt.

          Angehängte Dateien
          Zuletzt geändert von Tim; 16.06.2022, 09:56.
          http://www.premium-contao-themes.com

          Kommentar


          • #6
            Hi,
            vielen Dank! Ich habe das ausprobiert, im ersten Versuch liefert die Liste kein Ergebnis - habe dann
            PHP-Code:
            $objCC = \Contao\CustomCatalog::findByModule($this); 
            mit
            PHP-Code:
            $objCC $this->CustomCatalog
            ausgetauscht, dann funktioniert es. Kann diese Änderung die Funktion beeinträchtigen? Mich wundert nur noch, dass ich mit gleichem Katalog/Liste/Filter in einer Testinstallation eine leicht anders sortierte Liste erhalte. Testumgebung mit X3.0.19 -> richtige Sortierung / Live mit X3.0.16 -> Sehr ähnlich aber mit teils falscher Sortierung

            Kommentar


            • #7
              $this->CustomCatalog beinhaltet im mod_customcatalog Template sämtliche Liste-bezogenen Einstellungen wie z.B. eingene SQL Bedingungen, Paginationen, Veröffentlichungs-Einstellungen etc. Das Objekt ist das Resultat des abgearbeiteten CC-Liste-Moduls und kann vor der Ausgabe (->render()) im Template vollständig manipuliert werden.

              ::findMyModule erstellt ein rohes CC Objekt mit reinem Verweis auf die Tabelle ohne Berücksichtungen von Filtern etc. Es ist quasi ein reines "Arbeits-Objekt".

              Technische Unterschiede in den beiden Versionen sollten marginal sein. Nicht zu unterschätzen sind Rundungs-Abweichungen bei Geographischen Daten. Hier sind bereits Rundungen im Dezimalbereich kilometerweite Unterschiede.



              http://www.premium-contao-themes.com

              Kommentar


              • #8
                Hi Tim, danke für die Rückmeldung.

                Hast du eine Idee, warum
                PHP-Code:
                $objCC = \Contao\CustomCatalog::findByModule($this); 
                kein Ergebnis liefert?

                Wir würden das Feature sehr gerne nutzen und dann natürlich am besten mit dem "Arbeits-Objekt" ohne Rundungsfehler.

                Kommentar


                • #9
                  Zitat von EBL Beitrag anzeigen
                  Hi Tim, danke für die Rückmeldung.

                  Hast du eine Idee, warum
                  PHP-Code:
                  $objCC = \Contao\CustomCatalog::findByModule($this); 
                  kein Ergebnis liefert?

                  Wir würden das Feature sehr gerne nutzen und dann natürlich am besten mit dem "Arbeits-Objekt" ohne Rundungsfehler.
                  Das respektiert keinerlei Filter etc., die ggf. im Modul angelegt sind. Es ist ein reines PHP Objekt.
                  http://www.premium-contao-themes.com

                  Kommentar


                  • #10
                    Also im Modul ist nur der Umkreisfilter hinterlegt..
                    Zuletzt geändert von EBL; 18.07.2022, 13:24.

                    Kommentar


                    • #11
                      Zitat von EBL Beitrag anzeigen
                      Also im Modul ist nur der Umkreisfilter hinterlegt..
                      Das ist für findByModule irrelevant. Siehe Post: https://forum.premium-contao-themes....5339#post25339

                      findByModule kann als reines Reflektions-Objekt genutzt werden um öffentliche Methoden auszuführen.
                      http://www.premium-contao-themes.com

                      Kommentar


                      • #12
                        Okay, mir bleibt allerdings das Problem, dass keine Ergebnisse gefunden werden. Bin mit meinem Know-How hier am Ende

                        Kommentar


                        • #13
                          Mit $objCC = $this->CustomCatalog; läuft es nun soweit. Das einzige Problem: Wenn die Umkreissuche kein Ergebnis findet, kommt eine Fehlermeldung:

                          An exception occurred while executing 'SELECT cc_....* FROM cc_... WHERE kategorie= 1 AND cc_....publish='1' ORDER BY FIELD(id,)': SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax;
                          Könnte das an dem " ORDER BY FIELD(id,)" liegen? Wenn ich
                          PHP-Code:
                          // nach ID Feld sortieren:
                          $objCC->addSorting('FIELD(id,'.implode(',',$arrIds).')' );
                          ?> 
                          aus dem code entferne kommt der Fehler nicht mehr.

                          Hast du eine Idee wie man das lösen könnte?

                          Kommentar


                          • #14
                            Hast du eine Idee wie man das lösen könnte?
                            einfach eine if Abfrage herum, ob $arrIds gefüllt ist

                            Code:
                            if( !empty($arrIds) )
                            {
                            ...
                            }
                            http://www.premium-contao-themes.com

                            Kommentar


                            • #15
                              Läuft! Vielen Dank für den Support!

                              Kommentar

                              Lädt...
                              X