Для какой единицы по умолчанию задан аргумент `dist` в` st_buffer`? - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть следующая карта Мексики.Он показывает все свои муниципалитеты и около 400 метеостанций.

Mexico

Я хочу создать 10-километровый буфер вокруг каждой станции и, в конце концов, связать каждый муниципалитет сстанция, которая находится в пределах каждого радиуса.

Карта и станции хранятся в отдельных sf-объектах.Мне надоело следующее:

buffers <- st_buffer(stations, dist = 1)

Я думал, что аргумент dist установлен в километрах, поэтому я попытался dist = 10.К сожалению, это вернуло HUGE буферов для каждой станции.Вот почему я использую dist = 1, но даже эти буферы такие же большие, как состояние! Этот вопрос предлагает мне преобразовать свои станции в Irish Grid , но я не смог воспроизвести принятый ответ.Теперь мне интересно, в какой единице задан аргумент dist.

Исходя из вышеупомянутого вопроса, я предполагаю, что он установлен в градусах.Как я могу установить 10-километровый буфер вокруг каждой станции?

Дополнительная информация:

Мой CRS установлен на 4326 для обоих объектов (мексиканская карта и станции).

Это мои stations данные:

> dput(head(stations))
structure(list(station_number = c(1004L, 1005L, 1008L, 1012L, 
1017L, 1018L), station_alt = c(1925, 1844, 2323, 1589, 2172, 
2053), month = c(9L, 9L, 9L, 9L, 9L, 9L), Mean_min = c(11.6, 
12.75, 12.25, 13.9666666666667, 12.9, 12.6833333333333), Mean_max = c(26.9333333333333, 
26.85, 24.0833333333333, 29.0333333333333, 24.8666666666667, 
26.1333333333333), months_observed = c(5L, 5L, 5L, 5L, 5L, 5L
), geometry = structure(list(structure(c(-102.199, 22.001), class = c("XY", 
"POINT", "sfg")), structure(c(-102.372, 21.781), class = c("XY", 
"POINT", "sfg")), structure(c(-102.135, 22.203), class = c("XY", 
"POINT", "sfg")), structure(c(-102.802, 21.794), class = c("XY", 
"POINT", "sfg")), structure(c(-102.444, 22.233), class = c("XY", 
"POINT", "sfg")), structure(c(-102.415, 22.141), class = c("XY", 
"POINT", "sfg"))), class = c("sfc_POINT", "sfc"), precision = 0, bbox = structure(c(xmin = -102.802, 
ymin = 21.781, xmax = -102.135, ymax = 22.233), class = "bbox"), crs = structure(list(
    epsg = NA_integer_, proj4string = NA_character_), class = "crs"), n_empty = 0L)), sf_column = "geometry", agr = structure(c(station_number = NA_integer_, 
station_alt = NA_integer_, month = NA_integer_, Mean_min = NA_integer_, 
Mean_max = NA_integer_, months_observed = NA_integer_), .Label = c("constant", 
"aggregate", "identity"), class = "factor"), row.names = c(NA, 
6L), class = c("sf", "data.frame"))

1 Ответ

0 голосов
/ 18 февраля 2019

Ваши координаты длинные / широта, поэтому расстояние будет в градусах.Сначала вы должны проецировать на пространственную привязку в метрах, а затем взять 10 000 м.

В руководстве st_buffer говорится об аргументе dist:

, если dist isобъект единиц измерения, он должен быть преобразован в arc_degree, если x имеет географические координаты, и в st_crs (x) $ единиц в противном случае

Если вы оставите координаты в 4326, вы сможете получить что-то вроде 0,1для Мексики это должно быть около 11 км, но вы увидите предупреждающее сообщение:

В st_buffer.sfc (st_geometry (x), dist, nQuadSegs, endCapStyle = endCapStyle,: st_buffer неправильно буферизируетданные долготы / широты

Поэтому сначала преобразуйте в другую проекцию (в метрах) и введите расстояние в метрах. Это должно сработать, используя EPSG 7801 :

library(sf)

pois <- st_as_sf(stations)
st_crs(pois) <- 4326
pois <- st_transform(pois, crs = 7801)
plot(st_geometry(pois))

buff <- st_buffer(pois, dist = 10000)
plot(st_geometry(buff), add = TRUE)

Управление с листовкой и измерительным инструментом:

buff <- st_transform(buff, crs = 4326)

library(leaflet)

leaflet() %>% 
  addTiles() %>% 
  addMeasure(primaryLengthUnit = "meters") %>% 
  addMarkers(data = pois) %>% 
  addPolygons(data = buff)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...