Topik ini menjelaskan cara menggunakan Lindorm GanosBase SQL untuk menulis titik-titik lintasan yang dikumpulkan dari skenario Internet of Vehicle (IoV) ke tabel lebar Lindorm dan cara menanyakan titik-titik lintasan berdasarkan rentang spatio-temporal.
Prasyarat
Java Development Kit (JDK) 1.8 atau versi lebih baru telah terinstal.
Titik akhir yang diperlukan saat menggunakan SQL untuk terhubung dan menggunakan LindormTable telah diperoleh. Daftar putih telah dikonfigurasi untuk instance Lindorm, dan alamat IP klien Anda telah ditambahkan ke daftar putih. Untuk informasi lebih lanjut, lihat Terhubung ke LindormTable.
Prosedur
Anda harus mengikuti langkah-langkah berikut untuk menulis titik-titik lintasan ke tabel lebar Lindorm dan menanyakan titik-titik lintasan:
Buat tabel spatio-temporal dan tulis titik-titik lintasan yang dikumpulkan ke tabel tersebut
Gunakan Lindorm-cli untuk terhubung dan menulis data ke LindormTable
Hubungkan ke LindormTable. Dalam topik ini, Lindorm-cli digunakan untuk menghubungkan klien yang diimplementasikan pada Linux ke LindormTable.
Untuk menggunakan JDBC untuk terhubung ke LindormTable, lihat Gunakan API Java JDBC untuk mengembangkan aplikasi.
Unduh paket instalasi Lindorm-cli.
Ekstrak paket instalasi Lindorm-cli.
Peroleh informasi koneksi. Kemudian, jalankan perintah dalam format berikut untuk terhubung ke LindormTable:
./lindorm-cli -url <jdbc url> -username <Username> -password <Password>Parameter
Contoh
Cara mendapatkan nilai parameter
jdbc url
jdbc:lindorm:table:url=http://ld-bp17j28j2y7pm****-proxy-lindorm-pub.lindorm.rds.aliyuncs.com:30060
Titik akhir yang diperlukan saat Anda menggunakan SQL untuk terhubung dan menggunakan LindormTable. Untuk informasi lebih lanjut tentang cara memperoleh titik akhir, lihat Terhubung ke LindormTable.
Nama Pengguna
root
Anda dapat melihat nama pengguna atau mereset kata sandi di sistem manajemen kluster LindormTable. Untuk informasi lebih lanjut, lihat Ubah kata sandi pengguna.
Kata Sandi
root
Hasil berikut dikembalikan:
Connected to jdbc:lindorm:table:url=http://ld-bp17j28j2y7pm****-proxy-lindorm-pub.lindorm.rds.aliyuncs.com:30060 lindorm-cli version: 1.0.15
Gunakan salah satu metode berikut untuk membuat tabel spatio-temporal.
Tabel spatio-temporal digunakan untuk menyimpan titik-titik lintasan. Titik lintasan mencakup informasi bujur (x), lintang (y), dan temporal (t). Informasi bujur dan lintang disimpan dengan dua metode. Tabel berikut menjelaskan metode penyimpanan informasi bujur dan lintang di Lindorm GanosBase.
Metode Penyimpanan
Deskripsi
Simpan informasi bujur dan lintang tentang sebuah titik sebagai
geometry pointdalam satu kolom.Data yang disimpan dengan metode ini dapat memberikan kinerja baca dan tulis yang lebih baik.
Simpan secara terpisah informasi bujur dan lintang sebuah titik dalam dua kolom.
Informasi bujur dan lintang historis disimpan secara terpisah dalam dua kolom. Kinerja baca dan tulis data yang disimpan dengan metode ini tidak sebaik data yang disimpan sebagai geometry points.
Simpan informasi bujur dan lintang tentang sebuah titik sebagai
geometry pointdalam satu kolom. Anda dapat menjalankan pernyataan berikut untuk membuat tabel spatio-temporal yang menyimpan informasi bujur dan lintang menggunakan metode ini:CREATE TABLE gps_data (id int, g geometry(point), t timestamp, ship_name varchar, PRIMARY KEY(id, t));Parameter
Deskripsi
g
Kolom yang menyimpan data spasial. Jenis data yang disimpan dalam kolom ini adalah
Geometry(Point).t
Kolom yang menyimpan data temporal. Kolom ini mendukung jenis data berikut: Time, Timestamp, dan Long. Nilai bertipe Long dalam kolom ini menunjukkan timestamp UNIX yang akurat hingga milidetik.
ship_name
Kolom yang menyimpan nama. Misalnya, Anda dapat menyimpan nama kapal yang menghasilkan titik-titik lintasan dalam tabel ini.
PRIMARY KEY(id, t)
Kunci utama tabel, yang berisi kolom
iddant.Simpan secara terpisah informasi bujur, lintang, dan temporal tentang sebuah titik dalam dua kolom. Anda dapat menjalankan pernyataan berikut untuk membuat tabel spatio-temporal yang menyimpan informasi bujur, lintang, dan temporal menggunakan metode ini:
CREATE TABLE gps_data_point (id int, x double, y double, t timestamp, ship_name varchar, PRIMARY KEY(id, t));
Gunakan salah satu metode berikut untuk menulis titik-titik lintasan secara individual ke tabel.
Gunakan fungsi spatio-temporal
ST_MakePointuntuk membangun titik-titik lintasan. Sebagai contoh,ST_MakePoint(119.073544 25.3244)dapat digunakan untuk membangun titik lintasan dengan bujur 119.073544 dan lintang 25.3244.INSERT INTO gps_data (id, g, t, ship_name) VALUES (1,ST_MakePoint(119.073544,25.3244), '2021-01-01 10:00:00', 'ship001'); INSERT INTO gps_data (id, g, t, ship_name) VALUES (1,ST_MakePoint(119.073544,25.3244), '2021-01-01 10:05:03', 'ship001'); INSERT INTO gps_data (id, g, t, ship_name) VALUES (1,ST_MakePoint(119.073544,25.324382), '2021-01-01 10:08:32', 'ship001'); INSERT INTO gps_data (id, g, t, ship_name) VALUES (1,ST_MakePoint(119.073536,25.324418), '2021-01-01 10:10:22', 'ship001'); INSERT INTO gps_data (id, g, t, ship_name) VALUES (2,ST_MakePoint(19.07352,25.34), '2021-01-01 08:20:21', 'ship002'); INSERT INTO gps_data (id, g, t, ship_name) VALUES (2,ST_MakePoint(19.07352,25.33), '2021-01-01 08:22:20', 'ship002');CatatanUntuk informasi lebih lanjut tentang fungsi
ST_MakePoint, lihat ST_MakePoint.Anda juga dapat menggunakan fungsi spatio-temporal
ST_GeomFromTextuntuk membangun titik-titik lintasan. Titik lintasan yang dibangun oleh fungsi ini berada dalam format Well-known Text (WKT) standar. Namun, kinerja penulisanST_GeomFromTexttidak sebaik fungsiST_MakePoint. Untuk informasi lebih lanjut tentang fungsiST_GeomFromText, lihat ST_GeomFromText.
Tulis informasi bujur, lintang, dan temporal tentang titik-titik lintasan ke tabel.
INSERT INTO gps_data_point (id, x, y, t, ship_name) VALUES (1, 119.073544, 25.3244, '2021-01-01 10:00:00', 'ship001'); INSERT INTO gps_data_point (id, x, y, t, ship_name) VALUES (1, 119.073544, 25.3244, '2021-01-01 10:05:03', 'ship001'); INSERT INTO gps_data_point (id, x, y, t, ship_name) VALUES (1, 119.073544, 25.324382, '2021-01-01 10:08:32', 'ship001'); INSERT INTO gps_data_point (id, x, y, t, ship_name) VALUES (1, 119.073536, 25.324418, '2021-01-01 10:10:22', 'ship001'); INSERT INTO gps_data_point (id, x, y, t, ship_name) VALUES (2, 19.07352, 25.34, '2021-01-01 08:20:21', 'ship002'); INSERT INTO gps_data_point (id, x, y, t, ship_name) VALUES (2, 19.07352, 25.33, '2021-01-01 08:22:20', 'ship002');
Opsional: Gunakan salah satu metode berikut untuk menulis titik-titik lintasan ke tabel dalam batch.
Gunakan fungsi
ST_MakePointuntuk menulis titik-titik lintasan dalam batch.UPSERT INTO gps_data (id, g, t, ship_name) VALUES(1,ST_MakePoint(119.073544,25.3244), '2021-01-01 10:00:00', 'ship001'),(1,ST_MakePoint(119.073544,25.3244), '2021-01-01 10:05:03', 'ship001'),(1,ST_MakePoint(119.073544,25.324382), '2021-01-01 10:08:32', 'ship001'),(1,ST_MakePoint(119.073536,25.324418), '2021-01-01 10:10:22', 'ship001'),(2,ST_MakePoint(19.07352,25.34), '2021-01-01 08:20:21', 'ship002'),(2,ST_MakePoint(19.07352,25.33), '2021-01-01 08:22:20', 'ship002');Tulis informasi bujur, lintang, dan temporal tentang titik-titik lintasan dalam batch.
UPSERT INTO gps_data_point (id, x, y, t, ship_name) VALUES(1, 119.073544, 25.3244, '2021-01-01 10:00:00', 'ship001'),(1, 119.073544, 25.3244, '2021-01-01 10:05:03', 'ship001'),(1, 119.073544, 25.324382, '2021-01-01 10:08:32', 'ship001'),(1, 119.073536, 25.324418, '2021-01-01 10:10:22', 'ship001'),(2, 19.07352, 25.34, '2021-01-01 08:20:21', 'ship002'),(2, 19.07352, 25.33, '2021-01-01 08:22:20', 'ship002');
Gunakan pernyataan
SELECTuntuk menanyakan data yang ditulis ke tabel.Tanyakan titik-titik lintasan dalam tabel dan gunakan fungsi spatio-temporal
ST_AsTextuntuk mengonversi titik-titik menjadi teks yang dapat dibaca.SELECT id, ST_AsText(g) AS position, ship_name FROM gps_data;Hasil berikut dikembalikan:
+----+------------------------------+-----------+ | id | position | ship_name | +----+------------------------------+-----------+ | 1 | POINT (119.073544 25.3244) | ship001 | | 1 | POINT (119.073544 25.3244) | ship001 | | 1 | POINT (119.073544 25.324382) | ship001 | | 1 | POINT (119.073536 25.324418) | ship001 | | 2 | POINT (19.07352 25.34) | ship002 | | 2 | POINT (19.07352 25.33) | ship002 | +----+------------------------------+-----------+Tanyakan informasi bujur, lintang, dan temporal tentang titik-titik lintasan dalam tabel.
SELECT * FROM gps_data_point;Hasil berikut dikembalikan:
+----+-------------------------------+------------+-----------+-----------+ | id | t | x | y | ship_name | +----+-------------------------------+------------+-----------+-----------+ | 1 | 2021-01-01 10:00:00 +0000 UTC | 119.073544 | 25.3244 | ship001 | | 1 | 2021-01-01 10:05:03 +0000 UTC | 119.073544 | 25.3244 | ship001 | | 1 | 2021-01-01 10:08:32 +0000 UTC | 119.073544 | 25.324382 | ship001 | | 1 | 2021-01-01 10:10:22 +0000 UTC | 119.073536 | 25.324418 | ship001 | | 2 | 2021-01-01 08:20:21 +0000 UTC | 19.07352 | 25.34 | ship002 | | 2 | 2021-01-01 08:22:20 +0000 UTC | 19.07352 | 25.33 | ship002 | +----+-------------------------------+------------+-----------+-----------+
Gunakan JDBC untuk terhubung dan menulis data ke LindormTable
Anda dapat menulis data spatio-temporal ke LindormTable dengan menentukan parameter dalam pernyataan query. Kode Java berikut memberikan contoh tentang cara menggunakan operasi PreparedStatement yang disediakan oleh JDBC untuk menulis data ke LindormTable dengan menentukan parameter dalam pernyataan query:
// Membuat koneksi.
Connection connection = DriverManager.getConnection(url, properties);
final String tableName = "testtbl"
// Buat tabel.
try (Statement stmt = conn.createStatement()) {
stmt.execute("create table " + tableName +
"(p1 int, c1 varchar, c2 geometry(point), constraint primary key (p1))");
}
// Tentukan pernyataan query yang digunakan untuk menulis data.
final String upsertSql = "upsert into " + tableName + "(p1,c1,c2) values (?,?,ST_MakePoint(?,?))";
// Persiapkan pernyataan query.
try (PreparedStatement preparedStatement = conn.prepareStatement(upsertSql)) {
// Tentukan parameter yang sesuai dengan placeholder dalam pernyataan.
preparedStatement.setInt(1, 0);
preparedStatement.setString(2, "name");
preparedStatement.setDouble(3, 5.0);
preparedStatement.setDouble(4, 5.0);
// Tulis data ke LindormTable.
preparedStatement.executeUpdate();
}Buat indeks spatio-temporal untuk meningkatkan efisiensi query
Jika kondisi yang ditentukan oleh klausa WHERE dalam pernyataan query berisi rentang spatio-temporal, Anda dapat membuat indeks spatio-temporal untuk mempercepat query. Indeks spatio-temporal dapat diklasifikasikan menjadi dua jenis: indeks kunci utama spatio-temporal dan indeks sekunder spatio-temporal, yang masing-masing sesuai dengan indeks kunci utama dan indeks sekunder di Lindorm. Untuk informasi lebih lanjut, lihat Buat indeks spatio-temporal.
Konfigurasikan atribut tabel spatio-temporal.
ALTER TABLE gps_data SET 'MUTABILITY'='MUTABLE_LATEST'; ALTER TABLE gps_data SET 'CONSISTENCY'='strong';CatatanUntuk menggunakan indeks yang diperbarui berdasarkan timestamp kustom, Anda harus menjalankan pernyataan berikut untuk mengatur
MUTABILITYkeMUTABLE_ALL:ALTER TABLE gps_data SET 'MUTABILITY' = 'MUTABLE_ALL';. Untuk informasi lebih lanjut tentang atribut MUTABILITY, lihat Istilah.Buat indeks sekunder spatio-temporal. Dalam contoh ini, tabel spatio-temporal sudah dibuat. Oleh karena itu, Anda hanya dapat mempercepat query dengan membuat indeks sekunder spatio-temporal. Pernyataan berikut memberikan contoh tentang cara membuat indeks yang berisi kolom spasial dan temporal.
CREATE INDEX idt ON gps_data (Z-ORDER(g,t));
Tanyakan titik-titik lintasan dalam rentang spatio-temporal tertentu
Anda dapat menggunakan fungsi spatio-temporal ST_Contains untuk menanyakan titik-titik lintasan dalam rentang spasial yang ditentukan oleh POLYGON ((18 24, 20 24, 20 26, 18 26, 18 24)) dan rentang temporal dari 2021-01-01 08:21:00 hingga 2021-01-01 08:23:00.
Fungsi Z-ORDER dalam indeks sekunder spatio-temporal berisi kolom spasial dan kolom temporal. Oleh karena itu, kondisi query harus berisi rentang spasial dan rentang temporal. Untuk informasi lebih lanjut tentang cara mengoptimalkan query spatio-temporal, lihat Optimalkan kinerja query spatio-temporal.
SELECT id,t,ST_AsText(g),ship_name FROM gps_data WHERE ST_Contains(ST_GeomFromText('POLYGON ((18 24, 20 24, 20 26, 18 26, 18 24))'),g) AND t>'2021-01-01 08:21:00' AND t<'2021-01-01 08:23:00';Hasil berikut dikembalikan:
+----+-------------------------------+------------------------+-----------+
| id | t | "ST_AsText"(g) | ship_name |
+----+-------------------------------+------------------------+-----------+
| 2 | 2021-01-01 08:22:20 +0000 UTC | POINT (19.07352 25.33) | ship002 |
+----+-------------------------------+------------------------+-----------+Untuk informasi lebih lanjut tentang fungsi spatio-temporal yang disediakan oleh Lindorm GanosBase, lihat Ikhtisar.