簡體   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