All Products
Search
Document Center

:ST_makeTrajectory

Last Updated:Mar 28, 2026

Membuat objek trajectory dari geometri spasial, timestamp, dan data atribut opsional.

Sintaks

Sintaks 1 — Rentang waktu:

trajectory ST_makeTrajectory(leaftype type, geometry spatial, tsrange timespan, cstring attrs_json);

Sintaks 2 — Timestamp awal dan akhir:

trajectory ST_makeTrajectory(leaftype type, geometry spatial, timestamp start, timestamp end, cstring attrs_json);

Sintaks 3 — Array timestamp:

trajectory ST_makeTrajectory(leaftype type, geometry spatial, timestamp[] timeline, cstring attrs_json);

Sintaks 4 — Array koordinat:

trajectory ST_makeTrajectory(leaftype type, float8[] x, float8[] y, integer srid, timestamp[] timeline, text[] attr_field_names, int4[] attr_int4, float8[] attr_float8, text[] attr_cstring, anyarray attr_any);

Sintaks 5 — Dari baris tabel:

trajectory ST_makeTrajectory(anyarray rows, bool hasz, cstring[] attrnames);

Parameter

ParameterDeskripsi
typeTipe leaf dari trajectory. Hanya ST_POINT yang didukung.
spatialObjek geometri spasial, berupa LineString atau Point.
timespanRentang waktu trajectory. Ini adalah interval tertutup yang mencakup waktu mulai dan waktu akhir.
startWaktu mulai trajectory.
endWaktu akhir trajectory.
timelineTimeline trajectory. Jumlah titik waktu harus sama dengan jumlah titik dalam LineString.
attrs_jsonAtribut dan event trajectory dalam format JSON. Menerima null.
xArray koordinat sumbu-x untuk objek geometri spasial.
yArray koordinat sumbu-y untuk objek geometri spasial.
sridSpatial Reference Identifier (SRID) dari trajectory. Wajib diisi.
attr_field_namesNama semua bidang atribut dalam trajectory.
rowsTabel yang digunakan untuk menyimpan data trajectory. Kolom pertama harus berupa timestamp, sedangkan kolom kedua dan ketiga harus berupa float8.
haszMenentukan apakah trajectory bersifat tiga dimensi. Nilai valid: true (trajectory 3D — kolom keempat harus berupa float8) dan false (trajectory 2D — kolom keempat merepresentasikan atribut trajectory).
attrnamesNama atribut trajectory. Nilai default: attr1, attr2, ....

Format attrs_json

Parameter attrs_json menerima objek JSON dengan struktur berikut:

{
  "leafcount": 3,
  "attributes": {
    "velocity": {
      "type": "integer",
      "length": 2,
      "nullable": true,
      "value": [120, null, 140]
    },
    "accuracy": {
      "type": "float",
      "length": 4,
      "nullable": false,
      "value": [120, 130, 140]
    },
    "bearing": {
      "type": "float",
      "length": 8,
      "nullable": false,
      "value": [120, 130, 140]
    },
    "vesname": {
      "type": "string",
      "length": 20,
      "nullable": true,
      "value": ["dsff", "fgsd", null]
    },
    "active": {
      "type": "timestamp",
      "nullable": false,
      "value": [
        "Fri Jan 01 14:30:00 2010",
        "Fri Jan 01 15:00:00 2010",
        "Fri Jan 01 15:30:00 2010"
      ]
    }
  },
  "events": [
    {"1": "Fri Jan 01 14:30:00 2010"},
    {"2": "Fri Jan 01 15:00:00 2010"},
    {"3": "Fri Jan 01 15:30:00 2010"}
  ]
}

leafcount: Jumlah titik trajectory. Harus sesuai dengan jumlah titik dalam objek geometri spasial. Semua bidang atribut harus memiliki jumlah nilai yang sama.

attributes: Atribut trajectory, termasuk definisi bidang dan urutan nilai. Wajib diisi jika leafcount ditentukan.

  • Nama atribut dapat memiliki panjang maksimal 60 karakter.

  • type: Tipe data bidang. Nilai valid: integer, float, string, timestamp, dan bool.

  • length: Panjang nilai bidang. Nilai valid bergantung pada type:

    • integer: 1, 2, 4, atau 8

    • float: 4 atau 8

    • string: nilai apa pun sesuai kebutuhan Anda; default 64, maksimum 253. Panjang dihitung berdasarkan jumlah karakter aktual, tidak termasuk identifier akhir.

    • timestamp: tetap 8; tidak dapat diatur.

    • bool: tetap 1; tidak dapat diatur.

  • nullable: Apakah bidang menerima nilai null. Nilai valid: true dan false. Default: true.

  • value: Array JSON berisi nilai bidang. Gunakan null untuk merepresentasikan elemen null.

events: Array JSON berisi event trajectory. Setiap elemen merupakan pasangan kunci-nilai di mana kunci adalah tipe event dan nilai adalah waktu event.

Catatan penggunaan

  • Interpolasi waktu: Ketika timespan (Sintaks 1) atau start/end (Sintaks 2) ditentukan, ST_makeTrajectory melakukan interpolasi titik waktu berdasarkan jumlah titik spasial untuk menghasilkan timeline trajectory.

  • Membangun dari tabel: Gunakan array_agg(row(table.*)) untuk mengagregasi baris tabel menjadi trajectory (Sintaks 5).

  • Sintaks kustom: Jika sintaks bawaan tidak memenuhi kebutuhan Anda, buat fungsi kustom dengan parameter tambahan setelah enam parameter tetap pertama:

    CREATE OR REPLACE FUNCTION _ST_MakeTrajectory(
        type leaftype,
        x float8[],
        y float8[],
        srid integer,
        timespan timestamp[],
        attrs_name cstring[],
        attr1 float8[],
        attr2 float4[],
        attr3 timestamp[]
    )
    RETURNS trajectory
    AS '$libdir/libpg-trajectory-x.y', 'sqltr_traj_make_all_array'
    LANGUAGE 'c' IMMUTABLE PARALLEL SAFE;
    Ganti x.y dengan nomor versi Ganos. Misalnya, untuk Ganos 4.5, gunakan libpg-trajectory-4.5. Panggil ST_Version() untuk mengecek versi Ganos saat ini.

Contoh

Sintaks 1 — Membuat trajectory dari rentang waktu. Saat tsrange diberikan, fungsi melakukan interpolasi titik waktu sepanjang titik spasial.

SELECT ST_MakeTrajectory(
  'STPOINT'::leaftype,
  ST_GeomFromText('LINESTRING (114 35, 115 36, 116 37)', 4326),
  '[2010-01-01 14:30, 2010-01-01 15:30)'::tsrange,
  '{"leafcount":3,"attributes":{"velocity":{"type":"integer","length":2,"nullable":true,"value":[120,130,140]},"accuracy":{"type":"float","length":4,"nullable":false,"value":[120,130,140]},"bearing":{"type":"float","length":8,"nullable":false,"value":[120,130,140]},"vesname":{"type":"string","length":20,"nullable":true,"value":["adsf","sdf","sdfff"]},"active":{"type":"timestamp","nullable":false,"value":["Fri Jan 01 14:30:00 2010","Fri Jan 01 15:00:00 2010","Fri Jan 01 15:30:00 2010"]}},"events":[{"1":"Fri Jan 01 14:30:00 2010"},{"2":"Fri Jan 01 15:00:00 2010"},{"3":"Fri Jan 01 15:30:00 2010"}]}'
);

Output:

{"trajectory":{"version":1,"type":"STPOINT","leafcount":3,"start_time":"2010-01-01 14:30:00","end_time":"2010-01-01 15:30:00","spatial":"SRID=4326;LINESTRING(114 35,115 36,116 37)","timeline":["2010-01-01 14:30:00","2010-01-01 15:00:00","2010-01-01 15:30:00"],"attributes":{"leafcount":3,"velocity":{"type":"integer","length":2,"nullable":true,"value":[120,130,140]},"accuracy":{"type":"float","length":4,"nullable":false,"value":[120.0,130.0,140.0]},"bearing":{"type":"float","length":8,"nullable":false,"value":[120.0,130.0,140.0]},"vesname":{"type":"string","length":20,"nullable":true,"value":["adsf","sdf","sdfff"]},"active":{"type":"timestamp","length":8,"nullable":false,"value":["2010-01-01 14:30:00","2010-01-01 15:00:00","2010-01-01 15:30:00"]}},"events":[{"1":"2010-01-01 14:30:00"},{"2":"2010-01-01 15:00:00"},{"3":"2010-01-01 15:30:00"}]}}

Sintaks 2 — Membuat trajectory dari timestamp awal dan akhir eksplisit:

SELECT ST_MakeTrajectory(
  'STPOINT'::leaftype,
  ST_GeomFromText('LINESTRING (114 35, 115 36, 116 37)', 4326),
  '2010-01-01 14:30'::timestamp,
  '2010-01-01 15:30'::timestamp,
  '{"leafcount":3,"attributes":{"velocity":{"type":"integer","length":2,"nullable":true,"value":[120,130,140]},"accuracy":{"type":"float","length":4,"nullable":false,"value":[120,130,140]},"bearing":{"type":"float","length":8,"nullable":false,"value":[120,130,140]},"vesname":{"type":"string","length":20,"nullable":true,"value":["adsf","sdf","sdfff"]},"active":{"type":"timestamp","nullable":false,"value":["Fri Jan 01 14:30:00 2010","Fri Jan 01 15:00:00 2010","Fri Jan 01 15:30:00 2010"]}},"events":[{"1":"Fri Jan 01 14:30:00 2010"},{"2":"Fri Jan 01 15:00:00 2010"},{"3":"Fri Jan 01 15:30:00 2010"}]}'
);

Sintaks 3 — Membuat trajectory dengan array timestamp eksplisit:

SELECT ST_MakeTrajectory(
  'STPOINT'::leaftype,
  ST_GeomFromText('LINESTRING (114 35, 115 36, 116 37)', 4326),
  ARRAY['2010-01-01 14:30'::timestamp, '2010-01-01 15:00'::timestamp, '2010-01-01 15:30'::timestamp],
  '{"leafcount":3,"attributes":{"velocity":{"type":"integer","length":2,"nullable":true,"value":[120,130,140]},"accuracy":{"type":"float","length":4,"nullable":false,"value":[120,130,140]},"bearing":{"type":"float","length":8,"nullable":false,"value":[120,130,140]},"vesname":{"type":"string","length":20,"nullable":true,"value":["adsf","sdf","sdfff"]},"active":{"type":"timestamp","nullable":false,"value":["Fri Jan 01 14:30:00 2010","Fri Jan 01 15:00:00 2010","Fri Jan 01 15:30:00 2010"]}},"events":[{"1":"Fri Jan 01 14:30:00 2010"},{"2":"Fri Jan 01 15:00:00 2010"},{"3":"Fri Jan 01 15:30:00 2010"}]}'
);

Sintaks 1 dengan atribut null — Lewati data atribut dengan memberikan null untuk attrs_json:

SELECT ST_MakeTrajectory(
  'STPOINT'::leaftype,
  ST_GeomFromText('LINESTRING (114 35, 115 36, 116 37)', 4326),
  '[2010-01-01 14:30, 2010-01-01 15:30)'::tsrange,
  null
);

Output:

{"trajectory":{"leafsize":3,"starttime":"Fri Jan 01 14:30:00 2010","endtime":"Fri Jan 01 15:30:00 2010","spatial":"LINESTRING(114 35,115 36,116 37)","timeline":["Fri Jan 01 14:30:00 2010","Fri Jan 01 15:00:00 2010","Fri Jan 01 15:30:00 2010"]}}

Sintaks 4 — Membuat trajectory dari array koordinat:

SELECT ST_MakeTrajectory(
  'STPOINT'::leaftype,
  ARRAY[1::float8],
  ARRAY[2::float8],
  4326,
  ARRAY['2010-01-01 11:30'::timestamp],
  ARRAY['velocity'],
  ARRAY[1::int4],
  NULL,
  NULL,
  NULL::anyarray
);

Output:

{"trajectory":{"version":1,"type":"STPOINT","leafcount":1,"start_time":"2010-01-01 11:30:00","end_time":"2010-01-01 11:30:00","spatial":"SRID=4326;POINT(1 2)","timeline":["2010-01-01 11:30:00"],"attributes":{"leafcount":1,"velocity":{"type":"integer","length":4,"nullable":true,"value":[1]}}}}

Sintaks 5 — Membuat trajectory dari baris tabel menggunakan array_agg:

-- Buat tabel dan masukkan baris contoh
CREATE TABLE tjrows (t timestamp, x double precision, y double precision, id int, attr text);

INSERT INTO tjrows VALUES
  ('2000-01-01 10:00:00', 3, 5, 1, 'the first point'),
  ('2000-01-01 11:00:00', 4, 6, 2, 'the second point'),
  ('2000-01-01 11:05:00', 5, 7, 3, 'the third point');

-- Buat trajectory. Kolom pertama adalah timestamp, kolom kedua dan ketiga adalah koordinat x/y.
SELECT ST_MakeTrajectory(array_agg(row(tjrows.*)), false, '{"id","attr"}'::cstring[])
FROM tjrows;

Output:

{"trajectory":{"version":1,"type":"STPOINT","leafcount":3,"start_time":"2000-01-01 10:00:00","end_time":"2000-01-01 11:05:00","spatial":"LINESTRING(3 5,4 6,5 7)","timeline":["2000-01-01 10:00:00","2000-01-01 11:00:00","2000-01-01 11:05:00"],"attributes":{"leafcount":3,"id":{"type":"integer","length":4,"nullable":true,"value":[1,2,3]},"attr":{"type":"string","length":64,"nullable":true,"value":["the first point","the second point","the third point"]}}}}