преобразуйте csv в shp в r, где геометрия находится в одном столбце

#r #spatial #wkt

Вопрос:

У меня есть csv-файл, содержащий информацию о геометрии точек в одном столбце. Есть ли прямой способ преобразования из csv в файл пространственных данных в r, учитывая формат столбца геометрии (я мог бы сделать это в QGIS или разделить столбец на x и y, но мне любопытно, есть ли лучший способ сделать это).

Вот пример того, как выглядят данные:

 name <- c("A", "B", "C")
geom <- c("POINT (45.095914704767 -93.266719775361)",
          "POINT (45.095220489232 -93.254896591796)",
          "POINT (45.079643666 -93.257941333)")
dat <- data.frame(name, geom)
dat
 

Ответ №1:

Если ваш столбец геометрии на самом деле отформатирован как строка, вы можете dplyr удалить лишний текст, а затем использовать sf пакет для преобразования координат в столбец точек:

 library(magrittr)
dat %>%
  dplyr::mutate(
    # replace text and parenthesis
    geom = stringr::str_replace(geom, 'POINT \(', ''),
    geom = stringr::str_replace(geom, '\)', '')
  ) %>%
  # separate into lat and lon columns
  tidyr::separate(geom, into=c('lon', 'lat'), sep=' ') %>%
  # convert to sf point object 
  # (assuming this is in WGS84, but you can specify any CRS here)
  sf::st_as_sf(coords = c('lat', 'lon'), crs=4326)
 

Если вы можете сохранить файл .csv в формате .geojson или .shp, вы можете просто прочитать его в R с sf::read_sf('path/to/your/data.shp') помощью функции.

Ответ №2:

Формат вашей геометрии «ТОЧКА (45, -93)»-это то, что известно как хорошо известный текст, это стандартное представление геометрии.

Библиотека {sf} может напрямую считывать хорошо известный текст (WKT)

 library(sf)

sf::st_as_sf(x = dat, wkt = "geom")

# Simple feature collection with 3 features and 1 field
# Geometry type: POINT
# Dimension:     XY
# Bounding box:  xmin: 45.07964 ymin: -93.26672 xmax: 45.09591 ymax: -93.2549
# CRS:           NA
# name                       geom
# 1    A POINT (45.09591 -93.26672)
# 2    B  POINT (45.09522 -93.2549)
# 3    C POINT (45.07964 -93.25794)
 

Комментарии:

1. хороший ответ! Спасибо!

Ответ №3:

С базовым регулярным выражением (и sf):

 library(sf)

dat$y <- gsub(pattern = ".*\((-?[0-9.] ).*", replacement= "\1", dat$geom)
dat$x <- gsub(pattern = ".*\s(-?[0-9.] ).*", replacement= "\1", dat$geom)
dat_sf <- st_as_sf(dat, coords = c("y","x"))
st_write(dat_sf, "dat.shp")

Created on 2021-10-05 by the reprex package (v2.0.1)