getPolyline method
Get polyline points
Implementation
Future<List<LatLng>> getPolyline(List<LatLng> points) async {
if (points.isEmpty) return [];
// 1. Check local db
try {
final data = await _dbService.getPolyline(
points.map((e) => {'lat': e.latitude, 'lng': e.longitude}).toList(),
);
if (data != null) {
return data.map((e) => LatLng(e['lat'], e['lng'])).toList();
}
} catch (e, st) {
_logService.logError(e, st);
}
// 2. Get polyline between two points
final List<LatLng> polylinePoints = [];
for (int i = 0; i < points.length - 1; i++) {
final sLat = points[i].latitude;
final sLng = points[i].longitude;
final eLat = points[i + 1].latitude;
final eLng = points[i + 1].longitude;
// 2a. Wait for new request
final success = await _waitForNewRequest(RequestType.routing);
if (!success) return [];
// 2b. Get polyline data
final res = await _apiService.request(
userAgent: _userAgent ?? _systemService.userAgent,
url:
'${_polylineURL.url}/$sLng,$sLat;$eLng,$eLat?overview=full&geometries=geojson',
);
// 2c. Parse response
try {
final points = res.data['routes'][0]['geometry']['coordinates'] as List;
polylinePoints.addAll(points.map((e) => LatLng(e[1], e[0])));
} catch (e, st) {
_logService.logError(
e,
st,
res: res.toString(),
req:
'points: ${points.map((e) => '(${e.latitude},${e.longitude})').join(' | ')}',
);
return [];
}
}
if (polylinePoints.isEmpty) return [];
// 3. Save to local db
try {
await _dbService.savePolyline(
points.map((e) => {'lat': e.latitude, 'lng': e.longitude}).toList(),
polylinePoints
.map((e) => {'lat': e.latitude, 'lng': e.longitude})
.toList(),
);
} catch (e, st) {
_logService.logError(e, st);
}
return polylinePoints;
}