вычисление процентного соотношения различных полос внутри полигонов - PullRequest
1 голос
/ 27 мая 2020

В настоящее время я работаю с набором данных из GEE (USGS / GFSAD1000_V0) с целью транспонировать его на набор многоугольников, которые я уже определил перед всем этим. Теперь я пытаюсь вычислить процент пикселей с разными значениями (0-9) в определенном многоугольнике и распечатать это.

import ee
import numpy as np

ee.Initialize()

polygon_version = '(SOURCE)'
land_polygons = ee.FeatureCollection(f'users/(SOURCE)/{polygon_version}_poly_land')

def Landcover_Crops_nr(polygons):
    dataset = ee.Image("USGS/GFSAD1000_V0").clip(polygons)
    type_crop = dataset.select("landcover")
    arr = np.array(type_crop)

    rawres = type_crop.getInfo()["features"]
    res = {
        x["properties"]["id"]: {
            "id": x["properties"]["id"],
            "area": float(x["properties"]["area"]),
            "center_lat": x["properties"]["center_lat"],
            "crop_area": x["properties"]["sum"],
        }
        for x in rawres
    }

    return res
values, frequencies= np.unique(arr, return_counts=True)
sum = np.sum(frequencies)
percentages = [x/sum*100 for x in frequencies]
dfgen = Landcover_Crops_nr(land_polygons)
dfgen.to_csv(f'{polygon_version}_Crops.csv', index=False)
print (dfgen)

Я пробовал это раньше, но, как вы можете видеть, он будет сосредоточен только на значении 9, в то время как делать это вручную, как будто это не вариант для мирового набора данных

1 Ответ

0 голосов
/ 27 мая 2020

Попробуйте использовать библиотеку numpy. Например,

import numpy as np

# generate an array of size 10x10 with values (0-9)
arr = np.random.randint(10, size=(10, 10))

# get unique values with frequencies
values, frequencies= np.unique(arr, return_counts=True) 

# calculate sum of frequencies
sum = np.sum(frequencies)

# calculate percentages
percentages = [x/sum*100 for x in frequencies]

# Example

# print(values)
# [0, 1, ...,9 ]

# print(percentages)
# [25.0, 15.0, ..., 2.5]

Чтобы адаптировать этот подход к вашему методу, попробуйте использовать

arr = np.array(type_crop)

вместо

arr = np.random.randint(10, size=(10, 10))

, предполагая, что ваш type_crop - это 2d-массив.

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