@Override
    protected HttpResult<Iterable<Region>> doInBackground(Void... voids) {
      Projection projection = mapView.getProjection();

      // We want to download data that's off screen so the user can see something while panning
      GeoPoint northWest = projection.fromPixels(-mapView.getWidth(), -mapView.getHeight());
      GeoPoint southEast = projection.fromPixels(2 * mapView.getWidth(), 2 * mapView.getHeight());

      Location northWestLoc = LocationConversionHelper.location(northWest);
      Location southEastLoc = LocationConversionHelper.location(southEast);

      int size = min(mapView.getWidth(), mapView.getHeight()) / settingsHelper.getHeatMapDensity();
      if (size < 1) size = 1;

      int gridSizeX = MAP_BUFFER_SIZE * mapView.getWidth() / size;
      int gridSizeY = MAP_BUFFER_SIZE * mapView.getHeight() / size;

      return averagesDriver.index(
          sensorManager.getVisibleSensor(),
          northWestLoc.getLongitude(),
          northWestLoc.getLatitude(),
          southEastLoc.getLongitude(),
          southEastLoc.getLatitude(),
          gridSizeX,
          gridSizeY);
    }
  /**
   * @param canvas
   * @param mapView
   * @param shadow
   * @see TrackingOverlay#draw(Canvas, MapView, boolean)
   */
  private void drawDots(Canvas canvas, MapView mapView, boolean shadow) {
    this.mCanvas = canvas;
    this.mScreenPoint = new Point();
    this.mPrevScreenPoint = new Point();
    mProjection = mapView.getProjection();
    mTopLeft = mProjection.fromPixels(0, 0);
    mBottumRight = mProjection.fromPixels(this.mCanvas.getWidth(), this.mCanvas.getHeight());

    transformSegmentToCanvasDots();

    drawStartStopCircles();

    super.draw(this.mCanvas, mapView, shadow);
    this.mCanvas = null;
  }
  /** Either the Path or the Dots are calculated based on he current track coloring method */
  private synchronized void calculateTrackAsync() {
    GeoPoint oldTopLeft = mGeoTopLeft;
    GeoPoint oldBottumRight = mGeoBottumRight;
    mGeoTopLeft = mProjection.fromPixels(0, 0);
    mGeoBottumRight = mProjection.fromPixels(mWidth, mHeight);

    if (mRequeryFlag
        || oldTopLeft == null
        || oldBottumRight == null
        || mGeoTopLeft.getLatitudeE6() / 100 != oldTopLeft.getLatitudeE6() / 100
        || mGeoTopLeft.getLongitudeE6() / 100 != oldTopLeft.getLongitudeE6() / 100
        || mGeoBottumRight.getLatitudeE6() / 100 != oldBottumRight.getLatitudeE6() / 100
        || mGeoBottumRight.getLongitudeE6() / 100 != oldBottumRight.getLongitudeE6() / 100) {
      calculateStepSize();

      mScreenPoint.x = -1;
      mScreenPoint.y = -1;
      this.mPrevDrawnScreenPoint.x = -1;
      this.mPrevDrawnScreenPoint.y = -1;

      switch (mTrackColoringMethod) {
        case (DRAW_CALCULATED):
        case (DRAW_MEASURED):
        case (DRAW_RED):
        case (DRAW_GREEN):
          calculatePath();
          synchronized (mPath) // Switch the fresh path with the old Path object
          {
            Path oldPath = mPath;
            mPath = mPathCalculation;
            mPathCalculation = oldPath;
          }
          break;
        case (DRAW_DOTS):
          calculateDots();
          synchronized (mDotPath) // Switch the fresh path with the old Path object
          {
            Vector<DotVO> oldDotPath = mDotPath;
            mDotPath = mDotPathCalculation;
            mDotPathCalculation = oldDotPath;
          }
          break;
      }
      mLoggerMap.onDateOverlayChanged();
    }
  }
  /**
   * @param canvas
   * @param mapView
   * @param shadow
   * @see TrackingOverlay#draw(Canvas, MapView, boolean)
   */
  public void drawPath(Canvas canvas, MapView mapView, boolean shadow) {
    this.mCanvas = canvas;
    this.mScreenPoint = new Point();
    this.mPrevScreenPoint = new Point();
    mProjection = mapView.getProjection();
    mTopLeft = mProjection.fromPixels(0, 0);
    mBottumRight = mProjection.fromPixels(this.mCanvas.getWidth(), this.mCanvas.getHeight());

    this.mPath.rewind();
    this.mShader = null;
    transformSegmentToPath();

    // Just the rendering bits left to do
    Paint routePaint = new Paint();
    routePaint.setPathEffect(new CornerPathEffect(10));
    //      Log.d( TAG, "Drawing color is "+trackColoringMethod );
    switch (trackColoringMethod) {
      case (DRAW_CALCULATED):
      case (DRAW_MEASURED):
        routePaint.setShader(this.mShader);
        break;
      case (DRAW_RED):
        routePaint.setColor(Color.RED);
        break;
      case (DRAW_GREEN):
      default:
        routePaint.setColor(Color.GREEN);
        break;
    }
    routePaint.setStyle(Paint.Style.STROKE);
    routePaint.setStrokeWidth(8);
    routePaint.setAntiAlias(true);

    this.mCanvas.drawPath(this.mPath, routePaint);

    drawStartStopCircles();

    super.draw(this.mCanvas, mapView, shadow);
    this.mCanvas = null;
  }