Найти - Пользователи
Полная версия: Быстрое построение профиля трасc GDAL + Numpy
Начало » Python для экспертов » Быстрое построение профиля трасc GDAL + Numpy
1
StasShk
Здравствуйте!
Я пишу программу для расчета зоны покрытия радиопередатчика. Если не вдаваться в детали, то для расчета необходимо получить профиль трассы от каждой точки на карте до передатчика. Этот профиль представляет собой вектор, содержащий значения высот с определенным интервалом, например 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

Проблема заключается в том, что векторов очень много и просто на то, чтобы их все получить, уходит несколько часов. И это без основной функции, которая рассчитывает ослабление!
Таким образом, сейчас я ищу способ увеличения скорости работы этого кода. Мне хотелось бы добиться времени исполнения хотя бы в пределах одного часа, тогда весь расчет зоны покрытия для небольшого города можно провести за ночь.
Будут интересны любые соображения по представленной проблеме.
sergeek
глубже не профилировали?
Например, на глаз наиболее долгим в этой функции видится цикл. Если так, то оптимизировать надо self.get_elevation_direct.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB