Создавайте квадратные сетки и экспортируйте их как шейп-файл или таблицу

Я хотел бы использовать Google Earth Engine для извлечения данных по определенным странам. Мне нужны данные в виде квадратных сеток, поэтому я хотел бы создать эти квадратные сетки для определенной страны, добавить их в шейп-файл, а затем импортировать шейп-файл в Earth Engine. Я уже нашел код для создания квадратных сеток (Создайте сетку внутри шейп-файла), но теперь у меня две проблемы.

Во-первых, мне нужно экспортировать квадратные сетки, чтобы я мог импортировать их в Earth Engine. Я очень открыт для альтернатив шейп-файлу.

Во-вторых, последующий код работает для некоторых стран (например, Франция), но не работает для других (например, Таиланда).

library(raster)
shp = getData(country = "FRA", level = 0)

shp = spTransform(shp, CRSobj = "+proj=utm +zone=32 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0")
plot(shp)

cs = c(10000, 10000)
grdpts = makegrid(shp, cellsize = cs)

spgrd = SpatialPoints(grdpts, proj4string = CRS(proj4string(shp)))

spgrdWithin = SpatialPixels(spgrd[shp,])
plot(spgrdWithin, add = T)

Замена FRA на THA в строке 2 приводит к ошибке в spTransform.


person tho_mi    schedule 03.04.2019    source источник


Ответы (1)


Это не удается, потому что вы используете зону 32 utm. Вам нужно использовать зону, основанную на долготе страны. Вы можете увидеть их здесь

Вы можете автоматизировать поиск зоны с помощью ceiling((longitude+180)/6)

library(raster)
s <- getData(country = "FRA", level = 0)

Получите центроид. В этом случае вы можете сделать

centr <- coordinates(s)

Если есть несколько полигонов, вы можете сделать что-то вроде этого

centr <- apply(coordinates(s), 2, mean)

Вычислить зону UTM. (обратите внимание, что у вас было 32 для Франции, что не очень хорошо)

zone <- ceiling((centr[1] + 180)/6)
zone
#[1] 31

А затем используйте это так

crs <- paste0("+proj=utm +datum=WGS84 +unit=m +zone=", zone)
st <- spTransform(s, crs)

Для Таиланда вы получите

s <- getData(country = "THA", level = 0)
centr <- apply(coordinates(s), 2, mean)
zone <- ceiling((centr[1] + 180)/6)
zone
#[1] 47

Однако это не подход, который подойдет для всех стран. Зоны UTM имеют ширину 6 градусов, и многие страны охватывают несколько зон (Россия занимает первое место с 28 зонами). Поэтому, в зависимости от ваших целей, вы можете использовать другую систему координат (crs).

После этого альтернативным способом получения квадратных многоугольников является создание RasterLayer с размером s и выбранным разрешением. Но я сомневаюсь, что это лучший способ получить данные из GEE. Вместо этого я бы посоветовал загрузить схему страны.

r <- raster(st, res=10000)
r <- rasterize(st, r, 1)
x <- as(r, "SpatialPolygons")

# write to file
shapefile(x, "test.shp")

# view
plot(x)

введите описание изображения здесь

person Robert Hijmans    schedule 04.04.2019
comment
Спасибо за Ваш ответ! Какой подход вы посоветуете? Загрузить контуры, а затем создать квадратную сетку в GEE? Или загрузите контуры, загрузите изображение и сделайте все остальное в R? - person tho_mi; 04.04.2019
comment
Я не знаю, чего вы хотите достичь в GEE, но в любом случае это отдельный вопрос. - person Robert Hijmans; 05.04.2019
comment
Потом открою новую. Спасибо за вашу помощь! - person tho_mi; 05.04.2019
comment
Дополнительный вопрос @Robert Hijmans. Если у меня есть шейп-файл с другой проекцией (+ proj = longlat + datum = WGS84 + no_defs + ellps = WGS84 + towgs84 = 0,0,0), строка x ‹- as (r, SpatialPolygons) не работает. Почему? Переведенная ошибка будет чем-то вроде отсутствия метода или значения по умолчанию для приведения NULL к SpatialPolygons). - person tho_mi; 08.04.2019
comment
Перефразирую свой вопрос. Я предполагаю, что это не удается, потому что разрешение не в метрах, если проекция длинная. Что делать, если я хочу использовать метры, но не проекцию utm (чтобы избежать проблем с зонами)? - person tho_mi; 08.04.2019