Ausgabe verschiedener Einträge mit gleicher PLZ

View: New views
7 Messages — Rating Filter:   Alert me  

Ausgabe verschiedener Einträge mit gleicher PLZ

by MBecker :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hallo zusammen,
 
ich arbeite erstmals mit opengeo und stehe vor einem "kleinen" Problem.
Die Abfrage diverser Objekte funktioniert soweit gut, allerdings gibt es Probleme, wenn zu einer PLZ mehr als ein Objekt existiert.
Ich habe mir die Codes angesehen (bin zwar kein Code-Profi, aber mehr als Grundlagenwissen denke ich schon vorweisen zu können), aber ich kann dort nichts finden, was die Treffer für eine PLZ auf "LIMIT 1" stellen könnte.
Leider ist diese Info sehr allgemein gehalten, aber vielleicht hat ja jemand einen Tipp für mich oder kennt diese Problematik.
 
Vielen Dank schon mal für eure Hilfe.
 
Gruß,
Martin Becker

--
Mailingliste OpenGeoDB
Listenadresse: opengeodb@...
Informationen: http://opengeodb.de
Mit freundlicher Unterstütztung von php::bar (http://phpbar.de)

Re: Ausgabe verschiedener Einträge mit gleicher PLZ

by Martin Trautmann :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message



Die Frage wurde schon dutzende Male gestellt. Schau mal in die Archive und fuege es gegebenenfalls dem Wiki hinzu.

Schoenen Gruss
Martin

Re: Ausgabe verschiedener Einträge mit gleicher PLZ

by MBecker :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Martin Trautmann wrote:
Die Frage wurde schon dutzende Male gestellt. Schau mal in die Archive und fuege es gegebenenfalls dem Wiki hinzu.

Schoenen Gruss
Martin

Hallo Martin,

natürlich habe ich in den Archiven nachgesehen (bereits vor meinem ersten Posting). Leider ist die Darstellung der Archive etwas "unübersichtlich", eventuell habe ich da eine mögliche Antwort übersehen.

Ich werde die Archive (bzw. das Forum mittels Suchfunktion) nochmals durchforsten, falls jemand in der Zwischenzeit die Lösung bzw. Hinweise zur Lösung des Problems gefunden hat wäre es super, diese hier zu posten.

Gruß,
Martin

Re: Ausgabe verschiedener Einträge mit gleicher PLZ

by Martin Trautmann :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

MBecker wrote:

> natürlich habe ich in den Archiven nachgesehen (bereits vor meinem ersten
> Posting). Leider ist die Darstellung etwas "unübersichtlich", eventuell habe
> ich da eine mögliche Antwort übersehen. Eine Suchfunktion wäre wirklich
> hilfreich.

Hallo Martin,

wo hast du denn nachgesehen? Google kennt die Archive und durchsucht sie
auch.

Auch http://www.nabble.com/Php-German---opengeodb-f13171.html bietet
eine Suchfunktion.

> Ich werde die Archive nochmals durchforsten, falls jemand in der
> Zwischenzeit die Lösung bzw. Hinweise zur Lösung des Problems gefunden hat
> wäre es super, diese hier zu posten.

Schon alleine die letzten Beiträge drehten sich immer wieder um dieses
Thema. Du willst etwas mit SQL umsetzen, wo du das Problem vielleicht
verkennst - denn bist du sicher, dass dir der ERSTE Eintrag helfen würde
und der richtige wäre?

Ein Ort -> mehrere PLZ
eine PLZ -> mehrere Orte

Typischerweise lautet die Antwort auf deine Frage "PLZ.tab" - vielleicht
ist es das, nach dem du suchen solltest.

Schönen Gruß
Martin
--
Mailingliste OpenGeoDB
Listenadresse: opengeodb@...
Informationen: http://opengeodb.de
Mit freundlicher Unterstütztung von php::bar (http://phpbar.de)

Re: Ausgabe verschiedener Einträge mit gleicher PLZ

by MBecker :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Es geht mir nicht um möglich Relationen zwischen PLZ und Ort sondern um die Begrenzung der gefundenen Treffer.

Beispiel:
Bei PLZ 12345 -> Anzeige: Niederlassung A

Obwohl zu dieser PLZ aber mehr Niederlassungen existieren, wird nur diese eine angezeigt.

Sprich in der DB stehen
PLZ      | Ort    | Niederlassung
-----------------------------
12345     Ort 1    A
12345     Ort 1    B
23456     Ort 2    C


Der Rest funktioniert ja so wie er soll, nur die Begrenzung auf nur "einen" Treffer finde ich nicht.


Gruß,
Martin

Re: Ausgabe verschiedener Einträge mit gleicher PLZ

by Peter Wendorff :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Ach so - Du willst also gar nicht auf 1 eingrenzen, sondern im
Gegenteil, die Begrenzung aufheben, von der Du nicht weißt, woher sie
kommt...
Das war in deinen vorigen Mails nicht so besonders deutlich - Du
schriebst nur:

"Ich habe mir die Codes angesehen (bin zwar kein Code-Profi, aber mehr
als Grundlagenwissen denke ich schon vorweisen zu können), aber ich kann
dort nichts finden, was die Treffer für eine PLZ auf "LIMIT 1" stellen
könnte."

Das kann man nunmal in beide Richtungen interpretieren.

Das Problem dabei ist nur: ich habe keine Ahnung, mit was für Code du
arbeitest.
Sprichst Du vielleicht nicht (nur) von der opengeodb, sondern von der
GeoClassPHP?
Die nutzt die openGeoDB zwar als Datengrundlage, ist aber nicht die
opengeodb ;)

Wenn Du selbst geschriebenen SQL-Code nutzt, wovon Martin vermutlich
ausgeht, dann ist es ziemlich blöd, ins Blaue hineinzuraten.
Wenn Du die GeoClassPHP benutzt, melde Dich nochmal - da ich die nicht
selbst benutze und es insofern nicht im Kopf habe, hab ich grade keine
Lust, auf Verdacht in deren Code zu gucken.

Gruß
jongleur
(Peter Wendorff)


MBecker schrieb:

> Es geht mir nicht um möglich Relationen zwischen PLZ und Ort sondern um die
> Begrenzung der gefundenen Treffer.
>
> Beispiel:
> Bei PLZ 12345 -> Anzeige: Niederlassung A
>
> Obwohl zu dieser PLZ aber mehr Niederlassungen existieren, wird nur diese
> eine angezeigt.
>
> Sprich in der DB stehen
> PLZ      | Ort    | Niederlassung
> -----------------------------
> 12345     Ort 1    A
> 12345     Ort 1    B
> 23456     Ort 2    C
>
>
> Der Rest funktioniert ja so wie er soll, nur die Begrenzung auf nur "einen"
> Treffer finde ich nicht.
>
>
> Gruß,
> Martin
>  

--
Mailingliste OpenGeoDB
Listenadresse: opengeodb@...
Informationen: http://opengeodb.de
Mit freundlicher Unterstütztung von php::bar (http://phpbar.de)

Re: Ausgabe verschiedener Einträge mit gleicher PLZ

by MBecker :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hallo Peter,

es wird die GeoClass Version 0.3.1a benutzt, wobei ich denke das der Inhalt der Geo.php eher für die Koordinatenberechnung der Objekte zuständig ist.

Inhalt der Seracher.php (denke dort muss es irgendwo sein, kann´s aber nicht finden)

Class Searcher {
        /**
         * An array of Dealer objects.
         *
         * @var array of Dealer objects
         */
        var $Dealers;
        /**
         * GeoObject representing the customer location.
         *
         * @var Geo_Object
         */
        var $customerLocationGeoObject;
        /**
         * The Geodb object, it´s used for the geodb->findGeoObject() method.
         *
         * @var Geodb
         */
        var $geodb;
        /**
         * Is true if the search rendered multiple locations,
         * but (AND) nothing is selected in the lid1 select field.
         * @var boolean
         */
        var $noUniqueMatches = false;

        /**
         * is true if the search rendered no matches
         *
         * @var boolean
         */
        var $noMatchesFound = false;

        /**
         * Constructor. Opens a db connection and retrieves all the Dealers
         * from the db and stores them in the $Dealers array.
         *
         * @return Searcher
         */
        function Searcher() {
                $this->geodb = Utilities :: getGeodbObject();
                $this->_retrieveDealersFromDb();
        }

        /**
         * Is used in the constructor to build the dealer objects from the db.
         * Is private, dont use in public context. May change soon.
         *
         */
        function _retrieveDealersFromDb() { // mod
                // This query now retrieves all the columns required later in the script
                $query = "SELECT *
                FROM ".DEALERS_TABLENAME." "; # LIMIT 2
                # echo "<br>Query in retrieveDealersFromDb: <br>$query <br>";
                $rs = mysql_query ($query) or die(mysql_error());
                while ($r = mysql_fetch_assoc($rs)) {
                        // Pass the query result array to the Dealer class constructor
                        $this->Dealers[$r['id']] = new Dealer($r);
                }
        }

        /**
         * Creates a Geo_Object for the customer location.
         * Returns true if one or more locations match the user input,
         * false if there are no matches.
         *
         * Also sets the variables
         * $this->noUniqueMatches and
         * $this->noMatchesFound.
         *
         * @param string $CostumerLocationName City name or PLZ for the customers location
         * @return boolean matches found
         */
        function setcustomerLocation($customerLocationName) {
                // takes a string as argument representing any type that
                // the geoclass can search for (eg a Ortsname or PLZ)
                if ($customerLocationName == '') {
                        // if form has been submitted empty
                        exit ('<p>Bitte geben Sie etwas in das Formularfeld ein.<p>');
                }

                $possibleLocations = $this->geodb->findGeoObject('%'.$customerLocationName.'%');

                if (count($possibleLocations)) {
                        // if any matches have been found (unique OR mutliple)

                        $sel_field = '<select name="lid1" onchange="javascript:document.getElementById(\'formSent\').click();">';
                        if (sizeof($possibleLocations) > 1) {
                                // if the input matches to more than one geographic location
                                // the different location names are stored
                                // in the sel_field html select field.
                                $sel_field .= '<option value="">- bitte auswählen -</option>';

                                if ($_GET['lid1'] == '') {
                                        // if nothing had been selected from the multiple matches
                                        $this->noUniqueMatches = true;
                                }

                        } else {
                                // only one match found
                                $obj1 = $possibleLocations[0];
                        }

                        foreach ($possibleLocations AS $obj) {
                                if ($_GET['lid1'] == $obj->databaseValues['loc_id']) {
                                        $obj1 = $obj;
                                        $sel = 'SELECTED';
                                        $one_matched = true;
                                } else {
                                        $sel = '';
                                }

                                $sel_field .= '<option value="'.$obj->databaseValues['loc_id'].'" '.$sel.'>'.utf8_encode($obj->name).'</option>'."\n";
                        }

                        if ((!$one_matched) && (sizeof($possibleLocations) > 1)) {
                                $this->noUniqueMatches = true;

                        }
                        $sel_field .= "</select>\n";
                } else {
                        // if no matches are found
                        echo "<p>Ein solcher Ort konnte nicht gefunden werden</p>";
                        $sel_field .= "- keine Treffer - ";
                        $this->noMatchesFound = true;
                        return false;
                }
                echo $sel_field;
                $this->customerLocationGeoObject = $obj1;

                return true;
        }

        /**
         * Finds the nearest dealers around the costumerLocationObject
         *
         * @param int $number_of_results Number of results to be returned.
         * @return sorted Array of Dealer objects.
         */
        function getNearestDealers($number_of_results = 5) {
                        // finds the nearest dealers around the the
                        // customerLocationGeoObject.

                        // Build a Geo_Object from the location entered by the user.


                $i = 0;
                $distances = array();

                foreach ($this->Dealers as $number => $dealer) {

                        $geoObject = $dealer->getGeo_Object();
                        if (! is_object($geoObject)) echo "<br> Error: Geo_Object not loaded!<br>";
                        $dist = round($geoObject->getDistance($this->customerLocationGeoObject, GEO_UNIT_KM), 2);
                        $distances["$dist"] = $dealer;
                        unset ($dist);
                }

                ksort($distances, SORT_NUMERIC);

                $counter = 0;
                foreach ($distances as $k => $v) {
                        if ($counter < $number_of_results) {
                                $temp[$k] = $v;
                        }
                        $counter ++;
                }
                unset ($counter);
                $distances = $temp;

                foreach ($distances as $num => $item) {
                        $item->setDistance($num);
                        $temp[$num] = $item;
                }
                $distances = $temp;

                if (!($this->noUniqueMatches or $this->noMatchesFound)) {
                        return $distances;
                }
                elseif ($this->mutlipleChoices) {
                        $distances = array (0 => "multiple matches found");
                        return $distances;
                }
                elseif ($this->noMatchesFound) {
                        $distances = array (0 => "no matches found");
                        return $distances;
                }
        }

        /**
         * NOT IN USE ANY MORE // DEPRECATED USE
         *
         * @param string $header_dist
         * @param string $header_dealer
         * @return unknown
         */
        function getHtmlTableWithNeaerstDealers($header_dist = 'dist', $header_dealer = 'Dealer') {
                $distances = $this->getNearestDealers();

                if (!($this->noUniqueMatches or $this->noMatchesFound)) {
                        $html = "<table><tr><th></th>
                                                                <th>$header_dist</th><th>$header_dealer</th></tr>\n";
                        foreach ($distances as $dist => $dealer) {
                                # echo "<br>Variable dealer (in getHtmlTabe...):<br><pre>".print_r($dealer)."</pre>";

                                $html .= "<tr>";
                                $graph = '$dist km';
                                $html .= "<td class=\"graph\">$graph</td>\n";
                                $html .= "<td class=\"dist\">".str_replace('.', ',', $dist)." km</td>\n";
                                $DbValues = $dealer->getDbValues();
                                $name = $DbValues['firma'];
                                $loc = $DbValues['ort'];
                                $plz = $DbValues['plz'];
                                $html .= "<td class=\"dealer\">$name ($plz $loc)</td>\n";
                                $html .= "</tr>\n";
                        }

                        // only return table if no multiple choices are given
                        return $html.'</table>DEPRECATED // DONT USE THIS FUNCTION';
                }
                elseif ($this->mutlipleChoices) {
                        return '<p>multiple matches, please choose!<p>';
                }
                elseif ($this->noMatchesFound) {
                        return '<p>no matches found, please try again</p>';
                }
        }

        /**
         * Returns an array with all the Dealer objects from the database.
         * Dealer ids are the array keys.
         *
         * @return array of Dealer objects.
         */
        function getDealersArray () {
                return $this->Dealers;
        }

        /**
         * Returns the Dealer objects with the matching id.
         *
         * @param int $id
         * @return Dealer object
         */
        function getDealer ($id) {
                $d = $this->Dealers[$id];
                if (is_object($d)) {
                        return $d;
                } else {
                        return "no such Dealer with id $id";
                }
        }
        /**
         * Returns the Geo_Object that represents the costumers location.
         *
         * @return Geo_Object
         */
        function getcustomerLocationGeoObject () {
                return $this->customerLocationGeoObject;
        }
}


Gruß,
Martin