我是sf包的新手,并尝试根据查询读取shapefile并将其子集化。在这里,我使用了sf_read()
load <- st_read(dsn = "~Data", layer = "CBSA_MetroDiv",
query = "select * from CBSA_MetroDiv limit 3;")
但它抛出错误
Reading layer `CBSA_MetroDiv' from data source `\Data' using driver `ESRI Shapefile'
Error in st_sf(x, ..., agr = agr, sf_column_name = sf_column_name) :
no simple features geometry column present
有人可以指导我解决这个问题。
答案 0 :(得分:3)
query
选项仅在类DBIObject
的文档中提到,对于“默认S3”方法,没有query
参数,因此您的查询字符串将传递到{ {1}}参数最终被传递给...
,然后在以后的某个点将其插入扳手。
可能有一种解决方法,但是一种解决方案是创建一个包含SQL的虚拟数据集文件。例如,我有一个法国邮政地区的shapefile,这是一个名为st_as_sf
的虚拟数据集文件,它使用SQL select:
filter.vrt
使用纯文本编辑器为shapefile和SQL创建一个类似的文件,然后读取它。在这里,如果我读取shapefile,可以看到6048个特征,但是当读取虚拟数据文件时,只有707个特征:
<OGRVRTDataSource>
<OGRVRTLayer name="points">
<SrcDataSource relativeToVRT="1">codes_postaux_region.shp</SrcDataSource>
<SrcSQL>select * from codes_postaux_region where POP2010 > 20000</SrcSQL>
</OGRVRTLayer>
</OGRVRTDataSource>
您可能需要在过滤后的数据集上设置坐标系(如果知道的话),或者通过另一个VRT文件参数来设置。
可能值得对Edzer进行ping操作,以查看> fr = st_read("./codes_postaux_region.shp",quiet=TRUE)
> nrow(fr)
[1] 6048
> fr = st_read("./filter.vrt",quiet=TRUE)
> nrow(fr)
[1] 707
中针对shapefile的SQL是否可以实现,或者我错过了什么。我感觉有一种方法可以告诉st_read
几何列是什么...