searchOpenStreetMap static method
Busca endereços no Nominatim do OpenStreetMap a partir de um texto de busca.
A busca retorna uma lista de endereços correspondentes ao texto de busca.
Parâmetros: - query: O texto de busca. - limit: O número máximo de resultados (padrão é 5). - viaCep: Indica se deve buscar o endereço via CEP (padrão é false).
Retorna: - Uma lista de endereços correspondentes ao texto de busca.
Implementation
static Future<Iterable<Endereco>> searchOpenStreetMap(String query, {int limit = 5, bool viaCep = false}) async {
var url = Uri.parse("https://nominatim.openstreetmap.org/search?format=json&addressdetails=1&limit=$limit&q=$query");
var response = await http.get(url);
if (response.statusCode == 200) {
var json = response.body;
JsonTable data = JsonTable.from(jsonDecode(json));
var futures = data.where((x) => (x['address']?['country_code'] ?? "") == "br").map((e) async {
try {
var numero = query.getUniqueWords.firstWhereOrNull((x) => x.isNumber) ?? "";
Endereco? viacepEndereco;
var cep = e['address']['postcode'];
if (viaCep && Brasil.validarCEP(cep)) {
viacepEndereco = await Brasil.pesquisarCEP(cep, numero);
}
var cidade = viacepEndereco?.cidade ?? await Cidade.pegar(e['address']['city_district'], e['address']['state']) ?? await Cidade.pegar(e['address']['village'], e['address']['state']) ?? await Cidade.pegar(e['address']['municipality'], e['address']['state']);
return Endereco(
cep: viacepEndereco?.cep ?? e['address']['postcode'],
logradouro: viacepEndereco?.logradouro ?? e['address']['road'] ?? "",
bairro: viacepEndereco?.bairro ?? e['address']['neighbourhood'] ?? "",
cidade: cidade,
numero: viacepEndereco?.numero ?? numero,
complemento: viacepEndereco?.complemento ?? "",
siafi: viacepEndereco?.siafi,
ddd: viacepEndereco?.ddd,
gia: viacepEndereco?.gia,
latitude: double.tryParse(e['lat']) ?? 0,
longitude: double.tryParse(e['lon']) ?? 0,
);
} on Exception catch (e) {
consoleLog(e);
return null;
}
});
return (await Future.wait(futures)).nonNulls;
} else {
throw Exception("Erro ao buscar o endereço: ${response.statusCode}");
}
}