Добавить значение в буфер вокруг определенного числа в растровом файле - PullRequest
0 голосов
/ 09 ноября 2019

Мне нужна помощь с относительно простым скриптом. У меня есть несколько больших растровых файлов, которые я хотел бы наложить друг на друга. Это легко выполнимо с ArcGIS или QGIS, но при использовании скрипта Python я столкнулся с некоторыми трудностями.

Чтобы сделать это немного проще, я создал небольшой растровый файл, подобный этому:

import numpy as np
Trees = np.array([
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 1,11, 2, 1, 1, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 7,13, 1, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 2, 2, 7, 0, 2, 1, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 3, 5, 8, 8, 2, 1, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 1, 6, 7, 0, 0, 1, 1, 0, 0, 0, 0],
    [0, 0, 0, 0, 1, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 1, 1, 1, 1, 0, 3, 4, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
df2 = np.where(Trees>=1, 2, Trees)
df3 = np.where(df2<2, 1, df2)
df4 = np.where(df3==2, 0 , df3)

from scipy import ndimage
df5, num_features = ndimage.label(df4, np.ones((3,3)))
df6 = np.where (df5>=2 , 3 , df5)
df7 = np.where (df6==1 , 2 , df6)
Trees2 = np.where (df7==0 , 1 , df7)

В результате получается растр, подобный этому:

Trees2=
 ([[2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
   [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
   [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
   [2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2],
   [2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2],
   [2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2],
   [2, 2, 2, 2, 1, 1, 1, 2, 1, 1, 2, 2, 2, 2, 2],
   [2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2],
   [2, 2, 2, 2, 1, 1, 1, 3, 3, 1, 1, 2, 2, 2, 2],
   [2, 2, 2, 2, 1, 1, 3, 3, 3, 1, 2, 2, 2, 2, 2],
   [2, 2, 2, 2, 1, 1, 1, 1, 3, 1, 1, 2, 2, 2, 2],
   [2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 2],
   [2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2],
   [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
   [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
   [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]])

Должно быть прощеспособ записать это, но пока все хорошо. Для следующего шага я хотел бы добавить 4 на границах значений 1. Это сделает все 2 a 6 (так как 2+4 = 6) и 3 a 7. Еще одним шагом я хотел бы добавить 3, что приведет к образованию своего рода буфера вокруг границы дерева. Результат должен выглядеть примерно так:

array
 ([[2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
   [2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2],
   [2, 2, 2, 5, 5, 6, 5, 5, 2, 2, 2, 2, 2, 2, 2],
   [2, 2, 2, 6, 6, 1, 6, 6, 5, 2, 2, 2, 2, 2, 2],
   [2, 5, 6, 1, 1, 1, 1, 1, 6, 5, 2, 2, 2, 2, 2],
   [2, 2, 5, 6, 1, 1, 1, 6, 6, 6, 2, 2, 2, 2, 2],
   [2, 2, 5, 6, 1, 1, 1, 6, 1, 1, 6, 5, 2, 2, 2],
   [2, 2, 5, 6, 1, 1, 1, 1, 1, 1, 6, 5, 2, 2, 2],
   [2, 2, 5, 6, 1, 1, 1, 7, 7, 1, 1, 6, 5, 2, 2],
   [2, 2, 5, 6, 1, 1, 7, 7, 7, 1, 6, 5, 2, 2, 2],
   [2, 2, 5, 6, 1, 1, 1, 1, 3, 1, 1, 6, 5, 2, 2],
   [2, 2, 2, 2, 6, 6, 1, 1, 1, 1, 6, 5, 2, 2, 2],
   [2, 2, 2, 2, 5, 5, 6, 6, 1, 1, 6, 5, 2, 2, 2],
   [2, 2, 2, 2, 2, 2, 5, 5, 6, 6, 2, 2, 2, 2, 2],
   [2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 2, 2, 2],
   [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]])

Надеюсь, я разъяснил свою проблему! Я с нетерпением жду любого предложения, которое поможет мне. Также приветствуются другие буферы или подсказки.

С уважением!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...