decodePolyline static method

List<LatLngModel> decodePolyline(
  1. String encoded
)

Implementation

static List<LatLngModel> decodePolyline(String encoded) {
  // Lista para almacenar los puntos decodificados
  List<LatLngModel> points = [];
  int index = 0, len = encoded.length;
  int lat = 0, lng = 0;

  // Inicializar constantes BigInt para las operaciones bit a bit
  BigInt big0 = BigInt.from(0);
  BigInt big0x1f = BigInt.from(0x1f);
  BigInt big0x20 = BigInt.from(0x20);

  // Bucle a través de la cadena codificada
  while (index < len) {
    int shift = 0;
    BigInt b, result;
    result = big0;

    // Decodificar la parte del delta de la latitud
    do {
      b = BigInt.from(encoded.codeUnitAt(index++) - 63);
      result |= (b & big0x1f) << shift;
      shift += 5;
    } while (b >= big0x20);

    // Ajustar el resultado para obtener el valor real
    BigInt rShifted = result >> 1;
    int dLat;
    if (result.isOdd) {
      dLat = (~rShifted).toInt();
    } else {
      dLat = rShifted.toInt();
    }
    lat += dLat;

    // Reiniciar las variables para la longitud
    shift = 0;
    result = big0;

    // Decodificar la parte del delta de la longitud
    do {
      b = BigInt.from(encoded.codeUnitAt(index++) - 63);
      result |= (b & big0x1f) << shift;
      shift += 5;
    } while (b >= big0x20);

    // Ajustar el resultado para obtener el valor real
    rShifted = result >> 1;
    int dLng;
    if (result.isOdd) {
      dLng = (~rShifted).toInt();
    } else {
      dLng = rShifted.toInt();
    }
    lng += dLng;

    // Agregar el punto decodificado a la lista
    points.add(LatLngModel((lat / 1E5).toDouble(), (lng / 1E5).toDouble()));
  }

  // Devolver la lista de puntos decodificados
  return points;
}