Skip to main content

Camera Routes

RESTful API endpoints for querying traffic camera entities (TrafficFlowObserved) with geo-spatial filtering, image URL retrieval, and real-time traffic metrics.

Base Path​

/api/cameras

Endpoints Summary​

MethodEndpointDescription
GET/List all cameras
GET/:idGet camera by ID
GET/nearFind cameras near location
GET/bboxGet cameras in bounding box
GET/:id/imageGet camera image URL
GET/:id/metricsGet traffic metrics

Endpoints​

GET /api/cameras​

List all cameras with optional filters.

Query Parameters:

ParameterTypeDefaultDescription
limitnumber100Maximum results
offsetnumber0Skip N results
statusstring-Filter: online, offline
typestring-Filter: PTZ, Static, Dome
includeMetricsbooleanfalseInclude traffic metrics

Response:

{
"success": true,
"data": [
{
"id": "urn:ngsi-ld:Camera:001",
"name": "Camera Nguyen Hue",
"location": {
"latitude": 10.7731,
"longitude": 106.7030
},
"imageUrl": "http://camera.hcmc.vn/001/live.jpg",
"status": "online",
"type": "PTZ",
"dateModified": "2025-11-29T10:30:00.000Z"
}
],
"meta": {
"total": 520,
"limit": 100,
"offset": 0
}
}

Example:

curl "http://localhost:5000/api/cameras?limit=10&status=online"

GET /api/cameras/:id​

Get a specific camera by ID.

Path Parameters:

ParameterTypeDescription
idstringCamera URN (e.g., urn:ngsi-ld:Camera:001)

Response:

{
"success": true,
"data": {
"id": "urn:ngsi-ld:Camera:001",
"name": "Camera Nguyen Hue",
"location": {
"latitude": 10.7731,
"longitude": 106.7030
},
"imageUrl": "http://camera.hcmc.vn/001/live.jpg",
"status": "online",
"roadSegment": "urn:ngsi-ld:RoadSegment:nguyen-hue",
"dateModified": "2025-11-29T10:30:00.000Z"
}
}

Error Response (404):

{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Camera not found"
}
}

GET /api/cameras/near​

Find cameras near a geographic location using Haversine distance.

Query Parameters:

ParameterTypeRequiredDescription
latnumberYesLatitude (WGS84)
lonnumberYesLongitude (WGS84)
maxDistancenumberNoSearch radius in meters (default: 5000)
limitnumberNoMaximum results (default: 50)

Response:

{
"success": true,
"data": [
{
"id": "urn:ngsi-ld:Camera:001",
"name": "Camera Nguyen Hue",
"location": {
"latitude": 10.7731,
"longitude": 106.7030
},
"distance": 250.5,
"imageUrl": "http://camera.hcmc.vn/001/live.jpg"
}
],
"meta": {
"center": { "lat": 10.77, "lon": 106.70 },
"radius": 5000,
"found": 15
}
}

Example:

curl "http://localhost:5000/api/cameras/near?lat=10.77&lon=106.70&maxDistance=2000"

GET /api/cameras/bbox​

Get cameras within a bounding box.

Query Parameters:

ParameterTypeRequiredDescription
bboxstringYesminLat,minLon,maxLat,maxLon

Example:

curl "http://localhost:5000/api/cameras/bbox?bbox=10.7,106.6,10.9,106.8"

GET /api/cameras/:id/image​

Get the latest image URL for a camera.

Response:

{
"success": true,
"data": {
"cameraId": "urn:ngsi-ld:Camera:001",
"imageUrl": "http://camera.hcmc.vn/001/live.jpg?t=1705312200",
"capturedAt": "2025-11-29T10:30:00.000Z",
"resolution": "1920x1080"
}
}

GET /api/cameras/:id/metrics​

Get traffic metrics observed by the camera.

Response:

{
"success": true,
"data": {
"cameraId": "urn:ngsi-ld:Camera:001",
"observedAt": "2025-11-29T10:30:00.000Z",
"intensity": 85,
"occupancy": 0.65,
"averageSpeed": 35.5,
"vehicleCount": 42,
"congestionLevel": "moderate"
}
}

Haversine Distance Calculation​

The /near endpoint uses Haversine formula to calculate distances:

function haversineDistance(lat1: number, lng1: number, lat2: number, lng2: number): number {
const R = 6371000; // Earth radius in meters
const Ο†1 = (lat1 * Math.PI) / 180;
const Ο†2 = (lat2 * Math.PI) / 180;
const Δφ = ((lat2 - lat1) * Math.PI) / 180;
const Δλ = ((lng2 - lng1) * Math.PI) / 180;

const a =
Math.sin(Δφ / 2) * Math.sin(Δφ / 2) +
Math.cos(Ο†1) * Math.cos(Ο†2) * Math.sin(Δλ / 2) * Math.sin(Δλ / 2);

const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));

return R * c;
}

Data Flow​

sequenceDiagram
participant Client
participant Route as cameraRoutes
participant Service as StellioService
participant Stellio

Client->>Route: GET /api/cameras/near?lat=10.77&lon=106.70
Route->>Service: getCameras()
Service->>Stellio: GET /entities?type=Camera
Stellio-->>Service: NGSI-LD entities
Service-->>Route: Camera[]
Route->>Route: Filter by distance
Route->>Route: Sort by distance
Route-->>Client: JSON response

References​