Update: 2026-06-30 23:32:14

This commit is contained in:
Hamza-Ayed
2026-06-30 23:32:15 +03:00
parent 808066f4a6
commit d2ce4bdb16
7 changed files with 277 additions and 17 deletions

View File

@@ -0,0 +1,93 @@
import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:latlong2/latlong.dart';
import 'package:dio/dio.dart';
import 'package:siro_admin/constant/links.dart';
class HeatmapPage extends StatefulWidget {
const HeatmapPage({super.key});
@override
State<HeatmapPage> createState() => _HeatmapPageState();
}
class _HeatmapPageState extends State<HeatmapPage> {
List<CircleMarker> _markers = [];
bool _isLoading = true;
@override
void initState() {
super.initState();
_fetchHeatmapData();
}
Future<void> _fetchHeatmapData() async {
try {
final response = await Dio().get('${AppLink.server}/Admin/geofence/get_heatmap.php?days=7');
if (response.statusCode == 200 && response.data['status'] == 'success') {
final data = response.data['data'] as List;
setState(() {
_markers = data.map((point) {
final lat = double.tryParse(point['latitude'].toString()) ?? 0.0;
final lng = double.tryParse(point['longitude'].toString()) ?? 0.0;
final source = point['source'].toString();
// Color logic:
// Geofence trigger = Green (High intent/Campaign)
// App Usage = Blue (Normal usage)
// Silent Push = Orange (Background wake)
Color markerColor = Colors.blue.withOpacity(0.5);
if (source == 'geofence') {
markerColor = Colors.green.withOpacity(0.7);
} else if (source == 'silent_push') {
markerColor = Colors.orange.withOpacity(0.5);
}
return CircleMarker(
point: LatLng(lat, lng),
color: markerColor,
borderStrokeWidth: 0,
useRadiusInMeter: true,
radius: 150, // 150 meters radius for visualization
);
}).toList();
_isLoading = false;
});
}
} catch (e) {
debugPrint("Error fetching heatmap: $e");
setState(() {
_isLoading = false;
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('خريطة النشاط الحرارية (Heatmap)'),
centerTitle: true,
),
body: _isLoading
? const Center(child: CircularProgressIndicator())
: FlutterMap(
options: const MapOptions(
initialCenter: LatLng(31.9522, 35.9334), // Default to Amman
initialZoom: 12.0,
),
children: [
TileLayer(
urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
userAgentPackageName: 'com.siro.admin',
),
CircleLayer(
circles: _markers,
),
],
),
);
}
}