Расчет NDVI планеты: ModuleNotFoundError: нет модуля с именем «rasterio»

Я выполняю расчет NDVI на изображении канала Planet Scope 4 в соответствии с документацией Planet

Следующий блок кода — это то, что я написал:

Извлечь данные бэнда из исходного изображения в рабочий каталог

import rasterio import numpy

image_file = "20170430_194027_0c82_3B_AnalyticMS"

with rasterio.open(image_file) as src:    band_red = src.read(3)

with rasterio.open(image_file) as src:    band_nir = src.read(4)

from xml.dom import minidom

xmldoc = minidom.parse("20170430_194027_0c82_3B_AnalyticMS_metadata") nodes = xmldoc.getElementsByTagName("ps:bandSpecificMetadata")

Извлечь поправочные коэффициенты TOA из файла метаданных в каталоге

TOA_coeffs = {} for node in nodes:    bn = node.getElementsByTagName("ps:bandNumber")[0].firstChild.data    if bn in ['1', '2', '3', '4']:
       i = int(bn)
       value = node.getElementsByTagName("ps:ReflectanceCoefficient")[0].firstChild.data
       TOA_coeffs[1] = float(value)

Рассчитайте NDVI и сохраните файл

band_red = band_red * TOA_coeffs[3] band_nir = band_nir * TOA_coeffs[4]

numpy.seterr(divide = 'ignore', invalid = 'ignore')

NDVI = (band_nir.astype(float) - band_red.astype(float))/(band_nir + band_red) numpy.nanmin(NDVI), numpy.nanmax(NDVI)

kwargs = src.meta kwargs.update(dtype=rasterio.float32, 
             count = 1)

with rasterio.open('ndvi.tif', 'W', **kwargs) as dst:    dst.write_band(1, NDVI.astype(rasterio.float32))

Добавьте символы и цветную полосу графика

import matplotlib.pyplot as plt import matplotlib.colors as colors

class MidpointNormalize(colors.Normalize):    def __init__(self, vmin=None, vmax=None, midpoint=None, clip=False):
       self.midpoint = midpoint
       colors.Normalize.__init__(self, vmin, vmax, clip)
           def __call__(self, value, clip=None):
       x, y = [self.vmin, self.midpoint, self.vmax], [0, 0.5, 1]
       return numpy.ma.masked_array(numpy.interp(value, x, y), >numpy.isnan(value))
    min = numpy.nanmin(NDVI) min = numpy.nanmax(NDVI) mid = 0.1

fig = plt.figure(figsize= (20,10)) ax = fig.add_subplot(111)

cmap = plt.cm.RdYlGn

cax = ax.imshow(NDVI, cmap=cmap, clim=(min,max),
>norm=MidpointNormalize(midpoint=mid, vmin=min, vmax=max))

ax.axis('off') ax.set_title('NDVI_test', fontsize= 18, fontweight='bold')

cbar = fig.colorbar(cax, orientation= 'horizontal', shrink=0.65)

fig.savefig("output/NDVI_test.png", dpi=200, bbox_inches='tight',
>pad_inches=0.7)

plt.show()

Постройте гистограмму распределения значений пикселей NDVI

fig2 = plt.figure(figsize=(10,10)) ax = fig2.add_subplot(111)

plt.title("NDVI Histogram", fontsize=18, fontweight='bold') plt.xlabel("NDVI values", fontsize=14) plt.ylabel("# pixels", fontsize=14)

x = NDVI[~numpy.isnan(NDVI)] numBins = 20 ax.hist(x,numBins,color='green',alpha=0.8)

fig2.savefig("output/ndvi-histogram.png", dpi=200, bbox_inches='tight', >pad_inches=0.7)

plt.show()

Увы, выполнение скрипта обрывается в начале кода:

File "C:/Users/David/Desktop/ArcGIS files/Planet Labs/2017.6_Luis_Bedin_Bolivia/planet_order_58311/20170430_194027_0c82/TOA_correction_NDVI.py", line 8, in <module>
    import rasterio
ModuleNotFoundError: No module named 'rasterio'

Поэтому я решил установить rasterio, это должно решить проблему:

C:\Users\David\Desktop\ArcGIS files\Planet Labs\2017.6_Luis_Bedin_Bolivia\planet_order_58311\20170430_194027_0c82>pip install rasterio
Collecting rasterio
  Using cached rasterio-0.36.0.tar.gz
Requirement already satisfied: affine in c:\users\david\anaconda3\lib\site-packages (from rasterio)
Requirement already satisfied: cligj in c:\users\david\anaconda3\lib\site-packages (from rasterio)
Requirement already satisfied: numpy in c:\users\david\anaconda3\lib\site-packages (from rasterio)
Requirement already satisfied: snuggs in c:\users\david\anaconda3\lib\site-packages (from rasterio)
Requirement already satisfied: click-plugins in c:\users\david\anaconda3\lib\site-packages (from rasterio)

Из этого я понимаю, что rasterio уже установлен. Как это может быть, если консоль Python говорит мне, что нет модуля с именем rasterio. В выводе консоли также говорится, что требуется Microsoft Visual C++. После дальнейших исследований я нашел решение. Я попробовал, но консоль также сообщает мне, что rasterio уже установлен:

(envpythonfs) C:\Users\David\Desktop\ArcGIS files\Planet Labs\2017.6_Luis_Bedin_Bolivia\planet_order_58311\20170430_194027_0c82>conda install rasterio gdal
Fetching package metadata .............
Solving package specifications: .

# All requested packages already installed.
# packages in environment at C:\Users\David\Anaconda3\envs\envpythonfs:
#

Я создаю скрипт, используя Spyder 3.1.2 с Python 3.6 на 64-разрядной машине с Windows 10.


person Sergio Escalante    schedule 31.07.2017    source источник
comment
Может быть, я смогу использовать консоль Python в ArcMap и пропустить набросок сценария вне программной среды ГИС. Однако я не настолько опытен в кодировании, чтобы знать, что удалить, а что оставить из того, что я написал выше. Все это я взял из документации Planet.   -  person Sergio Escalante    schedule 31.07.2017


Ответы (1)


Я думаю, что pip - не лучший способ убедиться, что зависимости обрабатываются должным образом. Поскольку вы уже используете анаконду, я бы предложил:

conda install rasterio -c conda-forge/label/dev

Обратите внимание, что установка из версии с пометкой dev не является долгосрочным решением (см. https://github.com/conda-forge/rasterio-feedstock/pull/36).

person jdmcbr    schedule 05.08.2017
comment
Спасибо за вашу помощь jdmcbr, я получаю синтаксическую ошибку: conda install rasterio -c conda-forge/label/dev File ‹ipython-input-1-a55d61d43c1f›, строка 1 conda install rasterio -c conda-forge/label/ dev ^ SyntaxError: неверный синтаксис - person Sergio Escalante; 09.08.2017
comment
Извините, эту команду следует вводить в командной строке anaconda, а не в сеансе python. - person jdmcbr; 10.08.2017
comment
(C:\Users\David\Anaconda3) C:\Users\David>conda install rasterio -c conda-forge/label/dev Fetching package metadata ............... Solving package specifications: . `` `` UnsatisfiableError: The following specifications were found to be in conflict: ` - python 3.6*` ` - rasterio -> python 3.5*` Use "conda info <package>" to see the dependencies for each package. `` Судя по всему, у меня python 3.6, а rasterio работает с 3.5; это облом. Можно было бы подумать, что более новые версии по-прежнему будут использовать старые. - person Sergio Escalante; 11.08.2017