Python итератор до бесконечного l oop по парам широты и долготы пошаговым способом - PullRequest
0 голосов
/ 26 апреля 2020

Я хотел бы связать итераторы / генераторы, а затем бесконечно циклически повторять их. В основном у меня есть x количество пар широты и долготы. Я хочу интерполировать между парами и дать текущую точку шага. Я собрал следующий код, но боюсь, что мои ограниченные знания итераторов / генераторов подвели меня, и я получаю ошибку TypeError: 'PointsIterator' object is not iterable. Я не уверен, почему.

interpolate - это неитераторная наивная широта и долгота. Я также не знаю, как получить не-генераторную форму print(next(PointsIterator((4, 2), (-4, 5), 3))), поскольку она возвращает <generator object PointsIterator.__next__ at 0x000001FEA5BA5930> вместо (4.0, 2.0).

Также, как мне обработать исключение StopIteration или будет chain и cycle делают это автоматически?

from itertools import chain, cycle

def interpolate(start, end, steps):
    points = []

    lat_step = (end[0] - start[0]) / (steps + 1)
    lon_step = (end[1] - start[1]) / (steps + 1)

    for i in range(1, steps + 2):
        points.append((lat_step * i + start[0] - lat_step, lon_step * i + start[1] - lon_step))

    return points

points = interpolate((4, 2), (-4, 5), 9)

#for p in points:
#    print(p)

class PointsIterator(object):
    def __init__(self, start, end, steps):
        self.points = []
        self.position = 0
        lat_step = (end[0] - start[0]) / (steps + 1)
        lon_step = (end[1] - start[1]) / (steps + 1)
        for i in range(1, steps + 2):
             self.points.append((lat_step * i + start[0] - lat_step, lon_step * i + start[1] - lon_step))
        self.max_position = len(self.points)
    def __next__(self):
        if self.position >= self.max_position:
            raise StopIteration
        result = self.points[self.position]
        self.position += 1
        yield result

my_iter = chain(PointsIterator((4, 2), (-4, 5), 3), PointsIterator((-4, 5), (1, 1), 3), PointsIterator((1, 1), (4, 2), 3))

g = cycle(my_iter)

print(next(g))
...