RESTAPI,以R Plumber-GeoJSON作为输入
我正在尝试使用Plumberr包将函数包装到RESTAPI中。作为输入,函数接受一个形状文件,并在转换后返回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 <-
#* 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文件作为附件生成。再次谢谢你。