2012-04-14 2 views
0

Ich arbeite an GPS-Standort, wo ich Breite und Länge in entsprechende Adresse konvertieren müssen. Ich habe eine Datenbank mit allen Breiten- und Längengraden (mehr als 1,50000 Daten) mit ihrer tatsächlichen Landmarke, d. H. Adresse in einer Haupttabelle.Ort zählen Problem in Java-Programm

Wir haben GPS-Gerät auf vielen Fahrzeugen installiert, die sich über alle geografischen Standorte bewegt. Alle 2 Minuten sendet das Gerät die aktuelle Position in Längen- und Breitengraden, ich erhalte diesen Breiten- und Längengrad und kartographiere den Master-Tisch und überprüfe, in welcher Region sich unser Master-Tisch befindet. Für diese Berechnung mache ich eine mathematische Operation, um einen Delta-Wert zu Breiten- und Längengrad vom Fahrzeug zu addieren und dann die nächste Suche aus meiner Stammtabelle zu finden. Sobald wir finden, dass das Fahrzeug 5 km vom XYZ-Standort entfernt ist, erhalten wir den XYZ-Standort Master-Tabelle, die der nächste Punkt ist.

Dieses Programm benötigt viel Zeit, um den Standort zu berechnen, da wir 10.000 GPS-Geräte im Fahrzeug installiert haben und jedes Gerät GPS-Daten in 2 Minuten sendet, so können Sie sich vorstellen, wie viele Daten wir bekommen.

Könnten Sie mir bitte helfen, dieses Problem zu beheben und es sehr skalierbar und schnell zu machen.

Vielen Dank im Voraus.

+0

zerlegen Sie es in die Einzelteile und sehen Sie, was am längsten dauert, konzentrieren Sie Ihre Bemühungen dort. Ist es das Senden der Daten zurück? Ist es die Berechnung? ist es die SQL-Suche nach dem Standort? Was nimmt sich die Zeit? Sie müssen es in A -> B -> C -> D -> E -> F usw. zerlegen und herausfinden, wie lange jeder Schritt dauert und konzentrieren Sie Ihre Zeit darauf, wo Sie den größten Knall dafür bekommen der Bock. Mach weiter, bis die Leistung akzeptabel ist. Wenn Sie die Zeit nicht von A -> F verfolgen können, müssen Sie sie erstellen. – xQbert

+0

@xQbert Wir haben eine Tabelle, wo wir drei Spalten Breite, Länge und Position haben - sobald ich einen beliebigen Längen- und Breitengrad vom Gerät bekommen wir in Spalte Breite und Länge einfügen, aber wir fügen nichts in Location Spalte, nach der Berechnung mit Master-Tabelle Durch das Senden von Längen- und Breitengrad erhalten wir einen Ort wie 5 KM von XYZ, dann aktualisieren wir in der Standortspalte der ersten Tabelle.Die Überquerung von Breiten- und Längengrad zur Master-Tabelle, um den nächstgelegenen Standort von unserem verfügbaren Orientierungspunkt in der Master-Tabelle zu erhalten, erfordert viel Zeit. Ich bitte um Hilfe, um mich hier zu verbessern. danke – geekIndiana

+0

Also hast du eine Prozedur? Funktion? oder etwas, das in SQL Server 200X lange ausgeführt wird? oder MySQL, oder ORACLE oder DB2 oder ... Wenn dies der Fall ist, würde es hilfreich sein, Dinge wie den eigentlichen SQL mit langer Laufzeit und den Ausführungsplan zu sehen, um die Performance zu verbessern. Oder führen Sie wiederholte Versuche von Java zur Datenbank durch, um den "nächsten" Orientierungspunkt zu finden? – xQbert

Antwort

1

Wie wäre es mit einer GIS-Schicht auf Ihrer db? So etwas wie PostGIS fügt sql mit dieser Art von Funktionalität eine neue Ebene hinzu. Von einem FAQ:

3.7. Was ist der beste Weg, um alle Objekte in einem Radius von einem anderen Objekt zu finden?

die Datenbank nutzen zu können, am effizientesten ist es am besten Radius zu tun abfragt, die den Radius Test mit einem Begrenzungsrahmen Test kombinieren: die Begrenzungs -Box-Test verwendet den räumlichen Index, schnellen Zugriff auf eine Teilmenge von Daten geben die Der Radius-Test wird dann angewendet auf.

Die Funktion ST_DWithin (Geometrie, Geometrie, Abstand) ist eine praktische Methode für die Durchführung einer indizierten Abstandssuche. Dazu wird ein Suchrechteck erstellt, das groß genug ist, um den Entfernungsradius einzuschließen, und anschließend eine exakte Abstandssuche für die indizierte Teilmenge der Ergebnisse durchführen.

Zum Beispiel alle Objekte mit 100 Metern von Punkt zu finden (1000 1000) die folgende Abfrage würde gut funktionieren:

SELECT * FROM geotable WHERE ST_DWithin (geocolumn 'POINT (1000 1000)', 100,0);