Hat wer ne Lösung für verknüpfte Postleitzahlen? (Baum/Wurzel Struktur)

Hallo, ich möchte alle Postleitzahlen in Deutschland ähnlich wie in Form einer Baumstruktur speichern. D.h. eine Postleitzahl grenzt an 4 Verschiedene andere, dann sollen die 4 über die momentane PLZ aufrufbar sein zB. durch getNachbarn().

Hat wer ne Idee wie ich die 15.000 PLZ die es in Deutschland gibt, nicht per hat aneinander ketten muss? das wären locker 100.000 PLZ, da eine schon schell 7 Nachbarn hat. Beste grüße.
 

Robert Zenz

Top Contributor
Ja am besten einen bereits fertigen Datensatz dafuer verwenden, oder eben einen Datensatz der alle Postleitzahlen enthaelt von dem du ableiten kannst welche aneinander grenzen.

Ich bilde mir ein ich haette so einen Datensatz schonmal gesehen, kann dir aber nicht mehr sagen ob das auf OpenStreetMap war, oder auf irgendeiner Seite von der Bundesregierung die die Daten zur Verfuegung gestellt hat.
 

LimDul

Top Contributor

Ist halt auf openstreet map basierend. Enthält, soweit ich das sehe, geodaten, so dass man die Informationen vermutlich daraus ermitteln kann
 

mihe7

Top Contributor
Im Prinzip hast Du halt einen Graphen, dessen Knoten die PLZ-Bereiche angeben, wobei benachbarte PLZ-Bereiche mit einer Kante verbunden sind.

Wenn Du nur die PLZ brauchst, kannst Du das relativ kompakt speichern. Eine Datei enthält nur die Kanten - geordnet nach Knoten. Das ist nichts anderes als eine Liste mit PLZ (int - 4 Byte je PLZ). Die andere Datei enthält nur einen Index der PLZ mit der Info, wo in der Kantendatei die Kantenliste (= Nachbarn) der PLZ zu finden sind. Done.

Mit den Daten, die @LimDul verlinkt hat, sollte es funktionieren, die Dateien automatisiert aufzubauen, da dort die Polygone der PLZ-Gebiete angegeben sind.

Damit lässt sich definieren: zwei PLZ-Gebiete sind benachbart, wenn
a) sich die beiden Polygone schneiden
b) ein Polygon in dem anderen enthalten ist.

zu a) zwei Polygone "schneiden" sich auch, wenn sich zwei Kanten in einem Punkt berühren. zu b) dann reicht es, wenn ein beliebiger Eckpunkt eines Polygons sich im Inneren des anderen Polygons befindet.

Das halbwegs effizient zu implementieren, ist allerdings nicht trivial. Letztlich wird es auf einen Sweep hinauslaufen.
 

mihe7

Top Contributor
So, hab das mal mit der Liste von @LimDul, einer Lib (JTS) und naivem Ansatz gemacht (quadratische Laufzeit). Dauer akzeptabel (15 s). Ergebnis im Anhang. Die Textdatei enthält zwei Spalten: PLZ;Nachbarn (Semikolon als Trenner), wobei Nachbarn eine durch Kommas getrennte Liste der Nachbar-PLZs ist. Ob's stimmt? Keine Ahnung, ich habs nicht überprüft.
 

Anhänge

  • plznachbarn.zip
    81,2 KB · Aufrufe: 0

lonLat

Mitglied
Hallo @Karl_Der_Nette_Anfänger .


Ist halt auf openstreet map basierend. Enthält, soweit ich das sehe, geodaten, so dass man die Informationen vermutlich daraus ermitteln kann

Gehe mal auf obige Seite und lade dir unter "Export" "CSV Whole dataset" herunter.

Dann kannst du folgenden Code verwenden, um zu jeder PLZ alle Nachbarn, die nicht weiter als 30 km entfernt sind, und die Richtung, in der sie liegen, zu bestimmen:

Java:
package org.example;

import java.awt.geom.Point2D;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class PLZNachbar {
    record Et(String PLZ, String kreisCode, String landName, String landCode, String kreisName, Point2D.Double geoPoint) {
    }

    record Nachbar(Et nachbar, double distance, int bearing) {
    }

    record Nachbarn(Et entry, List<Nachbar> nachbarn) {
    }

    public static void main(String[] args) throws IOException {
        ArrayList<Et> list = new ArrayList<>();
        String filename = "georef-germany-postleitzahl.csv";
        try (BufferedReader r = new BufferedReader(new FileReader(filename))) {
            r.readLine();
            String line;
            while ((line = r.readLine()) != null) {
                String[] split = line.split(";");
                String[] split2 = split[9].split(", ");
                list.add(new Et(split[4], split[5], split[6], split[7], split[8], new Point2D.Double(Double.parseDouble(split2[0]), Double.parseDouble(split2[1]))));
            }
        }

        ArrayList<Nachbarn> list2 = new ArrayList<>();
        for (Et e1 : list) {
            ArrayList<Nachbar> nachbarn = new ArrayList<>();
            for (Et e2 : list) {
                if (e1 != e2) {
                    final double lat1 = e1.geoPoint.getX();
                    final double lat2 = e2.geoPoint.getX();
                    final double lon1 = e1.geoPoint.getY();
                    final double lon2 = e2.geoPoint.getY();

                    double R = 6371000; // metres
                    double φ1 = lat1 * Math.PI / 180.0; // φ, λ in radians
                    double φ2 = lat2 * Math.PI / 180.0;
                    double Δφ = (lat2 - lat1) * Math.PI / 180.0;
                    double Δλ = (lon2 - lon1) * Math.PI / 180.0;
                    double a = Math.sin(Δφ / 2.0) * Math.sin(Δφ / 2.0) + Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ / 2) * Math.sin(Δλ / 2);
                    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
                    double d = R * c; // in metres

                    if (d <= 30000) {
                        double y = Math.sin(lat2 - lat1) * Math.cos(lon2);
                        double x = Math.cos(lon1) * Math.sin(lon2) - Math.sin(lon1) * Math.cos(lon2) * Math.cos(lat2 - lat1);
                        double brng = (Math.atan2(y, x) * 180.0 / Math.PI + 360.0) % 360.0; // in degrees

                        nachbarn.add(new Nachbar(e2, d, (int) Math.round(brng)));
                    }
                }
            }
            list2.add(new Nachbarn(e1, nachbarn));
        }

        for (int i = 0; i < 10; i++) {
            System.out.println(list2.get(i));
        }
    }
}

Dauert bei mir ca. eine Sekunde.

Hier noch zum Beispiel eine Ausgabe von der Stadt Hagen:

Code:
Nachbarn[entry=Et[PLZ=58099, kreisCode=05914, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Hagen, geoPoint=Point2D.Double[51.4002031332, 7.487857752]], nachbarn=[Nachbar[nachbar=Et[PLZ=44534, kreisCode=05978, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Unna, geoPoint=Point2D.Double[51.6314934273, 7.51267420753]], distance=25775.572046892634, bearing=67], Nachbar[nachbar=Et[PLZ=44267, kreisCode=05913, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Dortmund, geoPoint=Point2D.Double[51.4579490964, 7.52426319952]], distance=6899.287352523574, bearing=27], Nachbar[nachbar=Et[PLZ=58099, kreisCode=05914, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Hagen, geoPoint=Point2D.Double[51.37133519, 7.53261950409]], distance=4466.800925201296, bearing=349], Nachbar[nachbar=Et[PLZ=45529, kreisCode=05954, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Ennepe-Ruhr-Kreis, geoPoint=Point2D.Double[51.3693308667, 7.16259137038]], distance=22831.50177866904, bearing=184], Nachbar[nachbar=Et[PLZ=44791, kreisCode=05911, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Bochum, geoPoint=Point2D.Double[51.49006103, 7.25106288088]], distance=19213.2243707587, bearing=168], Nachbar[nachbar=Et[PLZ=42899, kreisCode=05120, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Remscheid, geoPoint=Point2D.Double[51.2089697534, 7.23447635144]], distance=27612.069010173043, bearing=205], Nachbar[nachbar=Et[PLZ=59425, kreisCode=05978, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Unna, geoPoint=Point2D.Double[51.5246235968, 7.64805754952]], distance=17736.288146732797, bearing=9], Nachbar[nachbar=Et[PLZ=44227, kreisCode=05913, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Dortmund, geoPoint=Point2D.Double[51.4656134176, 7.42157902565]], distance=8602.96832384947, bearing=157], Nachbar[nachbar=Et[PLZ=44866, kreisCode=05911, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Bochum, geoPoint=Point2D.Double[51.4858312644, 7.14100141565]], distance=25856.45661927669, bearing=171], Nachbar[nachbar=Et[PLZ=44625, kreisCode=05916, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Herne, geoPoint=Point2D.Double[51.5277412676, 7.21408728647]], distance=23681.351362553778, bearing=164], Nachbar[nachbar=Et[PLZ=44789, kreisCode=05911, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Bochum, geoPoint=Point2D.Double[51.4690022614, 7.22110862261]], distance=20010.999308431037, bearing=171], Nachbar[nachbar=Et[PLZ=44579, kreisCode=05562, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Recklinghausen, geoPoint=Point2D.Double[51.5758909596, 7.28904193216]], distance=23898.408312182877, bearing=154], Nachbar[nachbar=Et[PLZ=58762, kreisCode=05962, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Märkischer Kreis, geoPoint=Point2D.Double[51.2846807992, 7.68837531783]], distance=18947.067507946114, bearing=355], Nachbar[nachbar=Et[PLZ=59425, kreisCode=05978, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Unna, geoPoint=Point2D.Double[51.5533827819, 7.69804881495]], distance=22405.795123131447, bearing=6], Nachbar[nachbar=Et[PLZ=44137, kreisCode=05913, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Dortmund, geoPoint=Point2D.Double[51.508204533, 7.44878217958]], distance=12310.640355547197, bearing=131], Nachbar[nachbar=Et[PLZ=58706, kreisCode=05962, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Märkischer Kreis, geoPoint=Point2D.Double[51.4317093859, 7.79321657763]], distance=21463.85749551462, bearing=0], Nachbar[nachbar=Et[PLZ=45307, kreisCode=05113, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Essen, geoPoint=Point2D.Double[51.4641088843, 7.0860544212]], distance=28746.48305591407, bearing=174], Nachbar[nachbar=Et[PLZ=44807, kreisCode=05911, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Bochum, geoPoint=Point2D.Double[51.5090745462, 7.22809525075]], distance=21691.21783195134, bearing=166], Nachbar[nachbar=Et[PLZ=44799, kreisCode=05911, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Bochum, geoPoint=Point2D.Double[51.4533539784, 7.23411522734]], distance=18558.576706374573, bearing=173], Nachbar[nachbar=Et[PLZ=44799, kreisCode=05911, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Bochum, geoPoint=Point2D.Double[51.4443842557, 7.25636488638]], distance=16786.315172080158, bearing=174], Nachbar[nachbar=Et[PLZ=58300, kreisCode=05954, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Ennepe-Ruhr-Kreis, geoPoint=Point2D.Double[51.3777453717, 7.35368272786]], distance=9639.345596148936, bearing=185], Nachbar[nachbar=Et[PLZ=58513, kreisCode=05962, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Märkischer Kreis, geoPoint=Point2D.Double[51.234177316, 7.66307630467]], distance=22115.671178072887, bearing=350], Nachbar[nachbar=Et[PLZ=58708, kreisCode=05962, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Märkischer Kreis, geoPoint=Point2D.Double[51.4413830092, 7.80210644649]], distance=22266.12396800461, bearing=0], Nachbar[nachbar=Et[PLZ=44309, kreisCode=05913, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Dortmund, geoPoint=Point2D.Double[51.5270638632, 7.55606818137]], distance=14876.67567581528, bearing=28], Nachbar[nachbar=Et[PLZ=45277, kreisCode=05113, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Essen, geoPoint=Point2D.Double[51.4258596796, 7.07735477633]], distance=28611.94511035713, bearing=177], Nachbar[nachbar=Et[PLZ=45888, kreisCode=05513, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Gelsenkirchen, geoPoint=Point2D.Double[51.5163571165, 7.11922599007]], distance=28620.204596841144, bearing=168], Nachbar[nachbar=Et[PLZ=44795, kreisCode=05911, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Bochum, geoPoint=Point2D.Double[51.4514197434, 7.1971465118]], distance=20945.00665739139, bearing=174], Nachbar[nachbar=Et[PLZ=58511, kreisCode=05962, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Märkischer Kreis, geoPoint=Point2D.Double[51.2172736322, 7.6494440714]], distance=23235.870686557206, bearing=347], Nachbar[nachbar=Et[PLZ=58553, kreisCode=05962, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Märkischer Kreis, geoPoint=Point2D.Double[51.1886181087, 7.4953801788]], distance=23532.994708966882, bearing=281], Nachbar[nachbar=Et[PLZ=58095, kreisCode=05914, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Hagen, geoPoint=Point2D.Double[51.3575795245, 7.47593524775]], distance=4811.220862239494, bearing=234], Nachbar[nachbar=Et[PLZ=44328, kreisCode=05913, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Dortmund, geoPoint=Point2D.Double[51.5482482484, 7.53558289651]], distance=16790.438389405255, bearing=42], Nachbar[nachbar=Et[PLZ=58119, kreisCode=05914, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Hagen, geoPoint=Point2D.Double[51.3514731089, 7.56824278183]], distance=7777.568320655502, bearing=350], Nachbar[nachbar=Et[PLZ=45289, kreisCode=05113, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Essen, geoPoint=Point2D.Double[51.4199429294, 7.11366529022]], distance=26045.479737230075, bearing=178], Nachbar[nachbar=Et[PLZ=42109, kreisCode=05124, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Wuppertal, geoPoint=Point2D.Double[51.2766469377, 7.14820371497]], distance=27302.79500311431, bearing=194], Nachbar[nachbar=Et[PLZ=44652, kreisCode=05916, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Herne, geoPoint=Point2D.Double[51.5259436767, 7.17463584791]], distance=25813.368244963265, bearing=165], Nachbar[nachbar=Et[PLZ=45663, kreisCode=05562, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Recklinghausen, geoPoint=Point2D.Double[51.5796597319, 7.23357041767]], distance=26611.091809379286, bearing=157], Nachbar[nachbar=Et[PLZ=44805, kreisCode=05911, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Bochum, geoPoint=Point2D.Double[51.5120290258, 7.27808836328]], distance=19127.51453318931, bearing=163], Nachbar[nachbar=Et[PLZ=58507, kreisCode=05962, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Märkischer Kreis, geoPoint=Point2D.Double[51.2306300589, 7.62561979081]], distance=21147.27509722515, bearing=345], Nachbar[nachbar=Et[PLZ=58730, kreisCode=05978, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Unna, geoPoint=Point2D.Double[51.493046718, 7.76066199645]], distance=21540.79513086168, bearing=2], Nachbar[nachbar=Et[PLZ=58091, kreisCode=05914, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Hagen, geoPoint=Point2D.Double[51.3115091847, 7.51837301809]], distance=10087.381410958973, bearing=317], Nachbar[nachbar=Et[PLZ=44145, kreisCode=05913, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Dortmund, geoPoint=Point2D.Double[51.5326714739, 7.48353610535]], distance=14732.84924918467, bearing=92], Nachbar[nachbar=Et[PLZ=44269, kreisCode=05913, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Dortmund, geoPoint=Point2D.Double[51.4866531431, 7.52850537916]], distance=10017.09715649061, bearing=33], Nachbar[nachbar=Et[PLZ=44869, kreisCode=05911, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Bochum, geoPoint=Point2D.Double[51.452942194, 7.15728592019]], distance=23657.517553572805, bearing=174], Nachbar[nachbar=Et[PLZ=58097, kreisCode=05914, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Hagen, geoPoint=Point2D.Double[51.3719066216, 7.47970881473]], distance=3196.839507189392, bearing=232], Nachbar[nachbar=Et[PLZ=58095, kreisCode=05914, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Hagen, geoPoint=Point2D.Double[51.3649483394, 7.49705837717]], distance=3971.813874367507, bearing=307], Nachbar[nachbar=Et[PLZ=44319, kreisCode=05913, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Dortmund, geoPoint=Point2D.Double[51.5371651354, 7.59897258005]], distance=17063.8840793781, bearing=17], Nachbar[nachbar=Et[PLZ=58642, kreisCode=05962, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Märkischer Kreis, geoPoint=Point2D.Double[51.3703280942, 7.61948785094]], distance=9719.717585252574, bearing=357], Nachbar[nachbar=Et[PLZ=44359, kreisCode=05913, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Dortmund, geoPoint=Point2D.Double[51.5713787042, 7.39765664666]], distance=20032.38257526473, bearing=138], Nachbar[nachbar=Et[PLZ=44357, kreisCode=05913, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Dortmund, geoPoint=Point2D.Double[51.5530518983, 7.36664590928]], distance=18956.108080734095, bearing=148], Nachbar[nachbar=Et[PLZ=58515, kreisCode=05962, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Märkischer Kreis, geoPoint=Point2D.Double[51.1965367341, 7.62922347809]], distance=24687.508932220895, bearing=343], Nachbar[nachbar=Et[PLZ=45259, kreisCode=05113, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Essen, geoPoint=Point2D.Double[51.4055758524, 7.06225685786]], distance=29529.027144501688, bearing=179], Nachbar[nachbar=Et[PLZ=58769, kreisCode=05962, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Märkischer Kreis, geoPoint=Point2D.Double[51.3123376407, 7.6175624081]], distance=13288.105230196308, bearing=351], Nachbar[nachbar=Et[PLZ=58640, kreisCode=05962, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Märkischer Kreis, geoPoint=Point2D.Double[51.4296612035, 7.67457669095]], distance=13356.756138450086, bearing=2], Nachbar[nachbar=Et[PLZ=59423, kreisCode=05978, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Unna, geoPoint=Point2D.Double[51.5303574159, 7.69343479727]], distance=20304.136274756722, bearing=6], Nachbar[nachbar=Et[PLZ=44536, kreisCode=05978, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Unna, geoPoint=Point2D.Double[51.6022214941, 7.46590571748]], distance=22514.74917725043, bearing=101], Nachbar[nachbar=Et[PLZ=44339, kreisCode=05913, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Dortmund, geoPoint=Point2D.Double[51.5660053861, 7.46686116887]], distance=18493.610377265053, bearing=105], Nachbar[nachbar=Et[PLZ=44289, kreisCode=05913, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Dortmund, geoPoint=Point2D.Double[51.4863854396, 7.58955591301]], distance=11895.954695627735, bearing=12], Nachbar[nachbar=Et[PLZ=58509, kreisCode=05962, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Märkischer Kreis, geoPoint=Point2D.Double[51.2197506193, 7.60531165802]], distance=21662.689646200306, bearing=340], Nachbar[nachbar=Et[PLZ=44229, kreisCode=05913, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Dortmund, geoPoint=Point2D.Double[51.4553278463, 7.46131958419]], distance=6399.770666739458, bearing=141], Nachbar[nachbar=Et[PLZ=58285, kreisCode=05954, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Ennepe-Ruhr-Kreis, geoPoint=Point2D.Double[51.3335458067, 7.34020766277]], distance=12649.281018893505, bearing=193], Nachbar[nachbar=Et[PLZ=58453, kreisCode=05954, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Ennepe-Ruhr-Kreis, geoPoint=Point2D.Double[51.4302087416, 7.37145951003]], distance=8734.482480880195, bearing=173], Nachbar[nachbar=Et[PLZ=44879, kreisCode=05911, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Bochum, geoPoint=Point2D.Double[51.4299493213, 7.15822267201]], distance=23098.018680670437, bearing=177], Nachbar[nachbar=Et[PLZ=44867, kreisCode=05911, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Bochum, geoPoint=Point2D.Double[51.4461740853, 7.14959059679]], distance=24005.001353196723, bearing=175], Nachbar[nachbar=Et[PLZ=59439, kreisCode=05978, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Unna, geoPoint=Point2D.Double[51.4888110224, 7.63156360943]], distance=14009.568875822419, bearing=8], Nachbar[nachbar=Et[PLZ=58675, kreisCode=05962, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Märkischer Kreis, geoPoint=Point2D.Double[51.3680870791, 7.77736184687]], distance=20405.417831711406, bearing=360], Nachbar[nachbar=Et[PLZ=44797, kreisCode=05911, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Bochum, geoPoint=Point2D.Double[51.4271560073, 7.22651954595]], distance=18370.308338603096, bearing=176], Nachbar[nachbar=Et[PLZ=44623, kreisCode=05916, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Herne, geoPoint=Point2D.Double[51.5385136806, 7.22420229264]], distance=23875.698712052363, bearing=162], Nachbar[nachbar=Et[PLZ=44287, kreisCode=05913, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Dortmund, geoPoint=Point2D.Double[51.4908182571, 7.56057440669]], distance=11265.92662698846, bearing=20], Nachbar[nachbar=Et[PLZ=44388, kreisCode=05913, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Dortmund, geoPoint=Point2D.Double[51.5067576004, 7.33466388819]], distance=15907.859391769414, bearing=161], Nachbar[nachbar=Et[PLZ=42275, kreisCode=05124, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Wuppertal, geoPoint=Point2D.Double[51.2738223834, 7.20523583185]], distance=24144.17959693584, bearing=196], Nachbar[nachbar=Et[PLZ=44581, kreisCode=05562, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Recklinghausen, geoPoint=Point2D.Double[51.5991738785, 7.32459299649]], distance=24843.805222206207, bearing=147], Nachbar[nachbar=Et[PLZ=44577, kreisCode=05562, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Recklinghausen, geoPoint=Point2D.Double[51.6077686298, 7.32704663805]], distance=25623.876606124137, bearing=145], Nachbar[nachbar=Et[PLZ=42555, kreisCode=05158, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Mettmann, geoPoint=Point2D.Double[51.3546699863, 7.1220594684]], distance=25888.653539702045, bearing=185], Nachbar[nachbar=Et[PLZ=45527, kreisCode=05954, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Ennepe-Ruhr-Kreis, geoPoint=Point2D.Double[51.379902787, 7.21690463476]], distance=18935.728138327857, bearing=183], Nachbar[nachbar=Et[PLZ=58089, kreisCode=05914, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Hagen, geoPoint=Point2D.Double[51.3776233849, 7.43543093498]], distance=4420.160202067815, bearing=190], Nachbar[nachbar=Et[PLZ=42369, kreisCode=05124, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Wuppertal, geoPoint=Point2D.Double[51.2275026232, 7.19874306807]], distance=27794.77497729195, bearing=201], Nachbar[nachbar=Et[PLZ=42289, kreisCode=05124, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Wuppertal, geoPoint=Point2D.Double[51.2641815218, 7.22024412242]], distance=23967.51055745573, bearing=197], Nachbar[nachbar=Et[PLZ=44787, kreisCode=05911, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Bochum, geoPoint=Point2D.Double[51.4820607368, 7.21713184341]], distance=20855.094648445665, bearing=170], Nachbar[nachbar=Et[PLZ=44623, kreisCode=05916, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Herne, geoPoint=Point2D.Double[51.5321974295, 7.23659277315]], distance=22767.743572928142, bearing=163], Nachbar[nachbar=Et[PLZ=58089, kreisCode=05914, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Hagen, geoPoint=Point2D.Double[51.3906260574, 7.46869047411]], distance=1703.6593227035387, bearing=191], Nachbar[nachbar=Et[PLZ=58454, kreisCode=05954, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Ennepe-Ruhr-Kreis, geoPoint=Point2D.Double[51.4577049083, 7.38051468872]], distance=9811.426214074972, bearing=166], Nachbar[nachbar=Et[PLZ=45279, kreisCode=05113, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Essen, geoPoint=Point2D.Double[51.4429498185, 7.10750233239]], distance=26798.531264394922, bearing=176], Nachbar[nachbar=Et[PLZ=45886, kreisCode=05513, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Gelsenkirchen, geoPoint=Point2D.Double[51.4976370306, 7.11952980435]], distance=27728.533509689005, bearing=170], Nachbar[nachbar=Et[PLZ=42283, kreisCode=05124, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Wuppertal, geoPoint=Point2D.Double[51.2725810318, 7.1823576525]], distance=25530.046582448183, bearing=195], Nachbar[nachbar=Et[PLZ=44135, kreisCode=05913, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Dortmund, geoPoint=Point2D.Double[51.513228172, 7.47543695478]], distance=12597.241129561038, bearing=104], Nachbar[nachbar=Et[PLZ=59427, kreisCode=05978, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Unna, geoPoint=Point2D.Double[51.5341461134, 7.74556642471]], distance=23248.69320202269, bearing=3], Nachbar[nachbar=Et[PLZ=58802, kreisCode=05962, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Märkischer Kreis, geoPoint=Point2D.Double[51.3351272223, 7.86088098899]], distance=26887.7164954332, bearing=0], Nachbar[nachbar=Et[PLZ=44225, kreisCode=05913, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Dortmund, geoPoint=Point2D.Double[51.4777129724, 7.44992911207]], distance=9010.737687618132, bearing=140], Nachbar[nachbar=Et[PLZ=58579, kreisCode=05962, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Märkischer Kreis, geoPoint=Point2D.Double[51.2568528383, 7.55873585094]], distance=16683.230072937753, bearing=331], Nachbar[nachbar=Et[PLZ=44894, kreisCode=05911, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Bochum, geoPoint=Point2D.Double[51.4874773541, 7.30953603708]], distance=15713.497560956574, bearing=166], Nachbar[nachbar=Et[PLZ=58313, kreisCode=05954, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Ennepe-Ruhr-Kreis, geoPoint=Point2D.Double[51.4130739969, 7.4174754498]], distance=5087.328411601333, bearing=176], Nachbar[nachbar=Et[PLZ=45276, kreisCode=05113, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Essen, geoPoint=Point2D.Double[51.4481439188, 7.07537257736]], distance=29092.41839491932, bearing=175], Nachbar[nachbar=Et[PLZ=42279, kreisCode=05124, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Wuppertal, geoPoint=Point2D.Double[51.299451589, 7.23742190351]], distance=20688.199590787583, bearing=193], Nachbar[nachbar=Et[PLZ=42897, kreisCode=05120, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Remscheid, geoPoint=Point2D.Double[51.1783229005, 7.27140031253]], distance=28901.21771056497, bearing=211], Nachbar[nachbar=Et[PLZ=45731, kreisCode=05562, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Recklinghausen, geoPoint=Point2D.Double[51.6232007254, 7.399422039]], distance=25540.273619574495, bearing=129], Nachbar[nachbar=Et[PLZ=44867, kreisCode=05911, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Bochum, geoPoint=Point2D.Double[51.4659551516, 7.13636121738]], distance=25439.694863940014, bearing=173], Nachbar[nachbar=Et[PLZ=44653, kreisCode=05916, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Herne, geoPoint=Point2D.Double[51.5457178713, 7.16442632475]], distance=27633.80112237365, bearing=164], Nachbar[nachbar=Et[PLZ=42285, kreisCode=05124, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Wuppertal, geoPoint=Point2D.Double[51.256991111, 7.17478205346]], distance=26958.559012868045, bearing=197], Nachbar[nachbar=Et[PLZ=42477, kreisCode=05374, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Oberbergischer Kreis, geoPoint=Point2D.Double[51.211844293, 7.36012844166]], distance=22748.877003824924, bearing=217], Nachbar[nachbar=Et[PLZ=58452, kreisCode=05954, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Ennepe-Ruhr-Kreis, geoPoint=Point2D.Double[51.4225403132, 7.32768871178]], distance=11382.811626564117, bearing=176], Nachbar[nachbar=Et[PLZ=45884, kreisCode=05513, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Gelsenkirchen, geoPoint=Point2D.Double[51.4917852043, 7.08530567261]], distance=29698.317645864718, bearing=171], Nachbar[nachbar=Et[PLZ=44649, kreisCode=05916, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Herne, geoPoint=Point2D.Double[51.5331619126, 7.15073354547]], distance=27639.369327245015, bearing=165], Nachbar[nachbar=Et[PLZ=42281, kreisCode=05124, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Wuppertal, geoPoint=Point2D.Double[51.2870998208, 7.18959165716]], distance=24235.42938138285, bearing=193], Nachbar[nachbar=Et[PLZ=44629, kreisCode=05916, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Herne, geoPoint=Point2D.Double[51.550231536, 7.20966897801]], distance=25485.51220676427, bearing=162], Nachbar[nachbar=Et[PLZ=59174, kreisCode=05978, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Unna, geoPoint=Point2D.Double[51.5821462135, 7.66605330321]], distance=23696.08059131518, bearing=11], Nachbar[nachbar=Et[PLZ=58638, kreisCode=05962, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Märkischer Kreis, geoPoint=Point2D.Double[51.3841432629, 7.67658732134]], distance=13216.035072503579, bearing=359], Nachbar[nachbar=Et[PLZ=59199, kreisCode=05978, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Unna, geoPoint=Point2D.Double[51.5958314586, 7.7699051154]], distance=29229.837014616245, bearing=3], Nachbar[nachbar=Et[PLZ=58809, kreisCode=05962, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Märkischer Kreis, geoPoint=Point2D.Double[51.2781566123, 7.83062126446]], distance=27405.81924558236, bearing=360], Nachbar[nachbar=Et[PLZ=45257, kreisCode=05113, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Essen, geoPoint=Point2D.Double[51.3854650077, 7.08563093368]], distance=27955.78956462346, bearing=181], Nachbar[nachbar=Et[PLZ=58710, kreisCode=05962, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Märkischer Kreis, geoPoint=Point2D.Double[51.4113167235, 7.82958556099]], distance=23735.610076939152, bearing=0], Nachbar[nachbar=Et[PLZ=58093, kreisCode=05914, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Hagen, geoPoint=Point2D.Double[51.3745547338, 7.5276999376]], distance=3972.0692070170526, bearing=348], Nachbar[nachbar=Et[PLZ=44329, kreisCode=05913, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Dortmund, geoPoint=Point2D.Double[51.5691751106, 7.53874518744]], distance=19116.379378085654, bearing=43], Nachbar[nachbar=Et[PLZ=58566, kreisCode=05962, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Märkischer Kreis, geoPoint=Point2D.Double[51.1418049571, 7.57971509126]], distance=29434.604991476903, bearing=325], Nachbar[nachbar=Et[PLZ=42103, kreisCode=05124, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Wuppertal, geoPoint=Point2D.Double[51.2551177322, 7.14569051616]], distance=28731.287327311507, bearing=196], Nachbar[nachbar=Et[PLZ=44651, kreisCode=05916, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Herne, geoPoint=Point2D.Double[51.5133282829, 7.16195205506]], distance=25847.974938134146, bearing=167], Nachbar[nachbar=Et[PLZ=44793, kreisCode=05911, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Bochum, geoPoint=Point2D.Double[51.4839529262, 7.18174427205]], distance=23170.05081318499, bearing=170], Nachbar[nachbar=Et[PLZ=44809, kreisCode=05911, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Bochum, geoPoint=Point2D.Double[51.4992714615, 7.19807396874]], distance=22904.121520799094, bearing=168], Nachbar[nachbar=Et[PLZ=42277, kreisCode=05124, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Wuppertal, geoPoint=Point2D.Double[51.2826739545, 7.2220997193]], distance=22617.553473897682, bearing=195], Nachbar[nachbar=Et[PLZ=44801, kreisCode=05911, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Bochum, geoPoint=Point2D.Double[51.4475101836, 7.26821261909]], distance=16112.199090580614, bearing=173], Nachbar[nachbar=Et[PLZ=58332, kreisCode=05954, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Ennepe-Ruhr-Kreis, geoPoint=Point2D.Double[51.2841754676, 7.28976810867]], distance=18861.892758295846, bearing=198], Nachbar[nachbar=Et[PLZ=44149, kreisCode=05913, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Dortmund, geoPoint=Point2D.Double[51.4996458681, 7.39635767701]], distance=12746.47025111859, bearing=154], Nachbar[nachbar=Et[PLZ=44263, kreisCode=05913, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Dortmund, geoPoint=Point2D.Double[51.4883515107, 7.49882402622]], distance=9831.074025272508, bearing=68], Nachbar[nachbar=Et[PLZ=42111, kreisCode=05124, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Wuppertal, geoPoint=Point2D.Double[51.2949570795, 7.14050582712]], distance=26812.88253488541, bearing=192], Nachbar[nachbar=Et[PLZ=42119, kreisCode=05124, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Wuppertal, geoPoint=Point2D.Double[51.2435333644, 7.15711693422]], distance=28839.579789300955, bearing=198], Nachbar[nachbar=Et[PLZ=42287, kreisCode=05124, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Wuppertal, geoPoint=Point2D.Double[51.2481132827, 7.22353555706]], distance=24966.94952779719, bearing=199], Nachbar[nachbar=Et[PLZ=58256, kreisCode=05954, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Ennepe-Ruhr-Kreis, geoPoint=Point2D.Double[51.2828219103, 7.36583957541]], distance=15562.573118723618, bearing=205], Nachbar[nachbar=Et[PLZ=45661, kreisCode=05562, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Recklinghausen, geoPoint=Point2D.Double[51.5702019165, 7.19200554693]], distance=27874.43486747065, bearing=160], Nachbar[nachbar=Et[PLZ=44532, kreisCode=05978, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Unna, geoPoint=Point2D.Double[51.5975006915, 7.54058206224]], distance=22239.99597162305, bearing=46], Nachbar[nachbar=Et[PLZ=59192, kreisCode=05978, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Unna, geoPoint=Point2D.Double[51.6230624372, 7.63070865361]], distance=26679.865305010553, bearing=18], Nachbar[nachbar=Et[PLZ=58791, kreisCode=05962, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Märkischer Kreis, geoPoint=Point2D.Double[51.253156107, 7.74551445477]], distance=24245.87674146967, bearing=356], Nachbar[nachbar=Et[PLZ=44892, kreisCode=05911, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Bochum, geoPoint=Point2D.Double[51.4680769388, 7.31999903332]], distance=13869.31528328681, bearing=168], Nachbar[nachbar=Et[PLZ=44379, kreisCode=05913, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Dortmund, geoPoint=Point2D.Double[51.5124672923, 7.37455122984]], distance=14746.62238455194, bearing=155], Nachbar[nachbar=Et[PLZ=44141, kreisCode=05913, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Dortmund, geoPoint=Point2D.Double[51.5040564811, 7.49985243998]], distance=11577.83717737624, bearing=69], Nachbar[nachbar=Et[PLZ=45879, kreisCode=05513, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Gelsenkirchen, geoPoint=Point2D.Double[51.505960846, 7.09506949706]], distance=29648.801478483874, bearing=169], Nachbar[nachbar=Et[PLZ=42107, kreisCode=05124, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Wuppertal, geoPoint=Point2D.Double[51.2637066349, 7.15569353545]], distance=27621.004743870086, bearing=195], Nachbar[nachbar=Et[PLZ=44628, kreisCode=05916, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Herne, geoPoint=Point2D.Double[51.5572271631, 7.24418136915]], distance=24282.39427696485, bearing=159], Nachbar[nachbar=Et[PLZ=44803, kreisCode=05911, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Bochum, geoPoint=Point2D.Double[51.4716835236, 7.26038583372]], distance=17657.830851033952, bearing=170], Nachbar[nachbar=Et[PLZ=44139, kreisCode=05913, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Dortmund, geoPoint=Point2D.Double[51.4971776748, 7.46266673743]], distance=10923.470226490002, bearing=122], Nachbar[nachbar=Et[PLZ=58093, kreisCode=05914, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Hagen, geoPoint=Point2D.Double[51.3669050541, 7.4953115389]], distance=3738.53580754567, bearing=303], Nachbar[nachbar=Et[PLZ=42105, kreisCode=05124, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Wuppertal, geoPoint=Point2D.Double[51.2621700713, 7.13897775104]], distance=28689.79667914874, bearing=195], Nachbar[nachbar=Et[PLZ=44801, kreisCode=05911, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Bochum, geoPoint=Point2D.Double[51.4471266711, 7.2281876116]], distance=18745.356558841442, bearing=174], Nachbar[nachbar=Et[PLZ=58455, kreisCode=05954, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Ennepe-Ruhr-Kreis, geoPoint=Point2D.Double[51.4441082294, 7.31539462054]], distance=12916.516145779879, bearing=173], Nachbar[nachbar=Et[PLZ=58339, kreisCode=05954, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Ennepe-Ruhr-Kreis, geoPoint=Point2D.Double[51.2669203394, 7.45297281053]], distance=15017.223808852888, bearing=239], Nachbar[nachbar=Et[PLZ=44623, kreisCode=05916, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Herne, geoPoint=Point2D.Double[51.546635118, 7.21588780618]], distance=24898.706349638644, bearing=162], Nachbar[nachbar=Et[PLZ=44627, kreisCode=05916, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Herne, geoPoint=Point2D.Double[51.5375305885, 7.26852683962]], distance=21540.41446106795, bearing=160], Nachbar[nachbar=Et[PLZ=42399, kreisCode=05124, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Wuppertal, geoPoint=Point2D.Double[51.2323910718, 7.27745085592]], distance=23707.0431389126, bearing=204], Nachbar[nachbar=Et[PLZ=44577, kreisCode=05562, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Recklinghausen, geoPoint=Point2D.Double[51.5485154408, 7.33677766939]], distance=19531.02824216471, bearing=153], Nachbar[nachbar=Et[PLZ=44143, kreisCode=05913, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Dortmund, geoPoint=Point2D.Double[51.5175029885, 7.51653759915]], distance=13193.63439042119, bearing=52], Nachbar[nachbar=Et[PLZ=58239, kreisCode=05978, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Unna, geoPoint=Point2D.Double[51.4301623729, 7.57661713433]], distance=6999.037284953882, bearing=5], Nachbar[nachbar=Et[PLZ=44265, kreisCode=05913, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Dortmund, geoPoint=Point2D.Double[51.4424432897, 7.49073247883]], distance=4701.11899238232, bearing=78], Nachbar[nachbar=Et[PLZ=42389, kreisCode=05124, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Wuppertal, geoPoint=Point2D.Double[51.2715564983, 7.25297236639]], distance=21699.865959797746, bearing=198], Nachbar[nachbar=Et[PLZ=58456, kreisCode=05954, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Ennepe-Ruhr-Kreis, geoPoint=Point2D.Double[51.4006061126, 7.28244532744]], distance=14249.860976261887, bearing=180], Nachbar[nachbar=Et[PLZ=44575, kreisCode=05562, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Recklinghausen, geoPoint=Point2D.Double[51.5482881733, 7.30890614858]], distance=20609.52856349809, bearing=156], Nachbar[nachbar=Et[PLZ=44577, kreisCode=05562, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Recklinghausen, geoPoint=Point2D.Double[51.599877451, 7.29850775759]], distance=25782.791876326635, bearing=150], Nachbar[nachbar=Et[PLZ=44369, kreisCode=05913, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Dortmund, geoPoint=Point2D.Double[51.5348757717, 7.40492646114]], distance=16038.9757900414, bearing=144], Nachbar[nachbar=Et[PLZ=45549, kreisCode=05954, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Ennepe-Ruhr-Kreis, geoPoint=Point2D.Double[51.3380044893, 7.25411981807]], distance=17638.371403729714, bearing=189], Nachbar[nachbar=Et[PLZ=45665, kreisCode=05562, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Recklinghausen, geoPoint=Point2D.Double[51.6092558086, 7.24895870349]], distance=28526.507390433046, bearing=152], Nachbar[nachbar=Et[PLZ=44147, kreisCode=05913, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Dortmund, geoPoint=Point2D.Double[51.5280482482, 7.44121565558]], distance=14578.309034886293, bearing=130], Nachbar[nachbar=Et[PLZ=58636, kreisCode=05962, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Märkischer Kreis, geoPoint=Point2D.Double[51.3842995542, 7.71644110592]], distance=15958.304118155474, bearing=359], Nachbar[nachbar=Et[PLZ=42553, kreisCode=05158, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Mettmann, geoPoint=Point2D.Double[51.3163279723, 7.1040903612]], distance=28232.048658105112, bearing=189], Nachbar[nachbar=Et[PLZ=58739, kreisCode=05974, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Soest, geoPoint=Point2D.Double[51.4961354711, 7.86931768096]], distance=28505.927470800776, bearing=360], Nachbar[nachbar=Et[PLZ=45525, kreisCode=05954, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Ennepe-Ruhr-Kreis, geoPoint=Point2D.Double[51.3960939177, 7.18236571771]], distance=21198.436029002747, bearing=180], Nachbar[nachbar=Et[PLZ=58644, kreisCode=05962, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Märkischer Kreis, geoPoint=Point2D.Double[51.344751391, 7.68511523376]], distance=15016.701960695003, bearing=357], Nachbar[nachbar=Et[PLZ=58135, kreisCode=05914, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreisfreie Stadt Hagen, geoPoint=Point2D.Double[51.3376856391, 7.42178721362]], distance=8328.37158296973, bearing=202]]]

Hab auch auf Maps nachgesehen, die Ausgabe stimmt.
 

lonLat

Mitglied
Oh, ich hatte bei der direction Latitude und Longitude verwechselt. 😅 Hat gar keiner gemerkt ...

Korrektur:

Java:
double y = Math.sin(lon2 - lon1) * Math.cos(lat2);
double x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(lon2 - lon1);
double brng = (Math.atan2(y, x) * 180.0 / Math.PI + 360.0) % 360.0; // in degrees

nachbarn.add(new Nachbar(e2, d, (int) Math.round(brng)));

Zu 58099 (Hagen) ist zum Beispiel Nachbar[nachbar=Et[PLZ=58300, kreisCode=05954, landName=Nordrhein-Westfalen, landCode=05, kreisName=Kreis Ennepe-Ruhr-Kreis, geoPoint=Point2D.Double[51.3777453717, 7.35368272786]], distance=9639.345596148936, bearing=252] ein Nachbar, wie man hier sehen kann:

1690759813117.png

Die reine Luftlinie ist selbstverständlich etwas kürzer als der Fußgängerweg.
 

lonLat

Mitglied
So, habe mir kurz noch einmal Gedanken dazu gemacht. Es kann natürlich sein, wenn man nur nach der Zentrum-Entfernung geht, dass zu viele oder zu wenige Nachbarn gefunden werden.

Deshalb sollte man auch prüfen, ob sich zwei Polygone berühren. Hier noch einmal in schön:

Java:
package org.example;

import java.awt.geom.Point2D;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PLZNachbar {
    record Entry(List<Double> geometry, String PLZ, String kreisCode, String landName, String landCode, String kreisName, Point2D.Double geoPoint) {
    }

    record Nachbar(Entry nachbar, double distance, int bearing) {
    }

    record Nachbarn(Entry entry, List<Nachbar> nachbarn) {
    }

    public static double haversine(Entry e1, Entry e2) {
        final double lat1 = e1.geoPoint.getX();
        final double lat2 = e2.geoPoint.getX();
        final double lon1 = e1.geoPoint.getY();
        final double lon2 = e2.geoPoint.getY();

        double R = 6371000; // metres
        double φ1 = lat1 * Math.PI / 180.0; // φ, λ in radians
        double φ2 = lat2 * Math.PI / 180.0;
        double Δφ = (lat2 - lat1) * Math.PI / 180.0;
        double Δλ = (lon2 - lon1) * Math.PI / 180.0;
        double a = Math.sin(Δφ / 2.0) * Math.sin(Δφ / 2.0) + Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ / 2) * Math.sin(Δλ / 2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
        double d = R * c; // in metres

        return d;
    }

    public static double bearing(Entry e1, Entry e2) {
        final double lat1 = e1.geoPoint.getX();
        final double lat2 = e2.geoPoint.getX();
        final double lon1 = e1.geoPoint.getY();
        final double lon2 = e2.geoPoint.getY();

        double y = Math.sin(lon2 - lon1) * Math.cos(lat2);
        double x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(lon2 - lon1);
        double brng = (Math.atan2(y, x) * 180.0 / Math.PI + 360.0) % 360.0; // in degrees

        return brng;
    }

    public static boolean areNeighbours(Entry e1, Entry e2) {
        for (Double d1 : e1.geometry()) {
            for (Double d2 : e2.geometry()) {
                if (Math.abs(d1 - d2) < 1e-6) {
                    return true;
                }
            }
        }
        return false;
    }

    public static void main(String[] args) throws IOException {
        ArrayList<Entry> list = new ArrayList<>();
        String filename = "georef-germany-postleitzahl.csv";
        try (BufferedReader r = new BufferedReader(new FileReader(filename))) {
            r.readLine();
            String line;
            while ((line = r.readLine()) != null) {
                String[] split = line.split(";");
                String[] split2 = split[9].split(", ");
                Pattern compile = Pattern.compile("(\\d+\\.\\d+), (\\d+\\.\\d+)");
                ArrayList<Double> geometry = new ArrayList<>();
                Matcher mat = compile.matcher(split[3]);
                while (mat.find()) {
                    double d1 = Double.parseDouble(mat.group(1));
                    double d2 = Double.parseDouble(mat.group(2));
                    d1 = 1.0 / Math.sqrt(d1 * d1 + d2 * d2) * d1;
                    d2 = 1.0 / Math.sqrt(d1 * d1 + d2 * d2) * d2;
                    double omn = -1.0 / (d2 / d1);
                    geometry.add(omn);
                }
                list.add(new Entry(geometry, split[4], split[5], split[6], split[7], split[8], new Point2D.Double(Double.parseDouble(split2[0]), Double.parseDouble(split2[1]))));
            }
        }

        ArrayList<Nachbarn> list2 = new ArrayList<>();
        for (Entry e1 : list) {
            ArrayList<Nachbar> nachbarn = new ArrayList<>();
            for (Entry e2 : list) {
                if (e1 != e2) {
                    double h = haversine(e1, e2);
                    if (h <= 25000 && areNeighbours(e1, e2)) {
                        nachbarn.add(new Nachbar(e2, h, (int) Math.round(bearing(e1, e2))));
                    }
                }
            }
            list2.add(new Nachbarn(e1, nachbarn));
        }

        for (int i = 0; i < 10; i++) {
            Nachbarn nachbar = list2.get(i);
            System.out.print(nachbar.entry().PLZ() + " (" + nachbar.entry().kreisName() + ") -> ");
            for (Nachbar n : nachbar.nachbarn()) {
                System.out.print(n.nachbar().PLZ() + "(" + n.nachbar().kreisName() + "),");
            }
            System.out.println();
        }
    }
}

Jetzt bin ich auch bei mihe7s 15 Sekunden ...

Selbstverständlich ist 1e-6 ein magischer Wert, der ohne Begründung dort nicht stehen dürfte.
 

mihe7

Top Contributor
Deshalb sollte man auch prüfen, ob sich zwei Polygone berühren.
Oder enthalten sind wie z. B. 30669 / 30855...

Ich habe einfach jedes Polygon mit jedem anderen Polygon auf disjoint geprüft. Zunächst dachte ich daran, einen Sweep über alle Kanten zu machen. Das ist aber recht aufwendig. Tatsächlich müsste man die Laufzeit aber bereits erheblich verbessern können, indem man mit einem Sweep zunächst die Bounding Boxes und dann die betreffenden Polygone prüft. Da wir hier aber nur von 15 s reden, um einmalig eine Liste zu erstellen, ist mr auch das zu viel Action :) Außerdem ist offen, ob sich das bei der Zahl an Polygonen überhaupt rentiert.

Aber, wer will: der Sweep ist relativ einfach. Da es sich um Rechtecke handelt, die orthogonal zu den Achsen stehen, gibt es für jedes Rechteck auf einer Achse zwei Punkte (z. B. x-Koordinate der linken Karte, x-Koordinate der rechten Kante). Der erste Punkt "öffnet" ein Rechteck, der zweite Punkte "schließt" es ab. Diese Ereignisse fügt man in eine PriorityQueue ein, wobei der jeweilige Punkt der Schlüssel ist. Anschließend nimmt man in einer Schleife so lange ein Ereignis aus der Queue und behandelt dieses, bis die Queue leer ist. Das entspricht dem Verschieben der Sweep-Line entlang der betreffenden Achse.

Die Grundidee ist nun, dass man nur die Rechtecke betrachten muss, die von der Sweep-Line geschnitten werden. Das sind die Rechtecke, die "geöffnet" aber noch nicht "geschlossen" wurden. Heißt, die Ereignisbehandlung sieht im Wesentlichen so aus:
a) beim Eintreten eines "öffnenden" Ereignisses wird das betreffende Rechteck in die "aktive Menge" aufgenommen,
b) beim Eintreten eines "schließenden" Ereignisses wird das betreffende Rechteck aus der "aktiven Menge" entfernt.

Zur effizienten Verwaltung der aktiven Menge verwendet man einen Intervallbaum, der die Intervalle der Koordinaten der anderen Achse (z. B. das Intervall der y-Koordinaten) speichert. Im Fall von a) kann man sich also zunächst die Intervalle/Rechtecke geben lassen, die das neue Rechteck überlappen. Die zurückgegebenen Rechtecke sind dann gerade die Bounding Boxes der Polygone, die auf Überlappung mit dem hinzuzufügenden Polygon getestet werden müssen.
 
Zuletzt bearbeitet:

lonLat

Mitglied
Sehr schön erklärt, mihe7.

Anzumerken ist noch, wenn man nicht jede Polygonkante mit jeder anderen Polygonkante von e2 vergleicht, sondern stattdessen nur die Bounding-Boxes des gesamten Polygons, dann müsste die Laufzeit für das einmalige Aufstellen der Nachbarn-(Adjazen-)Listen auch wieder nur 1 Sekunde betragen, je nachdem, wie schnell die jeweilige Kurbelmaschine ist. ;)

Btw., mir ist oben Zeile 73 und 74 "verrutscht". o_O
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
TheWhiteShadow Reflection-Lösung für Objektkopien Allgemeine Java-Themen 3
W Saubere Lösung für das Auslesen einer Html Seite (Mehrsprachigkeit) Allgemeine Java-Themen 5
Private Void rekursive vs. iterative Lösung für Berechnung der Fakultät Allgemeine Java-Themen 12
J Welche Lösung für Servlets und JSPs in Eclipse? Allgemeine Java-Themen 5
temi Lösung zum Speichern von Deltafiles Allgemeine Java-Themen 6
M Hamstersimulator- lösung Allgemeine Java-Themen 3
B Klassen Objekt erzeugen und Konstruktor aufrufen - Welche Lösung ist besser? Allgemeine Java-Themen 2
E Methoden Hat jemand eine gute Lösung? Allgemeine Java-Themen 5
A Implementierung eines Algorithmus (Farthest Insertion zur Lösung des TSP) in O(n²) Allgemeine Java-Themen 2
N Static oder andere Lösung Allgemeine Java-Themen 5
B Datentypen wav Dateien abspielen mit JMF, Clip und Player klappt nicht. Lösung Codec? Allgemeine Java-Themen 13
J [SWING]Elegante Java Formular Lösung? XML? Allgemeine Java-Themen 4
D Lösung Differentialgl. mit RungeKutta + Kurve zeichnen Allgemeine Java-Themen 3
S große CSV-Dateien Importieren. Beste Lösung ?! AWS,S3,Hadoop!? Allgemeine Java-Themen 4
hdi Häufige Fehler und deren Lösung Allgemeine Java-Themen 4
G Speichern von Dateien - Lösung bei JNLP? Allgemeine Java-Themen 8
V [Lösung]Hohe Systemauslastung bei JFileChooser auf WindowsXP Allgemeine Java-Themen 5
T Ist IAdaptable die richtige Lösung? Allgemeine Java-Themen 4
T Unbekannte Fehlermeldung + Lösung? Allgemeine Java-Themen 4
K Elegante Lösung zum Manipulieren von Collections gesucht Allgemeine Java-Themen 16
S Problem! Lösung mit Double buffering Allgemeine Java-Themen 3
H if - else if-else bessere Lösung gesucht Allgemeine Java-Themen 4
B Elegantere Lösung bei der Implementierung eines Interfaces Allgemeine Java-Themen 2
V Lösung mit iText gesucht. Allgemeine Java-Themen 2
G Was wäre am einfachsten bzw. die beste Lösung? Allgemeine Java-Themen 6
B Algorithmus für Arbeit mit fehlenden Listenelementen? Allgemeine Java-Themen 1
kodela Eingabe für TextArray bedingt sperren Allgemeine Java-Themen 3
R 11 GB File lesen ohne zu extrahieren Filedaten Bereich für Bereich adressieren dann mit Multi-Thread id die DB importieren Allgemeine Java-Themen 3
G KeyListener für JTextField Allgemeine Java-Themen 5
webracer999 Library für Textsuche (z. B. include/exclude, and/or)? Allgemeine Java-Themen 5
I Module-Info für Jar erzeugen Allgemeine Java-Themen 7
krgewb Java-Bibliothek für ONVIF Allgemeine Java-Themen 1
B Simpler Eventlistener für Tastaturtaste bauen? Allgemeine Java-Themen 13
_user_q Eingegebenen Text Zeile für Zeile ausgeben lassen Allgemeine Java-Themen 11
E Key für TOTP Algorythmus(Google Authentificator) Allgemeine Java-Themen 0
S Formel für Sonnenwinkel in ein Programm überführen Allgemeine Java-Themen 11
M pfx-Zertifikat in Tomcat für SSL-Verschlüsselung nutzen Allgemeine Java-Themen 14
R Best Practice Erfahrungswerte für eine Migration von JSF nach Angular (oder anderes JS-Framework) Allgemeine Java-Themen 1
B HeapSort für Array of Strings funktioniert nur teilweise Allgemeine Java-Themen 3
jhCDtGVjcZGcfzug Klassen Was genau passiert hier? Kann mir das jemand bitte Zeile für Zeile erklären? Allgemeine Java-Themen 1
rosima26 Bester Sortieralgorithmus für kurze Arrays Allgemeine Java-Themen 40
S Mit Methoden kann man definieren für was <T> steht. Geht das auch irgendwie für Variablen? Allgemeine Java-Themen 12
MangoTango Operatoren while-Schleife für Potenz Allgemeine Java-Themen 3
B Lottospiel, genug Reihen tippen für 3 Richtige (Spaß mit Arrays)? Allgemeine Java-Themen 46
B Mit welchen Datentypen und Strukturierung am Besten dutzende Baccaratspiele Shcritt für Schritt durchsimulieren? Allgemeine Java-Themen 26
D Klassendesign für einen Pascal Interpreter Allgemeine Java-Themen 6
I OCR Library für Belegerkennung Allgemeine Java-Themen 7
farah GetterMathod für Farbkanäle Allgemeine Java-Themen 6
B Welcher Datentyp für sehr große Zahlenbereiche? Allgemeine Java-Themen 1
S Webservices für binäre Daten? Allgemeine Java-Themen 5
G Licence-Header für InHouse entwickelten Source Allgemeine Java-Themen 8
M Schleife für einen TicTacToe Computer Allgemeine Java-Themen 5
O git ignore für Intellji braucht es die .idea Dateien? Allgemeine Java-Themen 8
F Java Script für das Vorhaben das richtige? Allgemeine Java-Themen 9
M wiviel Java muss ich für die Berufswelt können ? Allgemeine Java-Themen 5
Robertop Datumsformat für GB ab Java 16 Allgemeine Java-Themen 1
Thallius Verschiedene entities für gleichen Code…. Allgemeine Java-Themen 8
OnDemand Zentrale "Drehscheibe" für verschiedene APIs Allgemeine Java-Themen 14
S Übergabe eines Sortierkriteriums für ein Artikel Array mittels BiPredicate<Artikel, Artikel> Allgemeine Java-Themen 13
F Streams als Alternative für dieses Problem ? Allgemeine Java-Themen 15
D SHA-3 für Java-version 1.8 Allgemeine Java-Themen 1
N Validator für einen SQL-Befehl Allgemeine Java-Themen 22
Muatasem Hammud Erstellung von Testdaten für Arrays Allgemeine Java-Themen 6
B Logikfehlersuche, das perfekte Lottosystem für 3 Richtige mit Arraylists? Allgemeine Java-Themen 61
G Methoden für die Zukunft sinnvoll? Allgemeine Java-Themen 4
M API für PLZ Umkreissuche Allgemeine Java-Themen 3
1Spinne JDK 8 für Eclipse installieren Allgemeine Java-Themen 5
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
L Methoden Parser für gängige Datumsformate? Allgemeine Java-Themen 1
H Interface PluginSystem ClassNotFound exception für library Klassen Allgemeine Java-Themen 10
N relativier Pfad für sqlite-Datenbank in Gradle/IntelliJ Allgemeine Java-Themen 2
buchfrau Anagram für beliebiges Wort Allgemeine Java-Themen 2
TonioTec Api für Datenaustausch zwischen Client und Server Allgemeine Java-Themen 0
W Suche Ursache für NPE - woher kommt sie? (Hilfe beim Debugging) Allgemeine Java-Themen 19
Kirby.exe Distanz Map für die Distanztransformation erstellen Allgemeine Java-Themen 1
F PI Regler für Heizung Allgemeine Java-Themen 7
8u3631984 Generelle Log4j.xml für alle Module Allgemeine Java-Themen 5
M Wie übergebe ich den Zähler für die Anzahl Rekursionsschritte korrekt? Allgemeine Java-Themen 2
B Login für User, der im Hintergrund Schedules ausführt Allgemeine Java-Themen 16
L RegEx für Teile einer Berechnung Allgemeine Java-Themen 14
S Java-Task-Management-Tool für Windows und Mac selber programmieren Allgemeine Java-Themen 4
M Java 2D Array für ein Grid erstellen ? Allgemeine Java-Themen 2
Z Welches GUI Framework für Java ist aktuell? Allgemeine Java-Themen 16
N Convert.FromBase64 von C# für Java Allgemeine Java-Themen 11
N fixed-keyword von C# für Java Allgemeine Java-Themen 6
O Suche Scripter für alt:V Project! Allgemeine Java-Themen 0
S Interface Design von HookUp oder Callback Methoden für eigenes Framework Allgemeine Java-Themen 9
O Suche Unterstützung für ein OpenSource-Projekt (grafischer Editor) Allgemeine Java-Themen 13
Kirby.exe Software für Graphische Visualisierung Allgemeine Java-Themen 20
B OOP Auslöser für NullPointerException Allgemeine Java-Themen 3
L Generator für einen Parser implementieren Allgemeine Java-Themen 13
DonMalte Ambitioniertes Projekt für Einsteiger & Motivierte Allgemeine Java-Themen 0
Kirby.exe Movement System für Spiel Allgemeine Java-Themen 13
Kirby.exe Framework für Game Design Allgemeine Java-Themen 8
W Alternative für Threads Allgemeine Java-Themen 6
S Rückgabe einer HttpURLConnection für eine Seite einlesen bei der man eingeloggt ist..? Allgemeine Java-Themen 5
Elyt Compiler-Fehler Datei kann nicht erstellt werden. Die Syntax für den Dateinamen etc. ist falsch. Allgemeine Java-Themen 2
Thallius Rätsel für Windows Profis Allgemeine Java-Themen 8
D OOP Gemeinsamen ID-Raum für zwei Klassen implementieren Allgemeine Java-Themen 7
D Input/Output Implementierung eines CommandHandlers/Parsers für viele Eingaben Allgemeine Java-Themen 26

Ähnliche Java Themen

Neue Themen


Oben