1

首先,我是 Python 新手,我在 Arc GIS 9.3 上工作。

我想在“Select_Analysis”工具上实现一个循环。事实上,我有一个由一个城市的所有公交车站组成的“车站”层。该图层有一个字段“rte_id”,用于解释车站所在的线路。

而且我想将所有“rte_id”= 1的站点,“rte_id”= 2的站点保存在不同的层中,依此类推。因此使用了工具 select_analysis。

所以,我决定做一个循环(我有 70 个不同的“rte_id”......所以要创建 70 个不同的层!)。但它不起作用,我完全迷路了!

这是我的代码:

import arcgisscripting, os, sys, string
gp = arcgisscripting.create(9.3)
gp.AddToolbox("C:/Program Files (x86)/ArcGIS/ArcToolbox/Toolboxes/Data Management Tools.tbx")
stations = "d:/Travaux/NantesMetropole/Traitements/SIG/stations.shp" 
field = "rte_id"

for i in field:
    gp.Select_Analysis (stations, "d:/Travaux/NantesMetropole/Traitements/SIG/stations_" + i + ".shp", field + "=" + i)
    i = i+1
    print "ok"

这是错误消息:

gp.Select_Analysis (stations, "d:/Travaux/NantesMetropole/Traitements/SIG/stations_" + i + ".shp", field + "=" + i)
TypeError: can only concatenate list (not "str") to list

你有什么想法可以解决我的问题吗?

提前致谢!朱利安

4

2 回答 2

1

您将需要对此代码进行大量更改,以使其执行您想要的操作。您可能只想从 ArcGIS Online 下载按属性代码拆分图层,它的功能完全相同。

于 2012-01-21T18:55:25.020 回答
1

这里的主要问题在于字符串 for i in field: 您正在尝试迭代字符串 - 字段名称(“rte_id”)。

这是不正确的。您需要迭代字段“rte_id”的所有可能值。

最简单的解决方案: 如果您知道“rte_id”字段的值是 1 - 70(例如),那么您可以尝试

    for i in range(1, 71):
        shp_name = "d:/Travaux/NantesMetropole/Traitements/SIG/stations_" + str(i) + ".shp"
        expression = '{0} = {1}'.format(field, i)
        gp.Select_Analysis (stations, shp_name , expression)
        print "ok"

更复杂的解决方案: 您需要根据 SQL 获取字段“rte_id”的所有唯一值的列表 - 以执行 GROUP BY。

我认为实际上不可能使用一种工具对 SHP 文件执行 GROUP BY 操作。

您可以使用 SearchCursor,遍历所有功能并生成您字段的唯一值列表。但这是更复杂的任务。

另一种方法是使用 ArcMap 中 shapefile 表的 Summarize 选项(打开表,右键单击列标题)。您将获得具有唯一值的 dbf 表,您可以在脚本中读取这些值。

我希望它能帮助你开始!

现在没有 ArcGIS,也无法编写和检查任何脚本。

于 2012-01-19T23:08:19.000 回答