# Create geospatial time series properties with Pipeline Builder The pipeline you create in [Pipeline Builder](../../pipeline-builder/overview/index.md) with this guide will generate [time series data](../time-series-concepts-glossary/index.md#time-series-object-type-backing-dataset) from raw location updates and prepare the object backing dataset with series ID references. This data will back a [time series sync](../time-series-concepts-glossary/index.md#time-series-sync) to associate with [time series properties](../time-series-concepts-glossary/index.md#time-series-property-tsp) on the `Ship` object type. ![A pipeline canvas displays an end-to-end geospatial time series pipeline.](../../../assets/f282d0174f26e93f6a92f0e75c980d4c10e9bb7a85ab02bcdf4bb7064274c0da.webp) The notional raw location dataset used in this example includes the following columns: * **ship\_id:** `string` | A unique identifier for each ship. * **timestamp:** `timestamp` | The time at which the location was recorded. * **longitude:** `double` | The longitude of the ship at the recorded time. * **latitude:** `double` | The latitude of the ship at the recorded time. You can copy the raw data below and import it as a dataset in Foundry before adding it to a new pipeline in Pipeline Builder:
ship_id timestamp longitude latitude
ship-001 2025-01-01 08:00:00 139.7492 35.7607
ship-001 2025-01-01 14:00:00 140.0097 35.2652
ship-001 2025-01-01 20:00:00 139.5932 35.7231
ship-002 2025-01-02 08:00:00 135.7609 35.1223
ship-002 2025-01-02 14:00:00 135.9821 35.3055
ship-002 2025-01-02 20:00:00 136.2015 35.4878
## Part I: Transform time series data Using the raw location dataset, apply the following transforms in Pipeline Builder to create a time series sync-compatible dataset. ### 1. Unpivot latitude and longitude columns Since the dataset contains both latitude and longitude as separate columns, use an **Unpivot** transform to merge them into a single value column. This is necessary to match the [required schema for a time series sync](../time-series-syncs/index.md). With the dataset added to your pipeline, add a transform node to **Unpivot** the `latitude` and `longitude` columns into a new `series_name` **Name column** and `series_value` **Value column**. ![The Unpivot transform is displayed in Pipeline Builder.](../../../assets/b1371f8890fb49fa94a513691aa51aa831cc47a56c36f7d554dd4fba1bb84d43.webp) ### 2. Create a `series_id` column using the Concatenate strings transform Next, add a transform node to concatenate the `series_name` and `ship_id` columns to create a new `series_id` column using the **Concatenate strings** transform. ![The Concatenate strings transform is displayed in Pipeline Builder.](../../../assets/5aff3aeb94344d18e4d54fd68721abda6412571ab9764ec87fa69d27b71f743d.webp) ### 3. Create the object backing dataset Next, you will use the **Drop columns**, **Concatenate strings**, and **Drop duplicates** transforms to create the `Ship` object type's backing dataset. After you complete these transformations in your pipeline, your dataset will contain the following schema and values:
longitude_series_id latitude_series_id ship_id
longitude_ship-001 latitude_ship-001 ship-001
longitude_ship-002 latitude_ship-002 ship-002
Add a transform node and apply the transforms listed above. * **Drop columns:** Drop the `timestamp`, `series_value`, `series_name`, and `series_id` columns. * **Concatenate strings:** Use an underscore as the **Separator** to concatenate the `latitude` and `longitude` columns with `ship_id` in separate transform blocks. * **Drop duplicates:** Drop the `ship_id` column after it is used in the concatenation with `latitude` and `longitude`. ![The Drop columns, Concatenate strings, and Drop duplicates transforms are displayed in a transform node in Pipeline Builder.](../../../assets/c502cefda2467b50271409bac44194880bf8222fc47634ce636227b60a387866.webp) After you configure the transforms, navigate back to your pipeline's canvas and choose **Add output** > **New dataset** from the newly created transform node to output a dataset to back the object type. ![The Add output menu on a transform node in Pipeline Builder is displayed.](../../../assets/f796ba9aaf9e175c95870a3ae22325199c97798e6dcd5fab2cee23c78d467e3a.webp) Give your dataset a descriptive name, such as `cleansed-ship-information-dataset`. Select **Save** in the top ribbon and **Deploy** your pipeline to create the dataset. ### 4. Drop `ship_id` and `series_name` before casting `series_value` to `Double` With your object type's backing dataset created, navigate back to the transform node you created in [step two](#2-create-a-series_id-column-using-the-concatenate-strings-transform) to create your time series sync. ![A transform node where a user concatenated dataset strings is highlighted on a Pipeline Builder canvas.](../../../assets/247710318f61552642a8886f1e5f3fa96ed082c2ce4552b714da8de7fbed94da.webp) Now that the `series_id` and `series_value` columns are derived from and supersede the `ship_id` and `series_name`, add a transform node to drop `ship_id` and `series_name` then cast `series_value` to type `Double`. This enables you to output a time series sync from your cleansed dataset which will back **Track Latitude** and **Track Longitude** properties on a [track object](../../map/integrate-objects/index.md#track-objects). ![The Drop columns and Cast to double transforms are displayed in Pipeline Builder.](../../../assets/f69c9cecccfc37a57972b33d9a781bf58c8e5d2a5ec631df2feb7dfe44265c4d.webp) ## Part II: Create the time series sync You can reference similar instructions in the [time series properties use case tutorial](../time-series-properties-use-case-pipeline/index.md#part-ii-create-the-time-series-sync). However, the instructions below provide guidance specific to this `Ship` geospatial object type example. You can choose to output a new *dataset* instead of a time series sync. However, outputting a time series sync in Pipeline Builder will save you a step during the [Ontology configuration phase](../geospatial-time-series-ontology/index.md). To output a time series sync from your cleansed dataset, select the final transform node on your pipeline's canvas and choose **Add output** > **New time series sync**. Next, populate the **Series ID**, **Time**, and **Value** options in the **Pipeline Outputs** drawer that renders on the right side of your pipeline with your cleansed dataset's `series_id`, `timestamp`, and `series_value` columns. Save and deploy your pipeline to create a time series sync. ![The Add output menu in Pipeline Builder is displayed.](../../../assets/d5dd12c0728d9a309c9cb386f1dbbfccfbf38c3e6c5a0cd704a817777dded0db.webp) Foundry saves your newly created time series sync in the same [Compass folder](../../compass/overview/index.md) as your pipeline. ![A time series sync is displayed.](../../../assets/53a08797cff29df15a5733cf8b19562219d164d54febf7224f8c030b33c3e6c6.webp) With your time series sync created, you can now create and configure an [object type in your Ontology that contains the time series sync as time series properties](../geospatial-time-series-ontology/index.md).