mirror of
https://github.com/FoggedLens/deflock-app.git
synced 2026-02-12 16:52:51 +00:00
Merge pull request #3 from stopflock/fix_profiles
profile filtering and submissions fixes
This commit is contained in:
@@ -18,14 +18,16 @@ class PendingUpload {
|
||||
'lat': coord.latitude,
|
||||
'lon': coord.longitude,
|
||||
'dir': direction,
|
||||
'profile': profile.name,
|
||||
'profile': profile.toJson(),
|
||||
'attempts': attempts,
|
||||
};
|
||||
|
||||
factory PendingUpload.fromJson(Map<String, dynamic> j) => PendingUpload(
|
||||
coord: LatLng(j['lat'], j['lon']),
|
||||
direction: j['dir'],
|
||||
profile: CameraProfile.alpr(), // only built‑in for now
|
||||
profile: j['profile'] is Map<String, dynamic>
|
||||
? CameraProfile.fromJson(j['profile'])
|
||||
: CameraProfile.alpr(), // fallback for legacy, more logic can be added
|
||||
attempts: j['attempts'] ?? 0,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -15,21 +15,18 @@ class OverpassService {
|
||||
) async {
|
||||
if (profiles.isEmpty) return [];
|
||||
|
||||
// Build regex of surveillance:type values from enabled profiles
|
||||
final types = profiles
|
||||
.map((p) => p.tags['surveillance:type'])
|
||||
.whereType<String>()
|
||||
.toSet();
|
||||
final regex = types.join('|');
|
||||
// Build one node query per enabled profile (each with all its tags required)
|
||||
final nodeClauses = profiles.map((profile) {
|
||||
final tagFilters = profile.tags.entries
|
||||
.map((e) => '["${e.key}"="${e.value}"]')
|
||||
.join('\n ');
|
||||
return '''node\n $tagFilters\n (${bbox.southWest.latitude},${bbox.southWest.longitude},\n ${bbox.northEast.latitude},${bbox.northEast.longitude});''';
|
||||
}).join('\n ');
|
||||
|
||||
final query = '''
|
||||
[out:json][timeout:25];
|
||||
(
|
||||
node
|
||||
["man_made"="surveillance"]
|
||||
["surveillance:type"~"^(${regex})\$"]
|
||||
(${bbox.southWest.latitude},${bbox.southWest.longitude},
|
||||
${bbox.northEast.latitude},${bbox.northEast.longitude});
|
||||
$nodeClauses
|
||||
);
|
||||
out body 250;
|
||||
''';
|
||||
|
||||
@@ -32,13 +32,16 @@ class Uploader {
|
||||
print('Uploader: Created changeset ID: $csId');
|
||||
|
||||
// 2. create node
|
||||
// Merge tags: direction in PendingUpload should always be present,
|
||||
// and override any in the profile for upload purposes
|
||||
final mergedTags = Map<String, String>.from(p.profile.tags)
|
||||
..['direction'] = p.direction.round().toString();
|
||||
final tagsXml = mergedTags.entries.map((e) =>
|
||||
'<tag k="${e.key}" v="${e.value}"/>').join('\n ');
|
||||
final nodeXml = '''
|
||||
<osm>
|
||||
<node changeset="$csId" lat="${p.coord.latitude}" lon="${p.coord.longitude}">
|
||||
<tag k="man_made" v="surveillance"/>
|
||||
<tag k="surveillance:type" v="ALPR"/>
|
||||
<tag k="camera:type" v="fixed"/>
|
||||
<tag k="direction" v="${p.direction.round()}"/>
|
||||
$tagsXml
|
||||
</node>
|
||||
</osm>''';
|
||||
print('Uploader: Creating node...');
|
||||
|
||||
@@ -46,7 +46,7 @@ class AddCameraSheet extends StatelessWidget {
|
||||
title: const Text('Profile'),
|
||||
trailing: DropdownButton<CameraProfile>(
|
||||
value: session.profile,
|
||||
items: appState.profiles
|
||||
items: appState.enabledProfiles
|
||||
.map((p) => DropdownMenuItem(value: p, child: Text(p.name)))
|
||||
.toList(),
|
||||
onChanged: (p) =>
|
||||
|
||||
Reference in New Issue
Block a user