reverseGeocodeLatLng method
This method gets the human readable name of the location. Mostly appears to be the road name and the locality.
Implementation
void reverseGeocodeLatLng(LatLng latLng) async {
try {
final url = Uri.parse("https://maps.googleapis.com/maps/api/geocode/json?"
"latlng=${latLng.latitude},${latLng.longitude}&"
"language=${widget.localizationItem!.languageCode}&"
"key=${widget.apiKey}");
final response = await http.get(url);
if (response.statusCode != 200) {
throw Error();
}
final responseJson = jsonDecode(response.body);
if (responseJson['results'] == null) {
throw Error();
}
final result = responseJson['results'][0];
setState(() {
String name = "";
String? locality,
postalCode,
country,
administrativeAreaLevel1,
administrativeAreaLevel2,
city,
subLocalityLevel1,
subLocalityLevel2;
bool isOnStreet = false;
if (result['address_components'] is List<dynamic> &&
result['address_components'].length != null &&
result['address_components'].length > 0) {
for (var i = 0; i < result['address_components'].length; i++) {
var tmp = result['address_components'][i];
var types = tmp["types"] as List<dynamic>;
var shortName = tmp['short_name'];
if (i == 0) {
// [street_number]
name = shortName;
isOnStreet = types.contains('street_number');
// other index 0 types
// [establishment, point_of_interest, subway_station, transit_station]
// [premise]
// [route]
} else if (i == 1 && isOnStreet) {
if (types.contains('route')) {
name += ", $shortName";
}
} else {
if (types.contains("sublocality_level_1")) {
subLocalityLevel1 = shortName;
} else if (types.contains("sublocality_level_2")) {
subLocalityLevel2 = shortName;
} else if (types.contains("locality")) {
locality = shortName;
} else if (types.contains("administrative_area_level_2")) {
administrativeAreaLevel2 = shortName;
} else if (types.contains("administrative_area_level_1")) {
administrativeAreaLevel1 = shortName;
} else if (types.contains("country")) {
country = shortName;
} else if (types.contains('postal_code')) {
postalCode = shortName;
}
}
}
}
locality = locality ?? administrativeAreaLevel1;
city = locality;
this.locationResult = LocationResult()
..name = name
..locality = locality
..latLng = latLng
..formattedAddress = result['formatted_address']
..placeId = result['place_id']
..postalCode = postalCode
..country = AddressComponent(name: country, shortName: country)
..administrativeAreaLevel1 = AddressComponent(
name: administrativeAreaLevel1,
shortName: administrativeAreaLevel1)
..administrativeAreaLevel2 = AddressComponent(
name: administrativeAreaLevel2,
shortName: administrativeAreaLevel2)
..city = AddressComponent(name: city, shortName: city)
..subLocalityLevel1 = AddressComponent(
name: subLocalityLevel1, shortName: subLocalityLevel1)
..subLocalityLevel2 = AddressComponent(
name: subLocalityLevel2, shortName: subLocalityLevel2);
});
} catch (e) {
print(e);
}
}