Мне нужно декодировать некоторые закодированные строки полилинии в список широты и долготы
Чтобы воспроизвести это странное поведение, скопируйте приведенный ниже код в свою среду 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?), но мне нужна помощь, как исправить работу кода на обеих платформах.