首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将QGIS形状文件导出到R:如何确保多边形类型保存为因子而不是级别?

将QGIS形状文件导出到R:如何确保多边形类型保存为因子而不是级别?
EN

Stack Overflow用户
提问于 2022-03-22 15:31:14
回答 1查看 238关注 0票数 0

删除了我以前的问题,因为我意识到这是问题的症结所在。我正在使用R中的siland软件包来创建最佳缓冲区大小,其中影响最大的是我所拥有的7个陆地覆盖变量中的每个观测点。这些土地覆盖变量是在QGIS中以多边形的形式手工创建的,然后在导出供在R中使用之前,合并成一个单层(脚本:试用-2)。我的问题是,当我将数据读取到R中时,我的多边形类型(例如农业、人为)被认为是因子“层”的层次,而不是自身的因素。我需要农业土地覆盖作为一个因素,这样我就可以计算出缓冲区中有多少区域,而不是用来分配一个多边形是否属于某种类型的非。任何帮助,在这方面做什么,将是超级感谢!

代码语言:javascript
复制
shapedata=st_read(dsn = "R/GIS transfer/", layer = "Trial-2", stringsAsFactors = T) 
#Simple feature collection with 7 features and 1 field
#Geometry type: MULTIPOLYGON
#Dimension:     XY
#Bounding box:  xmin: 442227.6 ymin: 5424196 xmax: 446567.3 ymax: 5428756
#Projected CRS: ETRS89 / UTM zone 32N

str(shapedata)
#Classes ‘sf’ and 'data.frame': 7 obs. of  2 variables:
#$ layer   : Factor w/ 7 levels "Agri T","Anthro T",..: 1 2 3 4 5 6 7
#$ geometry:sfc_MULTIPOLYGON of length 7; first list element: List of 195

编辑:我跟随着siland vignette -它的最终产品是创建一个缓冲区,其中变量与观测最相关(例如,259米用于农业土地覆盖,23m用于人类学等) (https://cran.r-project.org/web/packages/siland/vignettes/siland.html)。

我的代码是:

代码语言:javascript
复制
shapedata=st_read(dsn = "R/GIS transfer/", layer = "Trial-2",) 
#Simple feature collection with 7 features and 1 field
#Geometry type: MULTIPOLYGON
trapdata<-read.table("Trap-Data-PA.csv",header=T,sep=",")
> str(shapedata)
#Classes ‘sf’ and 'data.frame': 7 obs. of  2 variables:
#$ layer   : Factor w/ 7 levels "Agri T","Anthro T",..: 1 2 3 4 5 6 7
#$ geometry:sfc_MULTIPOLYGON of length 7; first list element: List of 195

下一步是绘制,我成功地为每个级别的多边形创建了一个对象。

代码语言:javascript
复制
Agri=st_geometry(shapedata[shapedata$layer == "Agri T",]) #extract an sf object with only polygons of type Agri T 
Anthro=st_geometry(shapedata[shapedata$layer == "Anthro T",]) #extract an sf object with only polygons of type Anthro T 
p<-ggplot(shapedata)+
  geom_sf(data=Agri,fill="red")+
  geom_sf(data=Anthro,fill="blue")+
  geom_point(data=trapdata, aes(x,y),col="green")
 p + coord_sf(xlim = c(8.228361,8.249213),   ylim = c(48.99159,48.99941))

然而,让我感到震惊的是将我的数据输入到siland函数本身:

代码语言:javascript
复制
resB1=Bsiland(obs~x1+L1+L2,land=shapedata,data=trapdata)#bisiland

我没有L1或L2的等价物,它们都是用于土地覆盖的变量。您可以在它们的str(shapedata)中看到它们具有:

代码语言:javascript
复制
str(landSiland)
## Classes 'sf' and 'data.frame':   4884 obs. of  3 variables:
##  $ L1      : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ L2      : num  0 1 0 0 0 0 0 0 1 0 ...
##  $ geometry:sfc_MULTIPOLYGON of length 4884; first list element: List of 1

我的变量似乎没有以相同的方式被视为类,这很可能是为什么当我试图将变量输入到bsiland函数时,它返回以下错误消息:“数据参数中没有用于观察的逗号X和Y”

EN

回答 1

Stack Overflow用户

发布于 2022-03-23 21:13:39

现在我明白了问题所在。显然,siland包预计陆地覆盖多边形将是“一个热编码”。这意味着,需要对数据进行预处理,而不是像通常那样只处理一个土地覆盖类列,以便有多个列,每个陆地覆盖层有一列,每一列包含1或0的值,其中1表示特征属于该土地覆盖层,0表示不是该陆盖层。

实现这一目的的方法之一是在dummyVars包中使用caret函数。下面是它的工作原理:

代码语言:javascript
复制
library(sf)
library(caret)
library(siland)

landcover <- st_read("landcover.shp")
# Remove geometry
landcover_df <- st_drop_geometry(landcover)

# Prepare one hot encoded data.frame
landcover_onehot <- dummyVars("~.", data=landcover_df)
landcover_encoded <- data.frame(predict(landcover_onehot, newdata = landcover_df))
str(landcover_encoded)

# Join back to original 
landcover <- do.call(cbind, list(landcover, landcover_encoded)) 
str(landcover)

希望这能帮助你重回正轨。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71574762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档