![](/img/trans.png)
[英]Transform a sfc_LINESTRING geometry to sfc_MULTIPOLYGON
[英]Convert foreign object to an sfc object [sfc_MULTIPOLYGON, sfc_POLYGON]
从 SQL 服务器返回空间查询时,我得到一个数据框,其中“形状”列是“字符”object,我无法将其转换为 sfg object。
library(DBI)
library(odbc)
library(sf)
query_sf.AsText <- "Select CLASEUSO, Shape.STAsText() AS Shape FROM my_Table where REGION IN ('Region_mh', 'Region_no', 'Region_in')"
query_sf.AsBinary <- "Select CLASEUSO, Shape.STAsBinary() AS Shape FROM my_Table where REGION IN ('Region_mh', 'Region_no', 'Region_in')"
df_text <- st_read(odbc_con, query = query_sf.AsText)
> Warning message:
> In st_read.DBIObject(odbc_con, query = query_sf) :
> Could not find a simple features geometry column. Will return a `data.frame`.
df_binary <- st_read(odbc_con, query = query_sf.AsBinary)
ex_text <- df_text[1:3, ]
ex_binary <- df_binary[1:3, ]
str(ex_text)
> 'data.frame': 3 obs. of 2 variables:
> CLASEUSO: chr "Vegetacion Nativa" "Vegetacion Nativa" "Vegetacion Nativa"
> Shape : chr "POLYGON ((-5865371.0349 -2234709.5711000003, -5865383.0660999995 -2234694.5898, -5865392.442 -2234690.814500000"| __truncated__ "POLYGON ((-5866433.0649 -2236171.0835000016, -5866431.4669 -2236170.9224999994, -5866431.1 -2236170.8986000009,"| __truncated__ "POLYGON ((-5864979.8155000005 -2236093.0526, -5865013.8751 -2236072.0670999996, -5865019.1833 -2236072.01419999"| __truncated__
STAsBinary 不返回小数分隔符。
str(ex_binary)
> Classes ‘sf’ and 'data.frame': 3 obs. of 2 variables:
> CLASEUSO: chr "Vegetacion Nativa" "Vegetacion Nativa" "Vegetacion Nativa"
> Shape :sfc_POLYGON of length 3; first list element: List of 1
> num [1:184, 1:2] -5865371 -5865383 -5865392 -5865396 -5865401 ...
> attr(*, "class")= chr [1:3] "XY" "POLYGON" "sfg"
> attr(*, "sf_column")= chr "Shape"
> attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA
> attr(*, "names")= chr "CLASEUSO"
将文本 class 列转换为 <"XY" "POLYGON" "sfg"> object 无效。
ex_text$Shape <- st_as_sfc(ex_text$Shape)
sf_tbl_text = st_as_sf(ex_text)
st_crs(sf_tbl_text) = 4326
sf_tbl_text %>% mapview::mapview()
获取 sf 数据框的最佳方法是什么?
此外,查询 STAsText() 太耗时了。
您从数据库返回的文本似乎遵循WKT 格式,因此不一定是错误的。 它可以使用标准sf:st_as_sf()
工作流来处理,将{sf}
指向 wkt 列。
缺少的一条信息是关于坐标参考系统的信息,应该在其中解释多边形。 根据数字范围和我的直觉,我会尝试 Web Mercator / EPSG:3857,但请记住,这只是一个猜测。 您感兴趣的地区是巴西南部吗?
library(sf)
library(dplyr)
raw_data <- data.frame(
claus0= c("Vegetacion Nativa", "Vegetacion Nativa"),
Shape = c("POLYGON ((-5865371.0349 -2234709.5711000003, -5865383.0660999995 -2234694.5898, -5865392.442 -2234690.814500000))",
"POLYGON ((-5866433.0649 -2236171.0835000016, -5866431.4669 -2236170.9224999994, -5866431.1 -2236170.8986000009))"))
clean_data <- raw_data %>%
st_as_sf(wkt = "Shape", crs = 3857)
mapview::mapview(clean_data) # this not be entirely correct, as the polygons were truncated...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.