1+ import 'package:latlong2/latlong.dart' ;
2+ import 'package:netmanager/types/database/cell_tower.dart' ;
3+ import 'package:netmanager/types/database/database_cell.dart' ;
14import 'package:sqflite/sqflite.dart' ;
25
36class CellDatabase {
@@ -32,6 +35,11 @@ class CellDatabase {
3235 await db.execute (
3336 "CREATE INDEX idx_cells_plmn_cid ON cells (plmn, cid)" ,
3437 );
38+
39+ // check shared preferences for map feature!!
40+ await db.execute (
41+ "CREATE INDEX idx_cells_plmn_lat_lng ON cells (plmn, latitude, longitude)" ,
42+ );
3543 },
3644 );
3745 }
@@ -40,16 +48,17 @@ class CellDatabase {
4048 String plmn,
4149 Set <int > targetCids,
4250 ) async {
43- if (_database == null || targetCids.isEmpty || plmn.isEmpty) return {};
51+ if (targetCids.isEmpty || plmn.isEmpty) return {};
52+ Database db = await getDatabase ();
4453
4554 final Map <int , String > results = {};
4655 final String idPlaceholders = targetCids.map ((_) => "?" ).join (", " );
4756
48- final List <Map <String , dynamic >> records = await _database ! .rawQuery (
57+ final List <Map <String , dynamic >> records = await db .rawQuery (
4958 '''
50- SELECT cid, description FROM cells
51- WHERE plmn = ? AND cid IN ($idPlaceholders )
52- ''' ,
59+ SELECT cid, description FROM cells
60+ WHERE plmn = ? AND cid IN ($idPlaceholders )
61+ ''' ,
5362 [plmn, ...targetCids],
5463 );
5564
@@ -63,4 +72,61 @@ class CellDatabase {
6372
6473 return results;
6574 }
75+
76+ static Future <List <CellTower >> fetchMapCellTowers ({
77+ required String plmn,
78+ required double minLat,
79+ required double maxLat,
80+ required double minLng,
81+ required double maxLng,
82+ }) async {
83+ if (plmn.isEmpty) return [];
84+ Database db = await getDatabase ();
85+
86+ final List <Map <String , dynamic >> records = await db.rawQuery (
87+ '''
88+ SELECT cid, networkgen, latitude, longitude, description, channelnumber
89+ FROM cells
90+ WHERE plmn = ?
91+ AND latitude BETWEEN ? AND ?
92+ AND longitude BETWEEN ? AND ?
93+ LIMIT 500
94+ ''' ,
95+ [plmn, minLat, maxLat, minLng, maxLng],
96+ );
97+
98+ final Map <String , List <DatabaseCell >> groupedTowers = {};
99+ final Map <String , LatLng > coordinateMap = {};
100+
101+ for (final row in records) {
102+ final double lat = (row["latitude" ] as num ).toDouble ();
103+ final double lng = (row["longitude" ] as num ).toDouble ();
104+
105+ final String shortCoords =
106+ "${lat .toStringAsFixed (5 )}_${lng .toStringAsFixed (5 )}" ;
107+
108+ final cell = DatabaseCell (
109+ cid: row["cid" ] as int ,
110+ networkGen: row["networkgen" ] as int ,
111+ description: row["description" ] as String ? ?? "" ,
112+ channelNumber: row["channelnumber" ] as int ? ,
113+ );
114+
115+ if (! groupedTowers.containsKey (shortCoords)) {
116+ groupedTowers[shortCoords] = [];
117+ coordinateMap[shortCoords] = LatLng (lat, lng);
118+ }
119+
120+ groupedTowers[shortCoords]! .add (cell);
121+ }
122+
123+ return groupedTowers.entries.map ((entry) {
124+ final coords = coordinateMap[entry.key]! ;
125+ return CellTower (
126+ latitude: coords.latitude,
127+ longitude: coords.longitude,
128+ cells: entry.value,
129+ );
130+ }).toList ();
131+ }
66132}
0 commit comments