Python GDAL,SetAttributeFilter 不工作

Python GDAL, SetAttributeFilter not working

我正在尝试使用 GDAL 的 SetAttributeFilter() 来过滤我的 shapefile 图层中的特征,但过滤器似乎没有效果。

我当前的数据是来自美国人口普查局的 shapefile,但我尝试使用其他 shapefile 并得到类似的结果。

例如

from osgeo import ogr

shapefile_path = '../input/processed/shapefile/'
shapefile_ds = ogr.Open(shapefile_path)
cbsa = shapefile_ds.GetLayer('cb_2016_us_cbsa_500k')

print(cbsa.GetFeatureCount())

cbsa.SetAttributeFilter('NAME = "Chicago-Naperville-Elgin, IL-IN-WI"')
feat = cbsa.GetNextFeature()

print(feat.GetField('NAME'))
print(cbsa.GetFeatureCount())

产量

945
Platteville, WI
945

我正在使用 Python 3.6 和 GDAL 2.2.1

你可以捕获SetAttributeFilter语句的return值,并确保它是0,否则就会出错。

在这种特殊情况下,可能是由于引用。单引号指的是字符串文字(一个值),双引号指的是 column/table 名称。

根据您运行此Python代码的方式,stdout/stderr GDAL 中的某处打印如下内容: ERROR 1: "Chicago-Naperville-Elgin, IL-IN-WI" not recognised as an available field.

更多详细信息,请访问: https://trac.osgeo.org/gdal/wiki/rfc52_strict_sql_quoting

要使其正常工作,只需交换 single/double 引号,因此:

cbsa.SetAttributeFilter("NAME='Chicago-Naperville-Elgin, IL-IN-WI'")

虽然这是很久以前的事了,但当我学到一些东西时,我想说一下对我的情况有用的东西,以防我再次搜索它。

对我来说,我必须有这样的语法:

cbsa.SetAttributeFilter('"NAME" = \'Chicago-Naperville-Elgin\'')  # I didn't test multiple values

已接受答案的参考页面显示:

<delimited identifier>     ::= <double quote> <delimited identifier body> <double quote>
<character string literal> ::= <quote> [ <character representation> ... ] <quote>

可能是自 17 年以来对 ogr 的更新改变了这一点。