reverseGeocode method
- required RaliPosition position,
Reverse geocoding (coordinates to address) - uses RaliPosition
Implementation
Future<Map<String, dynamic>?> reverseGeocode({required RaliPosition position}) async {
try {
// Directly use the RaliPosition for coordinate formatting
final coordsString = '${position.lng},${position.lat}';
final url = Uri.https(_baseUrl, '$_geocodingPath/$coordsString.json', {
'access_token': accessToken,
'limit': '1',
});
final response = await http.get(url);
if (response.statusCode == 200) {
final data = json.decode(response.body);
if (data['features'] != null && data['features'].isNotEmpty) {
final feature = data['features'][0];
final context = feature['context'] ?? [];
// Extract specific address components
final addressComponents = <String, String>{};
for (final item in context) {
final id = item['id'] as String;
if (id.startsWith('country')) {
addressComponents['country'] = item['text'];
} else if (id.startsWith('region')) {
addressComponents['region'] = item['text'];
} else if (id.startsWith('place')) {
addressComponents['place'] = item['text'];
} else if (id.startsWith('district')) {
addressComponents['district'] = item['text'];
} else if (id.startsWith('postcode')) {
addressComponents['postcode'] = item['text'];
}
}
// Add position to return value for reference
return {
'place_name': feature['place_name'],
'address_components': addressComponents,
'features': data['features'],
'position': {
'lng': position.lng,
'lat': position.lat
}
};
}
}
return null;
} catch (e) {
print('Reverse geocoding error: $e');
return null;
}
}