更新:query 现已实施
query 选项现在应该适用于 GDAL/OGR 数据源。
没有query:
> s = st_read(f)
Reading layer `uk_LAD_may_2020_with_insets_v1.1' from data source
`/nobackup/rowlings/Downloads/uk_LAD_may_2020_with_insets_v1.1.shp'
using driver `ESRI Shapefile'
Simple feature collection with 464 features and 9 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: -87544.11 ymin: 5344.479 xmax: 980803.6 ymax: 1220302
Projected CRS: OSGB 1936 / British National Grid
获得 464 个特征。使用查询(我已经引用了图层名称,因为其中有点,您可能不需要):
> s = st_read(f, query="select * from \"uk_LAD_may_2020_with_insets_v1.1\" where scale = 3")
Reading query `select * from "uk_LAD_may_2020_with_insets_v1.1" where scale = 3' from data source `/nobackup/rowlings/Downloads/uk_LAD_may_2020_with_insets_v1.1.shp'
using driver `ESRI Shapefile'
Simple feature collection with 52 features and 9 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: -87544.11 ymin: 146818.5 xmax: 949029.8 ymax: 986035
Projected CRS: OSGB 1936 / British National Grid
只有 52 个功能。
上一个答案:仅适用于较旧的 sf 软件包版本:
query 选项仅在 DBIObject 类的文档中提及,对于“默认 S3”方法,没有 query 参数,因此您的查询字符串被传递到 ... 参数中被传递给st_as_sf,然后在稍后的某个时间点它会在工作中抛出一个扳手。
可能有一种方法,但一种解决方案是创建一个包含 SQL 的虚拟数据集文件。例如,我有一个法国邮政区域的 shapefile,这是一个名为 filter.vrt 的虚拟数据集文件,它应用 SQL 选择:
<OGRVRTDataSource>
<OGRVRTLayer name="points">
<SrcDataSource relativeToVRT="1">codes_postaux_region.shp</SrcDataSource>
<SrcSQL>select * from codes_postaux_region where POP2010 > 20000</SrcSQL>
</OGRVRTLayer>
</OGRVRTDataSource>
使用纯文本编辑器为您的 shapefile 和 SQL 创建一个类似的文件,然后阅读它。在这里你可以看到,如果我读取 shapefile,我得到了 6048 个特征,但当我读取虚拟数据文件时,只有 707 个:
> fr = st_read("./codes_postaux_region.shp",quiet=TRUE)
> nrow(fr)
[1] 6048
> fr = st_read("./filter.vrt",quiet=TRUE)
> nrow(fr)
[1] 707
您可能需要在过滤后的数据集上设置坐标系,如果您知道它,则在读入它之后,或者可能通过另一个 VRT 文件参数。
可能值得 ping Edzer 看看是否可以实现 st_read 中用于 shapefile 的 SQL,或者我是否遗漏了一些东西。我感觉有一种方法可以告诉st_read 几何列是什么...