Umkreissuche entwickeln

Lange_27

Mitglied
Hallo,
ich möchte gerne mit JavaFx eine Umkreissuche programmieren.
Ich habe bereits alle Geopositionen (Plz, lon, lat, ort) sowie Händler(incl. Plz und Ort) in der Datenbank gespeichert.
Jetzt möchte ich über die GUI eine Plz und ein Umkreis eingeben mit dem Resultat, dass alle Händler die in dem Umkreis liegen in einer Tabelle angezeigt werden.
Leider haben ich noch keine Vorstellung wie ich dass genau umsetzen kann.
Über Vorschläge wäre ich sehr dankbar :)
 

Robat

Top Contributor
Die Frage ist jetzt sehr offen gestellt.
Geht es dir eher darum wie du die GUI aufbaust oder wie du die Daten aus der Datenbank holst? Präzisiere das ganze mal etwas
 

Lange_27

Mitglied
Es geht darum, wie ich mit den Daten aus der Datenbank arbeite.
Ich weiß noch nicht wie ich es umsetzen kann, dass man in der GUI eine Plz und einen Radius eingibt, sodass ich dann alle Händler ,die innerhalb dieses Radius liegen, tabellarisch in der GUI anzeigen lassen kann. Mir fehlt da noch die Idee, wie man dass ganze angehen soll bzw. berechnen soll.
 

mihe7

Top Contributor
Ich gehe mal davon aus, dass die Koordinaten in EPSG:4326 vorliegen. Wenn es nicht sonderlich genau sein muss, kann man die Erde als Kugel betrachten und für kurze Entfernungen lässt sich Pythagoras heranziehen.

In diesem Fall beträgt der Radius 6.378.137 m. Der Umfang eines Kreises, der durch die Pole verläuft, beträgt 6.378.137 m * 2 * PI. Unterteilt man diesen Kreis in 360 Teile, so entspricht jeder Teil einem Grad geographischer Breite. Ein Grad geographischer Breite entspricht somit konstant 6.378.137 m * PI / 180 also etwa 111.319,49 m.

Unterteilt man einen Kreis, der durch einen Breitengrad verläuft, in 360 Teile, erhält man die Distanz zwischen zwei Längengraden. Allerdings ist der Radius eines solchen Kreises abhängig vom Breitengrad. Während am Äquator (0° Breite) der Radius eben 6.378.137 m beträgt, ist er an den Polen (90° Nord/Süd) 0. Der Radius eines "Breitenkreises" beträgt r(lat) = 6.378.137 m * cos(lat). Die Entfernung zwischen zwei Längengraden somit 111.319,49 m * cos(lat)

Jetzt gibt es mehrere Möglichkeiten, um die Berechnung einfach zu halten. Entweder man bezieht sich auf einen Breitengrad, z. B. für Deutschland 51° Nord und kommt dann etwa auf 70.055,63 m oder man berechnet für gegebene Koordinaten den Mittelwert, also 111.319,49 m * cos((lat1 + lat2)/2).

Insgesamt hat man also: (113.319,49 m * cos((lat1 + lat2)/2) * (lon1 - lon2))² + (113.319,49 * (lat1 - lat2))² = distanz², ein wenig umformen 2*(113.319,49 m)² * ((cos((lat1 + lat2)/2) * (lon1 - lon2))² + (lat1 - lat2)²) = distanz² und somit (cos((lat1 + lat2)/2) * (lon1 - lon2))² + (lat1 - lat2)² = distanz² / (2*(113.319,49 m)²)

Daraus eine Ungleichung gemacht und in den SELECT eingebaut und schon erhält man die betreffenden Händler (Achtung: die Gradangaben müssen in der Regel ins Bogenmaß umgerechnet werden).

Einfacher wäre es, wenn Du den "Umkreis" nicht als Kreis sondern als Rechteck definierst. Dann rechnest Du anhand des "Umkreis" einfach die vier Punkte aus und kannst einfach über das Rechteck abfragen. Auch bietet es sich an, die Grade ganzzahlig zu speichern.
 
X

Xyz1

Gast
@mihe7 meint das so :)
Java:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Umkreis {
    public static void main(String[] args) throws SQLException {
        Connection con = DriverManager.getConnection("jdbc:sqlite::memory:");
        con.createStatement().execute("CREATE TABLE IF NOT EXISTS pos (id INTEGER PRIMARY KEY, plz INTEGER NOT NULL, lon REAL NOT NULL, lat REAL NOT NULL, ort TEXT NOT NULL, de TEXT);");
        float x = 53.5f;
        float y = 6.5f;
        float a = 47;
        float b = 14;
        for (int i = 0; i < 1000; i++) {
            float j = (float) (Math.random() * (x - a)) + a;
            float k = (float) (Math.random() * (b - y)) + y;
            int plz = (int) (Math.random() * 100);
            PreparedStatement s = con.prepareStatement("INSERT INTO pos(plz, lon, lat, ort, de) VALUES(?,?,?,?,?)");
            s.setInt(1, plz);
            s.setFloat(2, j);
            s.setFloat(3, k);
            s.setString(4, String.valueOf(i + 1));
            s.setString(5, "nicht null");
            System.out.println(s.executeUpdate());
        }

        for (int i = 0; i < 10; i++) {
            float j = (float) (Math.random() * (x - a)) + a;
            float k = (float) (Math.random() * (b - y)) + y;
            int plz = (int) (Math.random() * 100);
            System.out.println("search: " + plz + " " + j + " " + k);
            ResultSet s = con.createStatement().executeQuery("SELECT * FROM pos WHERE plz = " + plz + ";");
            while (s.next()) {
                float jj = s.getFloat("lon");
                float kk = s.getFloat("lat");
                if (j > jj && j - 3.25f < jj && k > kk && k - 3.75f < kk) {
                    System.out.println("found: " + s.getInt("plz") + " " + jj + " " + kk);
                } else {
                    // System.out.println("not found: " + s.getInt("plz") + " " + jj + " " + kk);
                }
            }
        }
    }
}

oft findet er so ein bis zwei...
 

Ähnliche Java Themen

Neue Themen


Oben