Verwenden Sie arcpy.SetParameter () mit dem als Geoverarbeitungsdienst veröffentlichten Python Script Tool?

8

Ich habe ein Skript, das als Geoverarbeitungsdienst auf ArcGIS Server veröffentlicht werden muss. Dieses Skript berechnet eine Reihe von Datensätzen in Tabellenform. Ich muss einen Ausgabeparameter festlegen, damit er die Tabelle (Recordset) zurückgibt.

Um sicherzustellen, dass ich eine Tabelle (keine Feature-Class) habe, verwende ich arcpy.TableToTable_conversion () und gebe die Tabelle an den Arbeitsbereich in_memory aus. Ich weiß also, dass ich einen Tisch habe. Ich weiß, dass es Datensätze hat, da ich einen arcpy.GetCount ausführen und die Anzahl der Datensätze abrufen kann.

Ich habe den Ausgabeparameter definiert. So sieht es aus:

arcpy.SetParameter(2, theTable)

Egal was ich versuche, das funktioniert nicht. In meiner Toolbox ist der Ausgabeparameter als RecordSet festgelegt. Ich habe versucht, ein Recordset-Objekt, den Pfad zur In-Memory-Feature-Class und viele andere Ideen bereitzustellen.

Wie geht man mit der Ausgabe einer Tabelle in eine Recordset-Ausgabe mit SetParameter for ArcGIS Server richtig um?

Kenton W.
quelle
Klingt so (von ESRI), dass ich den In-Memory-Arbeitsbereich nicht für die Ausgabe von Recordsets verwenden kann. Bis der Dienst die in der SetParameter-Anweisung festgelegten Elemente abruft, wurde die speicherinterne Tabelle gelöscht.
Kenton W
1
Ich bin mir nicht sicher, wer dir das gesagt hat, aber das ist nicht wahr. Sie können die Ausgabe in_memory verwenden. Die einzige Echtzeit, die Sie in_memory nicht verwenden können, ist, wenn Sie das Ergebnis mit einem Ergebniszuordnungsserver zeichnen möchten
KHibma

Antworten:

5

Nach meiner Erfahrung (und ich bin mehr als glücklich, dies zu korrigieren) ist das Argument, das Sie für die Ausgabe angeben, beim Erstellen eines Geoverarbeitungsdienstes nicht das Objekt selbst, sondern ein Verweis auf das Objekt (den Dateipfad).

Der Datentyp teilt dem Server lediglich mit, wie die Daten zu interpretieren sind, je nachdem, wie Sie das Tool ausführen (innerhalb einer App wird der Datensatz möglicherweise automatisch angezeigt, von SOAP wird der Datensatz möglicherweise als Datenstrom abgerufen (obwohl ich nicht sicher bin) ) und über REST erhalten Sie nur einen Link).

Grundsätzlich müssen Sie Ihre Tabelle in diese Datei schreiben. Der ArcGIS-Server stellt automatisch einen Ordner- / Job-ID-Pfad nach vorne, basierend auf Ihrem Ausgabeordner, ab dem Zeitpunkt, an dem Sie das Modell zum Server hinzugefügt haben. z.B

  1. Ihr Ausgabeordner auf dem Server könnte sein C:/arcgisserver/arcgisoutput
  2. Auf dem Server wird dieser Ordner also /arcgisoutput
  3. Dann könnte Ihre Ausgabe für Ihre Toolbox sein /arcgisoutput/tabletoolbox
  4. Ihr Wert für die Ausgabe könnte sein %scratchworkspace%/tablename.csv

Beachten Sie, dass der %scratchworkspace%ArcGIS-Server in die Ausgabeverzeichnisse aufgenommen werden kann. Siehe Schlüsselkonzepte für Geoverarbeitungsdienste in der ESRI-Hilfe.

Der Server erstellt also automatisch eine Job-ID (UUID), erstellt einen Ordner für Sie in der Ausgabe und stellt diesen Ihrem Ausgabeargument voran. Schreiben Sie Ihre Daten dort und wenn Sie sie vom arcgis-Server zurückerhalten, erhalten Sie einen href-Link wie: http://server_name/arcgisoutput/tabletoolbox/job_id/tablename.csv

Sie sollten jetzt auf die Datei zugreifen können, wie Sie möchten ( urllib2.urlopen(path).read()in Python als schnelle Verknüpfung verwenden).

Hoffe das alles ist klar! -H

om_henners
quelle
0

Ich gehe davon aus, dass der Recordset-Parameter im Parameterskript auf abgeleitet gesetzt wurde.

Ich gehe auch davon aus, dass Sie das Tool entweder direkt mit einer Toolbox oder über ein mxd-Projekt veröffentlichen. Nach meiner Erfahrung war ich mit Tools, die in mxd-Projekten veröffentlicht wurden, erfolgreicher.

Manchmal habe ich Probleme mit Geoverarbeitungsdiensten gelöst, indem ich ein ModelBuilder-Modell veröffentlicht habe, das nur ein Wrapper um das Python-Skript war, dh innerhalb des Modells hatte ich nur das Skript und habe die Skriptparameter außerhalb des Modells verfügbar gemacht.

Roberto Messora
quelle
Ich verwende eine benutzerdefinierte Toolbox, um das Skript als Dienst zu veröffentlichen. Wenn Sie einen Parameter auf Ausgabe setzen, wird er automatisch in Abgeleitet geändert.
Kenton W