Skip to content
Merged
Show file tree
Hide file tree
Changes from 30 commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
80a2229
1849-show-more-trajectory-information: make string as resource
sandradeng20 Dec 3, 2024
bf90357
1849-show-more-trajectory-information: update mapbox secret token set…
sandradeng20 Jan 23, 2025
6001ead
1849-show-more-trajectory-information: fix empty trajectory processing
sandradeng20 Jan 31, 2025
c56a4bc
1849-show-more-trajectory-information: refactor code
sandradeng20 Jan 31, 2025
62ff6d4
1849-show-more-trajectory-information: reformat code
sandradeng20 Jan 31, 2025
a6d0653
Merge branch 'main' into 1849-show-more-trajectory-information
abbybernstein Feb 7, 2025
0c76715
add postgres logic to create layer by activity
abbybernstein Feb 11, 2025
f6591ba
connect trajectory by activity layer to timeline app
abbybernstein Feb 11, 2025
30b4b96
change colors by activity type
abbybernstein Feb 11, 2025
1cadf91
add activity summary functionality
abbybernstein Feb 12, 2025
3d98c44
fix postgres activity type assignment
abbybernstein Feb 18, 2025
4b21e40
add trajectory summary colorcoded
abbybernstein Feb 20, 2025
a5f395c
fix summary updating error
abbybernstein Feb 20, 2025
b4f3f42
fix colors
abbybernstein Feb 20, 2025
d795199
Print trajectory info by session
abbybernstein Feb 26, 2025
5fabc91
add summary to bottom sheet
abbybernstein Feb 27, 2025
c46519b
fix page switch loaidng behavior
abbybernstein Mar 4, 2025
880728f
fix centering trajectory
abbybernstein Mar 4, 2025
3a37197
refactor files
abbybernstein Mar 4, 2025
e8d375a
resolve comments
abbybernstein Mar 6, 2025
1cc4285
resolve comments
abbybernstein Mar 10, 2025
bbe55ea
simplifying sql
abbybernstein Mar 10, 2025
7f06941
interactable trajectoryline
abbybernstein Mar 11, 2025
407e686
fix sql script for layer creation
abbybernstein Mar 13, 2025
935da95
fix sql script
abbybernstein Mar 13, 2025
205fd14
fix trajectory interactability
abbybernstein Mar 13, 2025
f8b3eed
resolve comments
abbybernstein Mar 17, 2025
773669c
update user agent
abbybernstein Mar 17, 2025
dda320e
upate trajectoryqueryagent image
abbybernstein Mar 17, 2025
59a1fa1
Merge branch 'main' into 1849-show-more-trajectory-information
abbybernstein Mar 17, 2025
62242c6
fix errors
abbybernstein Mar 18, 2025
f1b2bff
1849-show-more-trajectory-information: resolve comments
sandradeng20 Mar 19, 2025
b64c5cd
redesign trajectory classes
abbybernstein Mar 24, 2025
f064269
fix xml
abbybernstein Mar 26, 2025
59a9842
clickability fixed
abbybernstein Mar 26, 2025
6a73793
fix trajectory line clicking
abbybernstein Apr 1, 2025
c65834b
resolve comments
abbybernstein Apr 1, 2025
e9ef455
resolve comments
abbybernstein Apr 2, 2025
a6a2ffd
resolve comments
abbybernstein Apr 2, 2025
f1a34ce
fix error
abbybernstein Apr 2, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Agents/SensorLoggerMobileAppAgent/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ WORKDIR /root/sensorloggermobileappagent

# #==================================================================================================
# Copy the compiled jar from the builder
COPY --from=builder /root/sensorloggermobileappagent/output/SensorLoggerMobileAppAgent##5.0.0.war $CATALINA_HOME/webapps/
COPY --from=builder /root/sensorloggermobileappagent/output/SensorLoggerMobileAppAgent##*.war $CATALINA_HOME/webapps/
COPY ./docker/entrypoint.sh entrypoint.sh

# Port for Java debugging
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,17 @@ BEGIN
RETURN CONCAT('https://www.theworldavatar.com/kg/sensorloggerapp/sessionID_', device_id);
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION get_activity_type_iri(device_id VARCHAR)
RETURNS VARCHAR AS $$
BEGIN
RETURN CONCAT('https://www.theworldavatar.com/kg/sensorloggerapp/activity_type_', device_id);
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION get_confidence_level_iri(device_id VARCHAR)
RETURNS VARCHAR AS $$
BEGIN
RETURN CONCAT('https://www.theworldavatar.com/kg/sensorloggerapp/confidence_level_', device_id);
END;
$$ LANGUAGE plpgsql;
Original file line number Diff line number Diff line change
Expand Up @@ -155,4 +155,4 @@ target sensorloggerapp:smartphone_{device_id} ontodevice:detectedByDevice s
sensorloggerapp:activity_type_{device_id} a ontodevice:ActivityType .
sensorloggerapp:confidence_level_{device_id} a ontodevice:ConfidenceLevel .
source SELECT device_id, sensor_class FROM devices WHERE sensor_class='Activity'
]]
]]
2 changes: 1 addition & 1 deletion Agents/TrajectoryQueryAgent/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ WORKDIR /root/trajectoryqueryagent

# #==================================================================================================
# Copy the compiled jar from the builder
COPY --from=builder /root/trajectoryqueryagent/output/trajectoryqueryagent##1.0.2.war $CATALINA_HOME/webapps/
COPY --from=builder /root/trajectoryqueryagent/output/trajectoryqueryagent##*.war $CATALINA_HOME/webapps/
COPY ./docker/entrypoint.sh entrypoint.sh

# Port for Java debugging
Expand Down
2 changes: 1 addition & 1 deletion Agents/TrajectoryQueryAgent/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
services:
trajectoryqueryagent:
image: ghcr.io/cambridge-cares/trajectoryqueryagent:4.1.1
image: ghcr.io/cambridge-cares/trajectoryqueryagent:4.2.0
build: .
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"Name": "trajectoryqueryagent",
"TaskTemplate": {
"ContainerSpec": {
"Image": "ghcr.io/cambridge-cares/trajectoryqueryagent:4.0.0",
"Image": "ghcr.io/cambridge-cares/trajectoryqueryagent:4.2.0",
"Env": [
"KEYCLOAK_SERVER=http://host.docker.internal:8080",
"KEYCLOAK_REALM=twa-test",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"Name": "trajectoryqueryagent",
"TaskTemplate": {
"ContainerSpec": {
"Image": "ghcr.io/cambridge-cares/trajectoryqueryagent:4.0.0",
"Image": "ghcr.io/cambridge-cares/trajectoryqueryagent:4.2.0",
"Env": [
"KEYCLOAK_SERVER=http://host.docker.internal:8080",
"KEYCLOAK_REALM=twa-test"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ public JSONObject getDatesWithData(String timezone, String userId) {
response.put("message", "Succeed");
response.put("result", result);
} else {
response.put("message", "Faile");
response.put("message", "Failed");
}

return response;
Expand Down Expand Up @@ -236,6 +236,32 @@ private void createGeoserver() {
geoServerClient.createPostGISLayer(workspaceName, dbName, "trajectoryUserIdLineSegments",
geoServerVectorSettings);
}


String lineLayerUserIdByActivity = null;
try (InputStream is = new ClassPathResource("line_layer_user_id_by_activity.sql").getInputStream()) {
lineLayerUserIdByActivity = IOUtils.toString(is, StandardCharsets.UTF_8);
} catch (IOException e) {
LOGGER.error("failed to read line_layer_user_id_by_activity.sql");
LOGGER.error(e.getMessage());
}

if (lineLayerUserIdByActivity != null) {
geoServerClient.createWorkspace(workspaceName);
UpdatedGSVirtualTableEncoder virtualTable = new UpdatedGSVirtualTableEncoder();
GeoServerVectorSettings geoServerVectorSettings = new GeoServerVectorSettings();
virtualTable.setSql(lineLayerUserIdByActivity);
virtualTable.setEscapeSql(true);
virtualTable.setName("line_layer_user_id_by_activity_table");
virtualTable.addVirtualTableGeometry("geom", "Geometry", "4326");
virtualTable.addVirtualTableParameter("user_id", "null", ".*");
virtualTable.addVirtualTableParameter("upperbound", "0", "^(0|[1-9][0-9]*)$");
virtualTable.addVirtualTableParameter("lowerbound", "0", "^(0|[1-9][0-9]*)$");
geoServerVectorSettings.setVirtualTable(virtualTable);
geoServerClient.createPostGISDataStore(workspaceName, "trajectory", dbName, schema);
geoServerClient.createPostGISLayer(workspaceName, dbName, "trajectoryUserIdByActivity", geoServerVectorSettings);
}

}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,42 @@ BEGIN
RETURN QUERY EXECUTE query;
END $$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION get_activity_table(
device_id_array TEXT[]
)
RETURNS TABLE (
"time" bigint,
"activity_type" VARCHAR,
"confidence_level" integer,
"device_id" TEXT,
"user_id" TEXT
) AS $$
DECLARE
query TEXT := '';
BEGIN
FOR i IN 1..array_length(device_id_array, 1) LOOP
IF i > 1 THEN
query := query || ' UNION ALL ';
END IF;

device_id := device_id_array[i];


query := query || format(
'SELECT time, %I AS activity_type, %I ::INTEGER AS confidence_level, %L AS device_id, %L AS user_id FROM %I WHERE time_series_iri = %L',
get_column_name(get_activity_type_iri(device_id)),
get_column_name(get_confidence_level_iri(device_id)),
device_id,
get_user_id(device_id),
get_table_name(get_activity_type_iri(device_id)),
get_time_series(get_activity_type_iri(device_id))
);
END LOOP;

RETURN QUERY EXECUTE query;
END $$ LANGUAGE plpgsql;


-- used by timeline app only
CREATE OR REPLACE FUNCTION get_device_ids(id VARCHAR)
RETURNS TEXT AS
Expand All @@ -152,3 +188,45 @@ BEGIN
END;
$$
LANGUAGE plpgsql;


CREATE OR REPLACE FUNCTION fill_activity_types(activity_types varchar[], times bigint[])
RETURNS TABLE (
"time" bigint,
"activity_type" VARCHAR
) AS $$
DECLARE
result varchar[] := '{}';
last_valid varchar := '';
activity varchar;
activity_time bigint;
i integer := 1;
BEGIN

FOREACH activity IN ARRAY activity_types
LOOP
IF activity <> 'others' THEN
last_valid := activity;
EXIT;
END IF;
END LOOP;

FOREACH activity IN ARRAY activity_types
LOOP
IF activity <> 'others' THEN
last_valid := activity;
END IF;

result := array_append(result, last_valid);
END LOOP;

FOR i IN 1..array_length(times, 1)
LOOP
activity_time := times[i];
RETURN QUERY SELECT activity_time, result[i];
END LOOP;

RETURN;
END;
$$
LANGUAGE plpgsql
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,20 @@ timeseries AS (
)

SELECT
MIN(time) AS start_time,
MAX(time) AS end_time,
ST_MakeLine(geom) as geom,
CONCAT('https://w3id.org/MON/person.owl#person_', '%user_id%') AS iri
CONCAT('https://w3id.org/MON/person.owl#person_', '%user_id%') AS iri,
session_id AS session_id,
1 AS id,
ST_Length(ST_Transform(ST_MakeLine(ARRAY_AGG(geom ORDER BY time)), 3857))::INTEGER AS distance_traveled
FROM
timeseries ts
WHERE
('%user_id%' = '' OR user_id = '%user_id%')
AND (%lowerbound% = 0 OR time > %lowerbound%)
AND (%upperbound% = 0 OR time < %upperbound%)
AND ('%lowerbound%' = '0' OR ts.time > '%lowerbound%'::BIGINT)
AND ('%upperbound%' = '0' OR ts.time < '%upperbound%'::BIGINT)
GROUP BY
ts.session_id
ORDER BY start_time

Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
WITH distinct_devices AS (
SELECT
array_agg(device_id::text) AS device_list
FROM
(SELECT DISTINCT device_id
FROM devices
WHERE sensor_class = 'Activity') AS distinct_devices
),

timeseries AS (
SELECT
*
FROM
public.get_location_table((SELECT device_list FROM distinct_devices)) AS timeseries
ORDER BY time
),

activity_data AS (
SELECT
*
FROM
public.get_activity_table((SELECT device_list FROM distinct_devices)) AS activity_data
ORDER BY time
),

joined_data AS (
SELECT
t.*,
a.activity_type,
a.confidence_level,
LAG(t.time) OVER (PARTITION BY t.user_id ORDER BY t.time) AS prev_time
FROM
timeseries t
LEFT JOIN
activity_data a
ON
ABS(t.time - a.time) <= 5000
ORDER BY t.time
),

fixed_activity_data AS (
SELECT
time,
speed,
altitude,
geom,
bearing,
session_id,
user_id,
confidence_level,
COALESCE(activity_type, 'others') AS activity_type
FROM joined_data
WHERE time <> prev_time
),

temp_activity_table AS (
SELECT * FROM fill_activity_types(
(SELECT array_agg(activity_type ORDER BY time) FROM fixed_activity_data),
(SELECT array_agg(time ORDER BY time) FROM fixed_activity_data)
)
),

filled_activity_data AS (
SELECT
fixed.time AS time,
fixed.speed AS speed,
fixed.altitude AS altitude,
fixed.geom AS geom,
fixed.bearing AS bearing,
fixed.session_id AS session_id,
fixed.user_id AS user_id,
temp.activity_type AS activity_type,
fixed.confidence_level AS confidence_level
FROM fixed_activity_data AS fixed
JOIN temp_activity_table AS temp
ON fixed.time = temp.time
ORDER BY time
),

change_marked AS (
SELECT
*,
CASE
WHEN
LAG(activity_type) OVER (PARTITION BY user_id ORDER BY time) IS DISTINCT FROM activity_type
THEN 1
ELSE 0
END AS change_flag
FROM filled_activity_data
),

change_marked_union AS (
SELECT * FROM change_marked
UNION ALL
SELECT time, speed, altitude, geom, bearing, session_id, user_id,
LAG(activity_type) OVER (PARTITION BY user_id ORDER BY time), confidence_level, 0
FROM change_marked WHERE change_flag = 1
ORDER BY time, change_flag
),

numbered_activity_data AS (
SELECT
*,
SUM(change_flag) OVER (PARTITION BY user_id ORDER BY time ROWS UNBOUNDED PRECEDING) AS id
FROM change_marked_union cm
WHERE activity_type IS NOT NULL
ORDER BY cm.time, cm.change_flag
)

SELECT
id,
MIN(na.time) AS start_time,
MAX(na.time) AS end_time,
user_id,
activity_type,
session_id,
ST_MakeLine(geom) as geom,
ST_Length(ST_Transform(ST_MakeLine(geom), 3857))::INTEGER AS distance_traveled,
CONCAT('https://w3id.org/MON/person.owl#person_', user_id) AS iri
FROM
numbered_activity_data na
WHERE
('%user_id%' = '' OR user_id = '%user_id%')
AND ('%lowerbound%' = '0' OR na.time > '%lowerbound%'::BIGINT)
AND ('%upperbound%' = '0' OR na.time < '%upperbound%'::BIGINT)
GROUP BY
na.id, na.activity_type, na.user_id, na.session_id
ORDER BY start_time
Loading