Forum: PC-Programmierung LOGIKPROBLEM: PLZ-Umkreisfunktion


von Alfred S. (hood)


Lesenswert?

Hallo zusammen!

Ich habe hier eine Datenbank mit Postleitzahlen und deren 
GEO-Koordinaten.
Nun muss ich eine Kundenanfrage aus einer bestimmten PLZ mit 
hinterlegten Firmenkunden und deren Postleitzahlen abgleichen (also 
welche Firma diese Anfrage bedienen kann). Die Firmen haben allerdings 
von der Firmensitz-PLZ einen variabel eingeschränkten 
Betätigungsfeldradius (als Kilometer-Angabe) hinterlegt, von dem aus sie 
arbeiten (z.b. 50km).


Es gibt folgendes Problem zu lösen:

Nun müsste sich eine Schnittmenge von Firmen ergeben, die Aufgrund ihrer 
Eingrenzung zu dieser Anfrage passen.
Ich bekomme es allerdings nicht hin von Seiten der Anfrage die passenden 
Firmen aufgrund ihrer hinterlegten Umkreise zuzuteilen. Zudem muss das 
ganze Ressourcenschonend sein, ohne etliche Datenbankabfragen 
loszutreten.

Hat jemand Vorschläge? Vielen Dank!

von Peter II (Gast)


Lesenswert?

Alfred Schleier schrieb:
> Hallo zusammen!
> Ich bekomme es allerdings nicht hin von Seiten der Anfrage die passenden
> Firmen aufgrund ihrer hinterlegten Umkreise zuzuteilen. Zudem muss das
> ganze Ressourcenschonend sein, ohne etliche Datenbankabfragen
> loszutreten.
>
> Hat jemand Vorschläge? Vielen Dank!

ich verstehe das Problem nicht ganz. Es geht dir also nur um den Abstand 
von 2 GEO-Koordinaten?

von Karl H. (kbuchegg)


Lesenswert?

Kannst du den Spiess nicht umdrehen und für jede Firma anlegen, welche 
PLZ sie bedienen kann?

Wenn du zu viele Firmen hast, dann kann das natürlich immer noch 
saulangsam werden. Ich seh da aber ehrlich gesagt nicht viele andere 
Möglichkeiten, als eine Hilfsstruktur wie zb einen Quadtree basierend 
auf den Koordinaten aufzubauen, der die Firmenauswahl schon mal auf sehr 
hohem Niveau in kleinere Einheiten aufteilt. Wenn die erste Ebene des 
Quadtree aus dem gesamten Bundesgebiet schon mal 3/4 aufgrund der 
Koordinaten ausschliesst, dann ist das schon mal eine ganze Menge.

von Alfred S. (hood)


Lesenswert?

aus Sicht der Firma sehr einfach: Match laufen lassen, was die PLZ 
abgleicht.

Problem: Aus Sicht der Anfrage gibt es keinen vordefinierten Umkreis und 
ich kann die Firmen nicht zuordnen ohne eine Flut von Abfragen 
auszulösen.

von Luther B. (luther-blissett)


Lesenswert?

Was für ein RDBMS ist es denn? Ziemlich viele haben inzwischen räumliche 
Erweiterungen, damit ist dann trivial diese Anfragen schnell zu 
beantworten.

Ansonsten könnte man das Gebiet mit einem Gitter (z.B. 10km) überziehen. 
Für jede Firma berechnest du im voraus, welche Gitterkästchen sich mit 
ihrem Tätigkeitsbereich überscheiden. Dann fragst du ab, welche Firmen 
in dem Kästchen arbeiten in dem der Kunde sitzt und machst dann noch 
eine Abstandsberechnung. Das passt alles in eine WHERE Klausel.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Einfach nur aus der PLZ selbst dürfte sich so etwas algorithmisch kaum 
ableiten lassen - man betrachte Berlin, da berühren sich beispielsweise 
10825, 10715, 12161 und 14197 - und das gilt alles noch als Innenstadt 
(Wilmersdorf und Schöneberg).

Die "Systematik" bei der Vergabe der Postleitzahlen dürfte auch 
andernorts vergleichbar wirr sein.

Mit dem Thema hat man sich im Rahmen der OpenGeoDB beschäftigt:
http://opengeodb.org/wiki/OpenGeoDB_-_Umkreissuche

von Reinhard Kern (Gast)


Lesenswert?

> Die "Systematik" bei der Vergabe der Postleitzahlen dürfte auch
> andernorts vergleichbar wirr sein.

Macht ja nix. Man legt einmal für jede Partnerfirma eine Liste der PLZ 
an, die sie bedienen kann (wenn sie das selber macht oder überarbeitet, 
kann die sogar beliebige Form haben), und damit ist man schon fertig. 
Prüfen ob die Anfrage-PLZ in der Liste vorkommt, wird man ja noch gerade 
so hinkriegen.

Aber warum einfach, wenn man höhere Geometrie dazu ins Spiel bringen 
kann.

Gruss Reinhard

von Karl H. (kbuchegg)


Lesenswert?

Reinhard Kern schrieb:

> Aber warum einfach ...

Hängt vom Mengengerüst ab.
Hast du 500-tausend Firmen und suchst du jene, in deren Einzugsbereich 
eine bestimmte PLZ vorkommt, so dauert das dann schon ein Weilchen, die 
möglichen Kandidaten zu finden.

Bei 50 oder 100 Firmen spielt das hingegen kaum eine große Rolle.

von Udo S. (urschmitt)


Lesenswert?

Du machst 2 Indices einer für den Breiten und einer für den Längengrad. 
Dann sortierst du alle die aus, die vom Breiten ODER Längegrad schon zu 
weit weg sind. Übrig bleiben die Firmen innerhalb eines Quadrat mit 
Kantenlänge 2*Radius um deinen Standort.
Die holst du dir und berechnest den tatsächlichen Abstand, sortierst das 
Ergebnis und nimmst den Nächsten.

von Reinhard Kern (Gast)


Lesenswert?

Karl Heinz schrieb:
> Bei 50 oder 100 Firmen spielt das hingegen kaum eine große Rolle.

Vor allem bietet das Verfahren die volle Freiheit, es gibt da draussen 
alle möglichen Verträge: Kunden im Umkreis von x km, Kunden im 
Bundesland Y, Kunden im PLZ-Bereich Z, Kunden im schwäbischen 
Sprachraum...

Wer das Geschäft mit Handelsvertretungen kennt, weiss was ich meine.

Gruss Reinhard

von Reinhard Kern (Gast)


Lesenswert?

Nachtrag:

Benutzt man Mengen, so benötigt man 12,5 kB Speicherplatz pro 
Partnerfirma. Das sollte bei heutiger Speicherausstattung nicht das 
Problem sein. Wer hat schon 500000 Partnerfirmen?

Gruss Reinhard

von A. B. (funky)


Lesenswert?

wie kommst du auf 12,5kB?
Und das mit der Partnerfirma kam ja nicht vom Threadersteller. Für ne 
Deutschlandweite DB können da sicherlich paar (hundert)tausende Einträge 
zusammenkommen

von Joe (Gast)


Lesenswert?

Eigentlich einfach:

Aus den Postleitzahltabelle die zu zugehörigen geografischen Koordinaten 
raussuchen.

einfache Version:

Die Differenzen der geografischen Koordinaten werden nach Pythagoras 
quadriert, addiert und dann daraus die Wurzel gezogen.
Multipliziert man das Ergebnis mit 111km, so erhält man grob die 
Entfernung zwischen den Orten.

Mittlerer Version:

Weil oben das Zusammenlaufen der Längengrade nicht berücksichtigt wurde, 
ist vor dem Quadrieren die Differenz der Längengrade mit cos(Mittelwert 
der Längengrade) zu multiplizieren. Dann weiter wie oben.

Anspruchsvollere Version:

Anwendung der Seitenkosinussatzes, das ist Mathematik.
Siehe: http://www.kompf.de/gps/distcalc.html

Joe

von Karl H. (kbuchegg)


Lesenswert?

Joe schrieb:

> einfache Version:
>
> Die Differenzen der geografischen Koordinaten werden nach Pythagoras
> quadriert, addiert und dann daraus die Wurzel gezogen.
> Multipliziert man das Ergebnis mit 111km, so erhält man grob die
> Entfernung zwischen den Orten.


Die EDV Version.
Man zieht nicht die Wurzel sondern hat bereits die Quadrate zu 
Vergleichszwecken abgespeichert.

sqrt(a) < sqrt(b)  genau dann, wenn a < b

Genau genommen, wenn fabs(a) < fabs(b). Aber so dämlich wird ja wohl 
doch keiner sein, negative Entfernungen einzugeben.

der Rest:
uninteressant. Wenn eine Firma einen Kunden ablehnt, weil der 500Meter 
ausserhalb des Einzugsbereichs wohnt, dann lebt die nicht lange. Zudem 
ist mit der PLZ ja keine bestimmte Position verknüpft, sondern ein 
Mittelwert des PLZ-Gebietes. Genauer als dieses braucht man daher nicht 
rechnen.

ALl das löst aber nicht das Problem, dass bei "Wer liefert was?" im dt. 
Bundesgebiet 500-tausend Firmen abgelegt sind, die man ein wenig 
cleverer durchsuchen sollte als einfach nur linear einen nach dem 
anderen. Das Problem ist nicht ein geometrisches Problem sondern ein 
algorithmisches bzw. eines der Datenstrukturen.

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Reinhard Kern schrieb:
> Macht ja nix. Man legt einmal für jede Partnerfirma eine Liste der PLZ
> an, die sie bedienen kann (wenn sie das selber macht oder überarbeitet,
> kann die sogar beliebige Form haben), und damit ist man schon fertig.

Aha. Weißt Du, wieviele Postleitzahlen alleine Berlin hat?

von Karl H. (kbuchegg)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Reinhard Kern schrieb:
>> Macht ja nix. Man legt einmal für jede Partnerfirma eine Liste der PLZ
>> an, die sie bedienen kann (wenn sie das selber macht oder überarbeitet,
>> kann die sogar beliebige Form haben), und damit ist man schon fertig.
>
> Aha. Weißt Du, wieviele Postleitzahlen alleine Berlin hat?

Macht nix.
Das kann ja der Rechner machen. Ackert der halt mal eine Nacht durch, 
anstatt Tee zu trinken und Viren zu scannen.
Er hat ja eine PLZ Tabelle, aus der er die geografischen Daten ermitteln 
kann.

Aber so recht finde ich die daraus resultierende Suche nicht sonderlich 
elegant. Sortierung nach einer Koordinate und Einteilung der Firmen in 
die  jeweilige Bins gefällt mir schon besser. Aus der Benutzer-PLZ 
kriegt man die Koordinate. Daraus wiederrum erhält man den zuständigen 
Bin und in diesem Bin gibt es eine LIste aller Firmen, die diesen Bin 
zumindest potentiell bedienen. Über diese nun kleinere Anzahl an 
Kandidaten noch ein geometrischer Vergleich und den besten davon finden.
Das sollte eigentlich recht schnell gehen.

von Tom K. (ez81)


Lesenswert?

Ein dictionary/hashmap/Datenbanktabelle/wasauchimmer, das zu jeder 
Kunden-PLZ (es gibt nur ~29000) eine Liste der möglichen Firmen liefert, 
muss nur einmal berechnet und lediglich beim Eintrag einer neuen Firma 
(das sollte viel seltener vorkommen als eine Abfrage) ergänzt werden.

: Bearbeitet durch User
von Reinhard Kern (Gast)


Lesenswert?

A. B. schrieb:
> wie kommst du auf 12,5kB?

Eine Menge wird durch ein Bit pro Element dargestellt, alle deutschen 
PLZ ergeben also in Mengendarstellung 100 kBit = 12,5 kByte. Um 
festzustellen, ob Firma X im PLZ-Gebiet Y aktiv ist, stellt die 
"in"-Funktion fest, ob das Ynte Bit gesetzt ist.

> Und das mit der Partnerfirma kam ja nicht vom Threadersteller.

Doch habe ich so verstanden:

Alfred Schleier schrieb:
> Nun muss ich eine Kundenanfrage aus einer bestimmten PLZ mit
> hinterlegten Firmenkunden und deren Postleitzahlen abgleichen

Das heisst meinem Verständnis nach, er hat eine Anzahl Vertragspartner 
(Firmenkunden), die jeweils ein bestimmtest Gebiet bedienen, und nun 
muss er bei einer Anfrage anhand der PLZ rausfinden, wer davon in Frage 
kommt.

Lohnt sich aber nicht weiter zu diskutieren, wurde ja schon allgemein 
als unbrauchbar abgelehnt.

Gruss Reinhard

von Webmex (Gast)


Lesenswert?

Da das Problem ja mit der Anfrage an sich zusammenhängt geht wohl nur 
eine Referenzlösung.

Ich kann nicht abfragen was ich zum Abfragezeitpunkt nicht weiss.

von dsd (Gast)


Lesenswert?

Ich werf da einfach mal ein:

Das alles bringt nichts, da die km Umkreis nicht der Fahrlänge 
entspricht.

Wenn man das vernachlässigen kann ist das Problem recht einfach zu 
lösen:
du suchst ob eine Adresse innerhalb eines Kreises mit Radius x km um die 
Adresse einer Firma liegt.

Die Laufzeit ist linear mit Anzahl der Firmen. Du musst nur bei anlegen 
einer neuen Firma die Koordinaten ermitteln und den Radius eintragen. 
Dann filterst du deine Firmen mit ermittelten Koordinaten des Kunden mit 
dem Ansatz hier.

if( (x_kreis - x_P)*(x_kreis - x_P) + (y_kreis - y_P)*(y_kreis - y_P) < 
radius*radius ) {
// dann ist der Punkt strikt innerhalb (nicht auf dem Rand)
...
}

Ich weiß allerdings nicht ob das als when clause auch geht.
Das ganze dann noch als minimum oder top 10

die Koordinaten kannst du mit
https://developers.google.com/maps/documentation/geocoding/?hl=de
erhalten

von Seano L. (Gast)


Lesenswert?

Alfred Schleier schrieb:
> GEO-Koordinaten.
> Nun muss ich eine Kundenanfrage aus einer bestimmten PLZ mit
> hinterlegten Firmenkunden und deren Postleitzahlen abgleichen (also
> welche Firma diese Anfrage bedienen kann). Die Firmen haben allerdings
> von der Firmensitz-PLZ einen variabel eingeschränkten
> Betätigungsfeldradius (als Kilometer-Angabe) hinterlegt, von dem aus sie
> arbeiten (z.b. 50km).
Und genau deshalb sind deine Geokoordinaten wertlos weil keiner 
Luftlinie zum Kunden fliegt sondern nur die Entfernung per Strasse 
entscheidend ist.

Du musst deine GEO-Koordinaten in Entfernungsangaben umrechnen, damit du 
sowas wie einen Routenplaner hast oder besser du nutzt gleich einen 
entsprechenden wie z.B. von google maps, da gibts nat. ne API. Damit 
hast du dann gleich auch noch Einbahnstrassen,... aktuelle 
Verkehrslage,... mit erschlagen und das ist dann auch exakt und nicht so 
Pi-Mal-Daumen geschätzt wie mit dem Koordinatenmist, das macht doch 
heute kein Mensch mehr so.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.