reverseGeocode method
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,
);
}
}