Один и тот же код дротика выводит разные результаты в Интернете и на мобильных устройствах

Мне нужно декодировать некоторые закодированные строки полилинии в список широты и долготы

Чтобы воспроизвести это странное поведение, скопируйте приведенный ниже код в свою среду IDE и запустите в Dart VM, скопируйте точно такой же код на Dart Pad (веб) и наблюдайте другой результат.

void main() {
  print(PolyUtil.decodePoly("_p~iF~ps|U_ulLnnqC_mqNvxq`@"));
}

class LatLng {
  const LatLng(double latitude, double longitude)
      : assert(latitude != null),
        assert(longitude != null),
        latitude =
            (latitude < -90.0 ? -90.0 : (90.0 < latitude ? 90.0 : latitude)),
        longitude = (longitude + 180.0) % 360.0 - 180.0;

  @override
  String toString() => '$runtimeType($latitude, $longitude)';
  final double latitude;
  final double longitude;
}

class PolyUtil {
  static List<LatLng> decodePoly(String encoded) {
    final List<LatLng> poly = <LatLng>[];
    int index = 0;
    final int len = encoded.length;
    int lat = 0, lng = 0;

    while (index < len) {
      int b, shift = 0, result = 0;
      do {
        b = encoded.codeUnitAt(index++) - 63;
        result |= (b & 0x1f) << shift;
        shift += 5;
      } while (b >= 0x20);
      int dlat = (result & 1) != 0 ? ~(result >> 1) : (result >> 1);
      lat += dlat;

      shift = 0;
      result = 0;
      do {
        b = encoded.codeUnitAt(index++) - 63;
        result |= (b & 0x1f) << shift;
        shift += 5;
      } while (b >= 0x20);
      final int dlng = (result & 1) != 0 ? ~(result >> 1) : (result >> 1);
      lng += dlng;

      final LatLng p = LatLng(lat / 1E5, lng / 1E5);
      poly.add(p);
    }
    return poly;
  }
}

Факт:

На виртуальной машине Dart: [LatLng(38.5, -120.2), LatLng(40.7, -120.95), LatLng(43.252, -126.453)]

В Интернете: [LatLng(38.5, -10.527040000000852), LatLng(40.7, 98.39591999999539), LatLng(43.252, -157.43412000000535)]

В масштабе карты это расхождение оооооооооогромное!

Ожидается

Правильным является вывод на Dart VM. У меня есть некоторые идеи о том, почему я могу быть другим (может быть, с плавающей запятой JS?), но мне нужна помощь, как исправить работу кода на обеих платформах.


person TSR    schedule 04.08.2021    source источник
comment
в этом суть моего вопроса   -  person TSR    schedule 04.08.2021