Ich bin völlig neu in DBMS. Ich habe Spuren von Fahrzeugen in verschiedenen CSV-Dateien für jeden Benutzer. Format: Name, Zeitstempel, Breitengrad, Längengrad, RandomId. zB: user0,2008-10-2309: 42: 25,441972.694217,4428508.5117,2704942289Postgis-Datenbank: Wie kann ich alle GPS-Punkte zwischen den angegebenen Zeitstempeln und der angegebenen Region abrufen?
1) Wie Bereichsabfrage implementieren, die zwischen Zeitstempel (t1 gesehen für alle GPS-Punkte aller Fahrzeuge fragt) und t2 im Bereich (Mitte = lat, lon; Radius = r km).
Da habe ich Milliarden von Zeilen in allen csv. Ich habe eine Basistabelle erstellt
CREATE TABLE userDataBase1
(
gid serial NOT NULL,
name character varying(50),
time_stamp TIMESTAMPTZ // postgresql doesn't have this datatype
latitude numeric(12,8),// Don't know the data type for UTM points
longitude numeric(12,8),
pseudonym integer,
the_geom geometry
);
Sollte ich direkt so kopieren?
\copy landmarks(name,time_stamp,landmark,latitude,longitude) FROM '/local/path/to/Individual_Landmarks.csv' DELIMITERS ',' CSV HEADER;
2), was der beste Weg ist, zu kopieren und bauen Datenbank, so dass meine RANGE Abfrage (wie oben definiert) effizient Daten aus Milliarden von Spuren zurück.
Atleast Grundlegende Implementierung, die funktioniert, ist auch in Ordnung.
Da bin ich neu in DBMS. Erklärung mit kleinen Schnipsel ist sehr hilfreich. Ich danke dir sehr! P.S: Ich benutze Postgre 9.5, Postgis 2.2, Windows 10, pgAdmin III
FYI: Ich habe erfolgreich mit der Datenbank über Python-Skript verbunden.
import psycopg2
conn = psycopg2.connect(database="postgis_unistuttgart", user="postgres", password="vishnu", host="127.0.0.1", port="5432")
print "Opened database successfully"
Edit1: Kleine Änderung in der Frage. Ich habe den Breiten- und Längengrad wie mit Python-Skript in UTM geändert.
import utm
import os
def gpsToUtm(latDeg,lonDeg):
#print "gpsToUtm:",latDeg,lonDeg
lat,lon,zoneNo,Zoneletter = utm.from_latlon(latDeg, lonDeg)
return lat,lon
ZB: Jetzt habe ich Positionswerte wie diese (441972.694217,4428508.5117) in UTM.
1) Was sollte der Datentyp der UMT-Position (Meter) in der PostgreSQL-Tabelle sein? 2) TIMESTAMPTZ ist in meiner postgresql-Version nicht verfügbar. 42: 25
so was sollte
2008-10-2309 der richtige Datentyp für dieses Format vorliegen.
Mmh ... Ich denke, Sie sollten Ihre Datei in mehrere kleine Dateien aufteilen - mit sagen, zehn Millionen Zeilen - und importieren Sie die Daten in mehreren untergeordneten Tabellen mit Tabellenvererbung. Siehe https://www.postgresql.org/docs/9.5/static/ddl-inherit.html. (Ich kann keine Antwort posten, da ich keine echte Erfahrung in dieser Aufgabe habe) –
Wie Sie sagten.Ich habe die Anzahl der Zeilen von 4 Jahren Daten auf Monat reduziert. Jetzt habe ich weniger Zeilen in verschiedenen CSV-Dateien für jeden Benutzer. Können Sie mich bitte mit einem Ausschnitt zur Implementierung der RANGE-Abfrage führen? Vielen Dank! – vishnu
Ich weiß nicht, was eine "RANGE-Abfrage" ist, aber ein gemeinsamer Indextyp für räumliche Daten ist ein [GiST-Index] (https://en.wikipedia.org/wiki/GiST), mit dem Sie arbeiten können [ST_DWithin] (http://postgis.net/docs/ST_DWithin.html). Und wenn Sie geographische Koordinaten und metrische Entfernungen mischen müssen, können Sie den Typ "geography" verwenden. –