Eksportujesz dane z wyjścia Zbieraj wartości w ArcGIS ModelBuilder?

11

Obecnie gram z ModelBuilder. Dodałem zdjęcie aktualnie posiadanego modelu.

Ten model obecnie iteruje 6 plików kształtów, więc każda z „wartości wyjściowych” zawiera 6 cyfr na liście. Nie mogę znaleźć sposobu na wyodrębnienie wartości z tych list do pliku tabeli / pliku tekstowego lub podobnego.

Czy jest na to sposób?

Model

Oto, co jest wyświetlane, gdy otwieram „wartości wyjściowe” po uruchomieniu modelu: wprowadź opis zdjęcia tutaj

Chcę tylko jakoś złapać te 6 liczb ...

JPD
źródło
To jest właściwie to samo, o co pytasz, prawda? gis.stackexchange.com/questions/25922/... Zbieranie wartości właśnie to robi. Po przeczytaniu pomocy dowiesz się, że zbiera wartości, które można przekazać do innego narzędzia. Więc co próbujesz zrobić z wartościami? Czy wystarczy zalogować je do pliku, czy potrzebujesz ich do dalszego przetwarzania?
theJones
Chcę tylko zalogować je do pliku. Nie mogę znaleźć narzędzia do wprowadzania wartości wyjściowych w narzędziu do tworzenia modeli w celu ich wyodrębnienia.
JPD

Odpowiedzi:

17

Możesz to zrobić za pomocą narzędzia Calculate Value (Data Management) i niektórych magii Python. Zobacz także podobne pytanie: Dodać dowolny kod do konstruktora modeli Arcgis?

Zmienna wielowartościowym jest po prostu ciągiem średnik rozdzielany wartości, więc to, co multivaluesToCsvponiżej funkcja nie jest podzielony zmiennych wielowartościowych na listy i ich transpozycji do wierszy, które są następnie zapisywane do pliku CSV (wartości oddzielonych przecinkami) pliku tekstowego.

Iteratory modeli uruchamiają WSZYSTKIE procesy w modelu raz na iterację - jest to niepożądane w przypadku naszego narzędzia Oblicz wartość, które chcemy uruchomić tylko raz na końcu. Sposób, w jaki to osiągasz, polega na utworzeniu innego, zewnętrznego modelu w celu owinięcia oryginalnego modelu wewnętrznego. Jest to omówione w temacie pomocy Integrowanie modelu w modelu .

Oto, co musisz zrobić, aby to działało:

Model wewnętrzny - Iteruje klasy elementów, przetwarza je, zbiera wartości:

  1. W swoim oryginalnym modelu, który będzie naszym „wewnętrznym” modelem, dodaj kolejne narzędzie Zbieraj wartości, aby zebrać wartości Namezmiennej, abyśmy mogli zmapować wartości statystyki odległości na odpowiadające im nazwy klas obiektów.
  2. Odsłoń zmienne wejściowe i wyjściowe jako parametry modelu (kliknij owal prawym przyciskiem myszy i sprawdź parametr modelu). Zrób to dla każdego z wyników narzędzi Zbieraj wartość, a także dla wszystkich potrzebnych parametrów wejściowych, takich jak Obszar roboczy wprowadzania.
  3. Zapisz i zamknij model wewnętrzny.

Model zewnętrzny - uruchamia model wewnętrzny, uruchamia narzędzie Oblicz wartość tylko raz, gdy model wewnętrzny zostanie ukończony:

  1. Utwórz nowy model - będzie to nasz „zewnętrzny” model.
  2. Dodaj zmienną typu, Folderaby umożliwić określenie miejsca utworzenia wyjściowego pliku CSV.
  3. Dodaj zmienną typu, Stringaby umożliwić określenie nazwy wyjściowego pliku CSV.
  4. Dodaj model wewnętrzny do nowego modelu (przeciągnij i upuść z ArcToolbox lub kliknij prawym przyciskiem myszy i Dodaj dane lub narzędzie, przejdź do modelu wewnętrznego i kliknij Dodaj)
  5. Utwórz zmienne dla dowolnych parametrów modelu wewnętrznego, które chcesz ustawić z modelu zewnętrznego, takich jak wejściowy obszar roboczy (kliknij model wewnętrzny prawym przyciskiem myszy i wybierz polecenie Utwórz zmienną z parametru).
  6. Dodaj narzędzie Oblicz wartość do nowego modelu
  7. Wklej następujące elementy w odpowiednie pola narzędzia Oblicz wartość:

    Wyrażenie :

    multivaluesToCsv(r"%Output CSV File Location%", "%Output CSV File Name%", "%Feature Class Names%", "%Minimum Distance Values%", "%Average Distance Values%", "%Maximum Distance Values%")
    • Wykorzystuje to podstawianie zmiennych w linii, aby przekazać zmienne modelu do funkcji. Dostosuj, aby dopasować nazwy zmiennych modelu.
    • rZanim "%Output CSV File Location%"jest znacząca: oznacza to, że jest to surowy ciąg ; ponieważ ścieżki systemu plików Windows zwykle zawierają ukośniki odwrotne ( znak zmiany znaczenia w Pythonie), musimy tego użyć, aby zapobiec błędnej interpretacji ukośników i kolejnych znaków jako specjalnych sekwencji znaków przez Python.
    • Pamiętaj, aby wstawiać cudzysłowy wokół zmiennych wbudowanych, ponieważ bez nich Python pomyśli, że są to identyfikatory zamiast ciągów.

    Blok kodu:

    import os, csv
    
    def multivaluesToCsv(csvfilepath, csvfilename, fcnames, minvalues, avgvalues, maxvalues):
        ext = 'csv' # Define output file extension (e.g. csv or txt)
        header = ['FC', 'MIN', 'AVG', 'MAX'] # Define header row (column names)
    
        # Join CSV file path and name, adding extension if necessary
        csvfile = os.path.join(csvfilepath, os.extsep.join((csvfilename, ext)) if not os.path.splitext(csvfilename)[1].lower().endswith(ext) else csvfilename)
    
        # Open text file for writing
        with open(csvfile, 'wb') as f:
            w = csv.writer(f)
            w.writerow(header) # Write header row
            rows = zip(*map(lambda x: x.split(';'), [fcnames, minvalues, avgvalues, maxvalues])) # Transpose the semicolon-delimited values into rows
            w.writerows(rows)
        return csvfile
    
  8. (Opcjonalnie) Ujawnij zmienne wejściowe i wyjściowe jako parametry modelu, jeśli chcesz je uruchomić z okna dialogowego narzędzia modelu lub połączyć je z innymi modelami / skryptami. Jedynym wyjściem modelu zewnętrznego jest plik CSV.

  9. (Opcjonalnie) Połącz zmienne wejściowe i dane wyjściowe modelu wewnętrznego z narzędziem Oblicz wartość jako warunki wstępne. Nie sądzę, żeby to faktycznie miało jakikolwiek efekt, po prostu wyjaśnia wizualnie, co się dzieje.

Przetestowałem to z ModelBuilder i sprawiłem, że działa (patrz zrzuty ekranu).

Model wewnętrzny : Model wewnętrzny

Model zewnętrzny: Model zewnętrzny

Model wewnętrzny uruchamia wszystkie procesy raz na klasę elementów, a następnie narzędzie Oblicz wartość uruchamia się na końcu, aby wyprowadzić plik CSV tylko raz.

blah238
źródło
Witam, dziękuję za włożenie tak wiele wysiłku w twoją odpowiedź i przepraszam za moją późną odpowiedź. Próbuję uruchomić model zgodnie z opisem, ale mam problem z CSV. Zrobiłem pusty plik CSV w programie Excel i zapisałem go, a następnie załadowałem do modelu. BŁĄD 000539: Błąd uruchamiania wyrażenia: wielowartościoweToCsv (r „% CSV Plik%”, „% FC Nazwa Wartości%”, „% Minimalne wartości%”, „% Średnie wartości%”, „% Maksymalne wartości%”) <wyjątki typu .IOError '>: [Errno 13] Odmowa dostępu: u'% CSV File% 'Wykonanie nie powiodło się (Oblicz wartość). Wciąż pojawia się ten błąd. Mój plik CSV nosi nazwę CSVFile.csv.
JPD
1
Właśnie to naprawiłem - jest to idealne rozwiązanie. Dziękuję bardzo za Twoją pomoc!
JPD
Kod Python utworzy dla Ciebie plik CSV, nie musisz go wcześniej tworzyć. Jak widać, jeśli otworzysz plik w programie Excel, plik zostanie zablokowany i nie będzie można go zapisać w Pythonie, dopóki go nie zamkniesz.
blah238
2
Do Twojej wiadomości zaktualizowałem instrukcje i zrzuty ekranu, aby używać modeli zagnieżdżonych, aby uniknąć wielokrotnego obliczania wartości, a także naprawić problem, w którym plik tekstowy musiał istnieć wcześniej (teraz podajesz jego lokalizację wyjściową i nazwę pliku jako dwa osobne parametry).
blah238
Doskonała odpowiedź! Pomógł mi rozwiązać podobny problem generowania statystyk geostatystycznych w zakresie weryfikacji krzyżowej warstw do pliku csv. Dzięki @ blah238!
Cotton.Rockwood,
1

Wynik, który opisuje Twój model, jest po prostu wartością zaktualizowaną w tabeli atrybutów, prawda? Czy nie możesz po prostu otworzyć pliku .dbf skojarzonego ze zaktualizowanym plikiem shapefile?

W przeciwnym razie Tabela Wybierz (Narzędzia analizy> Wyodrębnij) powinna współpracować z zapytaniem SQL.

veedub
źródło
Witam, dziękuję za odpowiedź. Obawiam się, że nie aktualizuje pliku .dbf każdego pliku kształtu. Dodanie opcji „Wybór tabeli” do konstruktora modeli również nie działa, ponieważ nie mogę połączyć wartości „Minimalna / średnia / maksymalna odległość” ani „Wartości wyjściowych” jako danych wejściowych dla narzędzia.
JPD