Merge pull request #3 from stopflock/fix_profiles

profile filtering and submissions fixes
This commit is contained in:
stopflock
2025-08-05 17:40:45 -05:00
committed by GitHub
4 changed files with 20 additions and 18 deletions

View File

@@ -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 builtin 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,
);
}

View File

@@ -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;
''';

View File

@@ -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...');

View File

@@ -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) =>