reverseGeocode method

  1. @override
Future<PowerMapSearchResult?> reverseGeocode(
  1. LatLng location, {
  2. String lang = 'auto',
})
override

Implementation

@override
Future<PowerMapSearchResult?> reverseGeocode(
  LatLng location, {
  String lang = 'auto',
}) async {
  final baseUrl = PowerMapSDK.baseUrl;
  final uri = Uri.parse(
    '$baseUrl/api/v2/map/reverse-geo?lat=${location.latitude}&lon=${location.longitude}',
  );

  try {
    final response = await http.get(
      uri,
      headers: await PowerMapSDK.getServiceHeaders(),
    );

    if (response.statusCode == 200) {
      final data = json.decode(response.body);

      final t = data['tambon_t']?.toString() ?? '';
      final a = data['amphoe_t']?.toString() ?? '';
      final p = data['province_t']?.toString() ?? '';

      final tEn = data['tambon_e']?.toString() ?? '';
      final aEn = data['amphoe_e']?.toString() ?? '';
      final pEn = data['province_e']?.toString() ?? '';

      final addressParts = [t, a, p].where((s) => s.isNotEmpty).toList();
      final addressEnParts = [tEn, aEn, pEn].where((s) => s.isNotEmpty).toList();

      final String addrTh = addressParts.join(', ');
      final String addrEn = addressEnParts.join(', ');
      final String nameThStr = t.isNotEmpty ? t : (a.isNotEmpty ? a : p);
      final String nameEnStr = tEn.isNotEmpty ? tEn : (aEn.isNotEmpty ? aEn : pEn);

      final bool isEn = lang.toLowerCase() == 'en';
      final String nameStr = isEn ? (nameEnStr.isNotEmpty ? nameEnStr : nameThStr) : (nameThStr.isNotEmpty ? nameThStr : nameEnStr);
      final String addressStr = isEn ? (addrEn.isNotEmpty ? addrEn : addrTh) : (addrTh.isNotEmpty ? addrTh : addrEn);

      return PowerMapSearchResult(
        gid: int.tryParse(data['tam_id']?.toString() ?? '0') ?? 0,
        name: nameStr,
        nameEn: nameEnStr,
        nameTh: nameThStr,
        address: addressStr,
        addressEn: addrEn,
        addressTh: addrTh,
        position: location,
        province: p.isNotEmpty ? p : pEn,
        amphoe: a.isNotEmpty ? a : aEn,
        tambon: t.isNotEmpty ? t : tEn,
        postCode: data['postcode']?.toString() ?? '',
        rawData: data,
      );
    } else if (response.statusCode == 401 || response.statusCode == 403) {
      throw PowerMapException(
        code: PowerMapException.auth,
        message:
            'Authentication failed for reverse geocode request. Please check your API keys.',
      );
    } else {
      throw PowerMapException(
        code: PowerMapException.serverError,
        message:
            'Reverse Geocode API returned error status: ${response.statusCode}',
        details: response.body,
      );
    }
  } catch (e) {
    if (e is PowerMapException) rethrow;
    throw PowerMapException(
      code: PowerMapException.network,
      message: 'Reverse geocode request failed due to a network error.',
      details: e,
    );
  }
}