从属性表(或图层)的单个列中选择不同的值


16

有没有一种方法可以从ArcMap中的列中选择不同的值?我有GDB和SHP格式的数据。我已经搜索了使用SQL,QueryLayers,ModelBuilder和各个工具箱进行选择的方法,并且所有选择选项始终都是SELECT * FROM tableName WHERE ...

在SQL中,我将SELECT DISTINCT columnName FROM tableName写入。

Answers:


17

或者,您可以运行ArcToolBox工具“频率”(Analysis Tools >> Statistics >> Frequency),该工具将输出一个具有唯一值的表格以及它们出现的次数。

或者,您可以编写在字段上获取SearchCursor的python脚本,然后构建表单所有值的列表

if value not in myList:
    myList.append(value)

3
如果你没有ArcInfo许可然后用这个工具箱(shape文件上只测试) resources.arcgis.com/gallery/file/geoprocessing/...

3
令人惊讶的是,现在可以使用一些非常简单的Python代码/模块实现多少个ArcInfo函数所需的函数。这很棒!
RyanKDalton 2012年

谢谢Dan,这成功了。我的许可证不支持“频率”工具箱。
史蒂夫

12

使用Python列表理解。

import arcpy
fldName = 'val_fld'
fcName = 'feature_class.shp'
#set creates a unique value iterator from the value field
myList = set([row.getValue(fldName) for row in arcpy.SearchCursor(fcName)]) 

对于大型数据集,一种内存有效的方法是使用生成器表达式

myList = set((row.getValue(fldName) for row in arcpy.SearchCursor(fcName,fields=fldName))

1
由于您只对一个字段感兴趣,因此,为了获得更好的性能,我将指定可选fields参数,例如myList = set([row.getValue(fldName) for row in arcpy.SearchCursor(fcName, fields=fldName)])
blah238

好主意。我很想测试一下性能差异。对于SDE数据源来说,它可能很重要,但是对于shapefile和文件地理数据库,如果发现的话,我会感到惊讶。
塔伦2012年

这很棒。我有一个链接可以很好地显示此内容,但有一天中断了。希望se可以长期使用。
贾斯汀

4

如果您的数据是PGDB格式,则可以使用子查询在查询构建器对话框(定义查询,按属性选择,工具箱表达式等)中执行以下操作:

SELECT * FROM tableName在哪里...

column_to_test_for_unique_values IN 
(SELECT column_to_test_for_unique_values
FROM table_name
GROUP BY column_to_test_for_unique_values HAVING
Count(column_to_test_for_unique_values)=1)

这将返回column_to_test_for_unique_values中的值唯一的记录。


1
您也可以在个人地理数据库上使用DISTINCT。
Jakub Sisak GeoGraphics 2012年


1

如果您的数据在SDE(空间数据库引擎)中,则可以使用python和arcpy的ArcSDESQLExecute对象。可以使用此“方法”传递复杂的sql。

# set up executor for sql
executor = arcpy.ArcSDESQLExecute(sde_connection_sql)

# sql statements
select_max = """select max(LOAD_ID) from SDE.FEATURE_CLASS"""

# get load id
result_max_id = executor.execute(select_max)

0

或者使用您的Python脚本导出到CSV,然后使用另一个数据库的Python API(例如SpatiaLite)读取csv,并在同一脚本中对其进行适当的SQL查询。对于大型表,这可能比滚动您自己的列表构建器-dunno快一点。

无论您做什么,这仍然是ArcGIS的一个令人讨厌的“功能”。


0

distinct在子查询中使用a怎么样(以下是FGDB要素类):

"STATE_NAME" = (select distinct "STATE_NAME" from EsriUsaCountiesDetailed)

帮助(10.0)中注意,这确实有局限性:

Coverage,shapefile和其他基于非地理数据库文件的数据源不支持子查询。


2
“ DISTINCT”仅适用于个人GDB,不适用于文件GDB。
Jakub Sisak GeoGraphics 2012年

0

正如贾斯汀建议的那样。我通常在想要的字段上做一个汇总,然后在dbf上做一个select different,运行一点计算以对每个不同的值进行分类,然后将其连接回原始值。
这是很长的路要走,您必须使用自己喜欢的计算方法来适应。但是...
无论完成什么工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.