在选择分析工具上循环(Python和ArcGIS 9.3)
首先,我刚接触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 个回答
为了让这段代码实现你想要的功能,你需要做很多改动。其实,你可以直接去下载这个 按属性分割图层 的代码,它在ArcGIS网上,功能和你想要的一样。
这里主要的问题出在这行代码上: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,无法编写和检查任何脚本。