在选择分析工具上循环(Python和ArcGIS 9.3)

1 投票
2 回答
3110 浏览
提问于 2025-04-17 10:39

首先,我刚接触Python,并且在使用Arc GIS 9.3。

我想在“Select_Analysis”工具上实现一个循环。实际上,我有一个名为“stations”的图层,这个图层包含了一个城市的所有公交站。

这个图层有一个字段“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

你有什么想法可以帮我解决这个问题吗?

提前谢谢你!

朱利安

2 个回答

1

为了让这段代码实现你想要的功能,你需要做很多改动。其实,你可以直接去下载这个 按属性分割图层 的代码,它在ArcGIS网上,功能和你想要的一样。

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"

更复杂的解决办法:你需要获取字段"rte_id"的所有唯一值的列表,这在SQL中是通过GROUP BY来实现的。

我觉得实际上不可能用一个工具对SHP文件执行GROUP BY操作。

你可以使用SearchCursor,遍历所有特征,生成你字段的唯一值列表。但这是一项更复杂的任务。

另一种方法是在ArcMap中使用shapefile表的汇总选项(打开表格,右键点击列标题)。这样你会得到一个包含唯一值的dbf表格,你可以在你的脚本中读取它。

希望这些能帮助你入门!

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

撰写回答