繁体   English   中英

将外国 object 转换为 sfc object [sfc_MULTIPOLYGON, sfc_POLYGON]

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM