public static List mapToGridCellsOnWay()

in common/src/main/java/org/apache/flink/training/exercises/common/utils/GeoUtils.java [89:150]


    public static List<Integer> mapToGridCellsOnWay(
            float lon1, float lat1, float lon2, float lat2) {

        int x1 = (int) Math.floor((Math.abs(LON_WEST) - Math.abs(lon1)) / DELTA_LON);
        int y1 = (int) Math.floor((LAT_NORTH - lat1) / DELTA_LAT);

        int x2 = (int) Math.floor((Math.abs(LON_WEST) - Math.abs(lon2)) / DELTA_LON);
        int y2 = (int) Math.floor((LAT_NORTH - lat2) / DELTA_LAT);

        int startX, startY, endX, endY;
        if (x1 <= x2) {
            startX = x1;
            startY = y1;
            endX = x2;
            endY = y2;
        } else {
            startX = x2;
            startY = y2;
            endX = x1;
            endY = y1;
        }

        double slope = (endY - startY) / ((endX - startX) + 0.00000001);

        int curX = startX;
        int curY = startY;

        ArrayList<Integer> cellIds = new ArrayList<>(64);
        cellIds.add(curX + (curY * NUMBER_OF_GRID_X));

        while (curX < endX || curY != endY) {

            if (slope > 0) {
                double y = (curX - startX + 0.5) * slope + startY - 0.5;

                if (y > curY - 0.05 && y < curY + 0.05) {
                    curX++;
                    curY++;
                } else if (y < curY) {
                    curX++;
                } else {
                    curY++;
                }
            } else {
                double y = (curX - startX + 0.5) * slope + startY + 0.5;

                if (y > curY - 0.05 && y < curY + 0.05) {
                    curX++;
                    curY--;
                }
                if (y > curY) {
                    curX++;
                } else {
                    curY--;
                }
            }

            cellIds.add(curX + (curY * NUMBER_OF_GRID_X));
        }

        return cellIds;
    }