Я пишу программу для расчета зоны покрытия радиопередатчика. Если не вдаваться в детали, то для расчета необходимо получить профиль трассы от каждой точки на карте до передатчика. Этот профиль представляет собой вектор, содержащий значения высот с определенным интервалом, например 100м. ( ).
Я использую карты SRTM3 с разрешением 100 метров. Данные SRTM представлены в виде обычных геотифф картонок размером 5х5 градусов и разрешением 3 секунды. Для работы с ними я использовал GDAL + NUMPY.
В приложенном файле файле можно посмотреть весь код с примером (запускать radio.py). А ниже представлен кусок кода, который формирует эти векторы:
def get_elev_vector(self, coord1, coord2, step=90): if coord1 == coord2: return 0 lat1, long1 = coord1 lat2, long2 = coord2 dist = self.get_dist(coord1, coord2) npt = dist / step vect = np.zeros(npt + 3, dtype='float32') vect[0] = npt vect[1] = dist vect[2] = self.get_elevation_direct(coord1) vect[npt] = self.get_elevation_direct(coord2) g = pyproj.Geod(ellps='WGS84') coordvect = g.npts(long1, lat1, long2, lat2, npt) i = 3 for lon, lat in coordvect: vect[i] = self.get_elevation_direct((lat, lon)) i += 1 return vect
Проблема заключается в том, что векторов очень много и просто на то, чтобы их все получить, уходит несколько часов. И это без основной функции, которая рассчитывает ослабление!
Таким образом, сейчас я ищу способ увеличения скорости работы этого кода. Мне хотелось бы добиться времени исполнения хотя бы в пределах одного часа, тогда весь расчет зоны покрытия для небольшого города можно провести за ночь.
Будут интересны любые соображения по представленной проблеме.