RESTAPI,以R Plumber-GeoJSON作为输入

RESTAPI,以R Plumber-GeoJSON作为输入,r,rest,raster,rgdal,plumber,R,Rest,Raster,Rgdal,Plumber,我正在尝试使用Plumberr包将函数包装到RESTAPI中。作为输入,函数接受一个形状文件,并在转换后返回GeoJSON作为输出 #* Return Spatial Polygon Object in form of GeoJSON #* @param dsn:character Path to Shapefile with Name #* @param design:character one or two #* @post /sprayermap sprayer_map <-

我正在尝试使用Plumberr包将函数包装到RESTAPI中。作为输入,函数接受一个形状文件,并在转换后返回GeoJSON作为输出

#* Return Spatial Polygon Object in form of GeoJSON
#* @param dsn:character Path to Shapefile with Name
#* @param design:character one or two
#* @post /sprayermap

sprayer_map <-
  function(dsn,
       design = c("one", "two")) {
# library
require(rgeos)
require(rgdal)
require(sp)
require(raster)
require(cleangeo)

#Import Shapefile
a_shape <- raster::shapefile(dsn)

result <-
  list("success" = F,
       additional_info = NULL ,
       GeoJSON = NULL)

if (class(a_shape) == "SpatialPolygonsDataFrame") {
  a_shape <- tryCatch (
    rgeos::gBuffer(a_shape, byid = TRUE, width = 0),
    error = function(err) {
      return(paste("sprayer map : ", err))

    }
  )

  if (design == "one") {
    sprayer_map <- tryCatch (
      aggregate(a_shape, "Rx"),
      error = function(err) {
        return(paste("sprayer map : ", err))

      }
    )

    sprayer_map@data$Rx <- as.integer(sprayer_map@data$Rx)

  } else if (design == "two") {
    return(paste0("Design Two !"))

  }

  temppath <- file.path(tempdir(), "sprayermap.GeoJSON")
  rgdal::writeOGR(
    sprayer_map,
    dsn = temppath,
    layer = "geojson",
    driver = "GeoJSON",
    overwrite_layer = TRUE
  )

  if (file.exists(temppath)) {
    GeoJSON <- readLines(temppath)
    result$success <- T
    result$GeoJSON = GeoJSON
    return(result)
  } else {
    return(paste0("GeoJSON Creation Failed!"))
  }

} else {
  return(paste0("Please provide spatial polygon object !"))

}
  }
#*以GeoJSON的形式返回空间多边形对象
#*@param dsn:名为的Shapefile的字符路径
#*@param design:character one或character two
#*@post/sprayermap
带管道工1.0的喷雾器地图

只需要加载Libraries一次。把它们从你的端点拿出来

首先创建一个解析器和一个序列化程序来解析geojson内容并返回geojson响应。这也可以在端点内完成。它只是让它更易于重用

解析器是处理请求主体内容的工具。 序列化程序对API响应进行编码

我重新调整了解析器和序列化器的用途,只是用GeoJSON函数代替了它们

然后,使用刚刚创建的解析器和序列化程序执行端点

library(rgeos)
library(rgdal)
library(sp)
library(raster)
library(cleangeo)
library(plumber)

parser_geojson <- function(...) {
  parser_read_file(function(tmpfile) {
    rgdal::readOGR(tmpfile, ...)
  })
}
register_parser("geojson", parser_geojson, fixed = c("application/geo+json", "application/vnd.geo+json", "application/octet-stream"))

serializer_geojson <- function(type = "application/geo+json") {
  serializer_write_file(
    fileext = ".GeoJSON",
    type = type,
    write_fn = function(val, tmpfile) {
      rgdal::writeOGR(val, dsn = tmpfile, layer = "geojson", driver = "GeoJSON", overwrite_layer = TRUE)
    }
  )
}
register_serializer("geojson", serializer_geojson)

serializer_shapezip <- function(type = "application/zip") {
  serializer_content_type(type, function(val) {
    tmpdir <- file.path(tempdir(), "output")
    dir.create(tmpdir)
    on.exit({
      if (dir.exists(tmpdir)) {
        unlink(tmpdir, recursive = TRUE)
      }
    }, add = TRUE)
    raster::shapefile(val, file.path(tmpdir, "shapefile"))
    tmpfile <- file.path(tmpdir, "shapefile.zip")
    zip(tmpfile, file.path(tmpdir, dir(tmpdir)), extras = "-j")
    readBin(tmpfile, what = "raw", n = file.info(tmpfile)$size)
  })
}
register_serializer("shapezip", serializer_shapezip)

dothething <- function(a_shape, design) {
  if (!class(a_shape) == "SpatialPolygonsDataFrame") stop("Please provide spatial polygon object !")
  a_shape <- rgeos::gBuffer(a_shape, byid = TRUE, width = 0)

  if (design == "one") {
    sprayer_map <- aggregate(a_shape, "Rx")
    sprayer_map@data$Rx <- as.integer(sprayer_map@data$Rx)
  } else if (design == "two") {
    # This should return a geojson too since endpoint should have predictable outputs
    stop(paste0("Design Two !"))
  }

  sprayer_map
}

#* Return Spatial Polygon Object in form of GeoJSON
#* @param dsn:file A GeoJSON file
#* @param design:character one or two
#* @parser multi
#* @parser geojson
#* @serializer geojson
#* @post /sprayermap_geojson
function(dsn, design = c("one", "two")) {
  a_shape <- dsn[[1]]
  as_attachment(dothething(a_shape, design), "response.GeoJSON")
}

#* Return Spatial Polygon Object in form of GeoJSON
#* @param dsn:character Path to Shapefile with Name
#* @param design:character one or two
#* @serializer shapezip
#* @post /sprayermap_shapefile
function(dsn, design = c("one", "two")) {
  # Import Shapefile
  a_shape <- raster::shapefile(dsn)
  as_attachment(dothething(a_shape, design), "response.zip")
}

如果你有任何问题,不要犹豫

编辑:添加了一个压缩文件夹序列化程序

library(rgeos)
library(rgdal)
library(sp)
library(raster)
library(cleangeo)
library(plumber)

parser_geojson <- function(...) {
  parser_read_file(function(tmpfile) {
    rgdal::readOGR(tmpfile, ...)
  })
}
register_parser("geojson", parser_geojson, fixed = c("application/geo+json", "application/vnd.geo+json", "application/octet-stream"))

serializer_geojson <- function(type = "application/geo+json") {
  serializer_write_file(
    fileext = ".GeoJSON",
    type = type,
    write_fn = function(val, tmpfile) {
      rgdal::writeOGR(val, dsn = tmpfile, layer = "geojson", driver = "GeoJSON", overwrite_layer = TRUE)
    }
  )
}
register_serializer("geojson", serializer_geojson)

serializer_shapezip <- function(type = "application/zip") {
  serializer_content_type(type, function(val) {
    tmpdir <- file.path(tempdir(), "output")
    dir.create(tmpdir)
    on.exit({
      if (dir.exists(tmpdir)) {
        unlink(tmpdir, recursive = TRUE)
      }
    }, add = TRUE)
    raster::shapefile(val, file.path(tmpdir, "shapefile"))
    tmpfile <- file.path(tmpdir, "shapefile.zip")
    zip(tmpfile, file.path(tmpdir, dir(tmpdir)), extras = "-j")
    readBin(tmpfile, what = "raw", n = file.info(tmpfile)$size)
  })
}
register_serializer("shapezip", serializer_shapezip)

dothething <- function(a_shape, design) {
  if (!class(a_shape) == "SpatialPolygonsDataFrame") stop("Please provide spatial polygon object !")
  a_shape <- rgeos::gBuffer(a_shape, byid = TRUE, width = 0)

  if (design == "one") {
    sprayer_map <- aggregate(a_shape, "Rx")
    sprayer_map@data$Rx <- as.integer(sprayer_map@data$Rx)
  } else if (design == "two") {
    # This should return a geojson too since endpoint should have predictable outputs
    stop(paste0("Design Two !"))
  }

  sprayer_map
}

#* Return Spatial Polygon Object in form of GeoJSON
#* @param dsn:file A GeoJSON file
#* @param design:character one or two
#* @parser multi
#* @parser geojson
#* @serializer geojson
#* @post /sprayermap_geojson
function(dsn, design = c("one", "two")) {
  a_shape <- dsn[[1]]
  as_attachment(dothething(a_shape, design), "response.GeoJSON")
}

#* Return Spatial Polygon Object in form of GeoJSON
#* @param dsn:character Path to Shapefile with Name
#* @param design:character one or two
#* @serializer shapezip
#* @post /sprayermap_shapefile
function(dsn, design = c("one", "two")) {
  # Import Shapefile
  a_shape <- raster::shapefile(dsn)
  as_attachment(dothething(a_shape, design), "response.zip")
}

库(rgeos)
图书馆(rgdal)
图书馆(sp)
图书馆(光栅)
图书馆(清洁地理)
图书馆(水管工)

在我回答之前先确认一下。您希望API接受GEOJSON文件,执行一些操作并返回GEOJSON文件。对吗?是的,接受GeoJSON文件作为上传文件或作为GeoJSON主体。如果希望将其作为附件,请将其替换为
return(sprayer\u map)
as\u attachment(sprayer\u map)
谢谢!我能够理解代码的大部分内容——感谢如此详细的说明。请您解释一下-register_parser(“geojson”,parser_geojson,fixed=c(“application/geo+json”,“application/vnd.geo+json”,“application/octet stream”))第二,如果我想在zip文件夹中生成输出作为附件,我应该如何进行。例如,在第二种情况下,dsn作为shape文件的路径提供,我想将输出作为包装在zip文件夹中的shape文件作为附件生成。再次谢谢你。