Цикл на инструменте Select_Analysis (Python и ArcGIS 9.3) - PullRequest
1 голос
/ 20 января 2012

Во-первых, я новичок в 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

У вас есть идеи, чтобы решить мою проблему?

Заранее спасибо! Julien

Ответы [ 2 ]

1 голос
/ 21 января 2012

Вам нужно будет внести существенные изменения в этот код, чтобы заставить его делать то, что вы хотите. Вы можете просто загрузить код Split Layer By Attribute из ArcGIS онлайн, который делает то же самое.

1 голос
/ 20 января 2012

Основная проблема здесь заключается в строке 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.

Iдумаю, что на самом деле невозможно выполнить операцию GROUP BY для файлов SHP с помощью одного инструмента.

Вы можете использовать SearchCursor, выполнять итерацию по всем функциям и генерировать список уникальных значений вашего поля.Но это более сложная задача.

Другой способ - использовать опцию Суммировать в таблице шейп-файлов в ArcMap (открыть таблицу, щелкнуть правой кнопкой мыши заголовок столбца).Вы получите таблицу dbf с уникальными значениями, которые вы можете прочитать в своем скрипте.

Надеюсь, это поможет вам начать!

У вас сейчас нет ArcGIS, и вы не можете писать ипроверьте любой сценарий.

...