searchOpenStreetMap static method

Future<Iterable<Endereco>> searchOpenStreetMap(
  1. String query, {
  2. int limit = 5,
  3. bool viaCep = false,
})

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}");
  }
}