reverseGeocode method

Future<Map<String, dynamic>?> reverseGeocode({
  1. 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;
  }
}