st_read()中的查询问题

时间:2018-08-29 22:23:08

标签: r sp sf

我是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

有人可以指导我解决这个问题。

1 个答案:

答案 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几何列是什么...