Mehr

Model Builder oder ein Python-Skript zum Abrufen von SDE-Daten in einer einzigen GDB-Datei

Model Builder oder ein Python-Skript zum Abrufen von SDE-Daten in einer einzigen GDB-Datei


Möchten Sie wissen, ob Model Builder oder ein Python-Skript besser geeignet sind, um Dutzende von FC aus ArcSDE in eine einzige .gdb-Datei zu ziehen? Das Tool muss regelmäßig ausgeführt werden.


Nun, die Antwort darauf ist wirklich "Es kommt darauf an".

Beide Optionen sind sehr praktikable Lösungen für Ihr Problem und können Ihre Anforderungen wahrscheinlich vollständig erfüllen. Bei dieser Entscheidung sollten Sie jedoch einige Dinge beachten:

Model Builder verwendet die grafische Benutzeroberfläche der Geoverarbeitungswerkzeuge, die Sie wahrscheinlich bereits verwenden, und die Parameter in der Benutzeroberfläche verfügen über Dropdown-Menüs, Kontrollkästchen und greifen direkt auf Datenquelleninformationen (z. B. eine Liste der verfügbaren Feature-Classes) zu, während Sie damit arbeiten in der Schnittstelle. Wenn Sie das Tool häufig anpassen müssen, sollten Sie daher Model Builder aus Gründen der Benutzerfreundlichkeit in Betracht ziehen. Wenn Sie diesen Prozess auch ausführen möchten, während Sie in ArcMap/ArcCatalog Model Builder erstellte Werkzeuge verwenden, können Sie das Modell direkt mit einer vertrauten grafischen Benutzeroberfläche ausführen, um alle Modellparameter anzupassen, während Sie dasselbe mit einem Skript mitbringen müssen es als Skript-Tool ein und ordnen Sie die Parameter zu, schreiben Sie einen geeigneten Validierungscode usw.

Auf der anderen Seite haben Sie jedoch, wenn Sie Erfahrung mit Python haben, etwas mehr Freiheit bei der Anpassung des Workflows an Ihre Bedürfnisse. Wenn Sie zum Beispiel zusätzlich zum Kopieren ein detailliertes Protokoll darüber haben möchten, was genau von wo nach wo kopiert wurde, und dann per E-Mail an Ihren Kollegen gesendet werden soll, der es vorbereitet, damit er weiß, was kopiert wurde und dass es ist verfügbar, bis zur erfolgreichen Ausführung des Skripts ... Nun, Sie könnten dies im Model Builder tun, aber das gleiche wäre wesentlich schwieriger und ineffizienter im Model Builder. Wenn Sie die Ausführung des Tools zu einem bestimmten Zeitpunkt mit dem Windows-Aufgabenplaner planen möchten, ist ein Python-Skript möglicherweise eine bessere Option. Sie können ein Python-Skript so planen, dass es direkt im Aufgabenplaner ausgeführt wird, aber wenn es als Modell gespeichert ist, müssen Sie immer noch ein Python-Skript schreiben, das zumindest ein Wrapper für das Modell ist (ein Python-Skript, das Ihre benutzerdefinierten importiert) Toolbox und ruft das Modell zur Ausführung auf). Dies würde jedoch immer noch das Schreiben eines Python-Skripts erfordern, also möchten Sie vielleicht einfach alles in Python schreiben.

Denken Sie jedoch daran, dass es mit verschiedenen ArcMap- und Model Builder-Optionen oft Möglichkeiten gibt, entweder einzeln ausgeführte Geoverarbeitungsaufgaben oder vollständige Modelle erfolgreich zu übernehmen und sie als Python-Code zu exportieren, den Sie entweder direkt verwenden oder als Referenz zum Schreiben Ihrer eigenen verwenden können Skript. Seien Sie natürlich vorsichtig, wenn Sie diesen softwaregenerierten Code verwenden, da beim Export einige Dinge beschädigt oder einfach geändert werden können, aber es kann ein guter Ausgangspunkt sein, wenn Sie mit arcpy weniger vertraut sind oder nur Probleme mit der Syntax für bestimmte Geoverarbeitungen haben Werkzeuge.

Ich hoffe, das hilft, und lass es mich wissen, wenn ich etwas klären muss.


Sie können Ihre Ausgabe in BIL, BIP, BMP, BSQ, DAT, Esri Grid, GIF, IMG, JPEG, JPEG 2000, PNG, TIFF oder einem beliebigen Geodatabase-Raster-Dataset speichern.

  • .bil für Esri BIL
  • .bip für Esri BIP
  • .bmp für BMP
  • .bsq für Esri BSQ
  • .dat für ENVI DAT
  • .gif für GIF
  • .img für ERDAS IMAGINE
  • .jpg für JPEG
  • .jp2 für JPEG 2000
  • .png für PNG
  • .tif für TIFF
  • keine Erweiterung für Esri Grid

Mit diesem Werkzeug können Sie Ihren Pixeltyp von einer Bittiefe zur anderen skalieren. Wenn Sie Ihre Pixeltiefe skalieren, zeigt Ihr Raster dasselbe an, aber die Werte werden auf die neue angegebene Bittiefe skaliert.

Die Ausgabe dieses Werkzeugs ist immer ein Raster-Dataset. Dieses Werkzeug akzeptiert ein Mosaik-Dataset als Eingabe, die Ausgabe ist jedoch weiterhin ein Raster-Dataset – der Inhalt des Mosaik-Datasets wird mosaikiert, um ein Raster-Dataset zu erstellen.

Wenn Sie in ArcMap Options die Option World-Datei verwenden aktiviert haben, um die Koordinaten des Rasters zu definieren, wird eine World-Datei geschrieben. Wenn eine vorhandene World-Datei vorhanden ist, wird diese überschrieben. Es kann auch eine Halbpixel-Verschiebung im Ausgabe-Raumbezug geben.

Bei dateibasierten Rastern und Personal-Geodatabase-Rastern muss der Hintergrundwert ignorieren auf denselben Wert wie NoData festgelegt werden, damit der Hintergrundwert ignoriert wird. File-Geodatabase-Raster und Enterprise-Geodatabase-Raster funktionieren ohne diesen zusätzlichen Schritt.

Wenn Sie Ihr Raster-Dataset in einer JPEG-Datei, einer JPEG 2000-Datei oder einer Geodatabase speichern, können Sie in den Umgebungseinstellungen einen Komprimierungstyp und eine Komprimierungsqualität angeben.

Das GIF-Format unterstützt nur Single-Band-Raster-Datasets.

Der Parameter pixel-type bestimmt die Bittiefe des Ausgabe-Raster-Datasets. Die Rasterwerte werden neu skaliert, wenn ein anderer Pixeltyp gewählt wird. Wenn der Pixeltyp herabgestuft (verringert) wird, werden die Rasterwerte außerhalb des gültigen Bereichs für diese Pixeltiefe abgeschnitten und gehen verloren. Informationen zur Bittiefenkapazität für unterstützte Exportformate finden Sie unter Unterstützte Raster-Dataset-Dateiformate.


6 Antworten 6

Sie waren fast am Ziel mit Ihrer Nutzung der Split-Funktion. Sie mussten nur die Strings wie folgt verbinden.

Obwohl ich empfehlen würde, dafür die Funktion os.path.dirname zu verwenden, müssen Sie nur die Zeichenfolge übergeben, und sie erledigt die Arbeit für Sie. Da Sie anscheinend Windows verwenden, sollten Sie auch die Abspath-Funktion verwenden. Ein Beispiel:

Wenn Sie nach der Aufteilung sowohl den Dateinamen als auch den Verzeichnispfad benötigen, können Sie die Funktion os.path.split verwenden, die wie folgt ein Tupel zurückgibt.

MIT PATHLIB-MODUL (AKTUALISIERTE ANTWORT)

Man sollte in Erwägung ziehen, pathlib für neue Entwicklungen zu verwenden. Es ist in der stdlib für Python3.4 enthalten, aber für frühere Versionen auf PyPI verfügbar. Diese Bibliothek bietet eine objektorientiertere Methode zum Bearbeiten von Pfaden <opinion> und ist viel einfacher zu lesen und mit </opinion> zu programmieren.


Syntax

Die zu konvertierende Feature-Class oder der zu konvertierende Feature-Layer.

Die Position, an der die Ausgabe-Feature-Class erstellt wird. Dies kann entweder eine Geodatabase oder ein Ordner sein. Wenn der Ausgabespeicherort ein Ordner ist, ist die Ausgabe ein Shapefile.

Der Name der Ausgabe-Feature-Class.

Ein SQL-Ausdruck, der verwendet wird, um eine Teilmenge von Features auszuwählen. Weitere Informationen zur SQL-Syntax finden Sie im Hilfethema SQL-Referenz für in ArcGIS verwendete Abfrageausdrücke.

Die aus der Eingabe-Feature-Class ausgewählten Felder und Feldinhalte. Sie können Ausgabefelder hinzufügen, umbenennen oder löschen sowie Eigenschaften wie Datentyp und Zusammenführungsregel festlegen.

Sie können die ArcPy FieldMappings-Klasse verwenden, um diesen Parameter zu definieren.

Gibt die Speicherparameter (Konfiguration) für Geodatabases in File- und Enterprise-Geodatabases an. Personal-Geodatabases verwenden keine Konfigurationsschlüsselwörter.


Empfehlungen für einen Crashkurs in ArcGIS Server und das Ausführen einer Enterprise-Geodatabase?

Der Kontext ist eine kleine Stadt, die alle ihre GIS-Daten in eine integrierte Lösung migrieren möchte, was Optionen für die Bereitstellung einer robusten GIS-Webkarte für den öffentlichen Gebrauch eröffnet und möglicherweise in Zukunft Felddatenerfassungsstrategien integriert.

Trinkt die ESRI-Coolaid, ist aber daran interessiert, Web Appbuilder Developer einzurichten und Daten intern mit diesem Framework anstatt aus der ESRI-Cloud bereitzustellen.

Abgesehen von diesen Schlüsselwörtern, die ich erwähnt habe, bin ich etwas überfordert, was das Selbsttraining in diesem Bereich des Datenmanagements angeht. Können Sie mich auf Bücher, Handbücher oder Tutorials hinweisen, die Ihrer Meinung nach besonders hilfreich sein könnten, um diese Ziele des integrierten GIS-Datenmanagements in den Griff zu bekommen?

Die ArcGIS Server-Dokumentation ist solide und ich denke, das ist der beste Ort, um mit der Dokumentation zu beginnen. Es gibt einen Abschnitt 'Installationsanleitung' und einen Abschnitt 'Veröffentlichungsdienste'. Diese beiden kombiniert geben Ihnen genug, um ins Rollen zu kommen. Haben Sie bereits eine Lizenz für den Server? Wenn ja, ist das Beste, was Sie tun können, die Dienste zu installieren und zu spielen.

Wenn Sie den Web App Builder nutzen und nicht zu viel benutzerdefinierten Code schreiben möchten, müssen Sie auch ArcGIS Online oder Portal verwenden. Wenn Ihr ArcGIS-Server nach außen gerichtet ist (außerhalb der Stadt-Firewall verfügbar), können Sie einfach ArcGIS Online mit dem Web-App-Builder verwenden und das mühsame Hinzufügen zusätzlicher Softwareinfrastruktur (Portal) vermeiden.

Haben Sie einen Hintergrund im Datenmanagement außerhalb der esri-Plattform? Wenn Sie mir eine Vorstellung davon geben können, wie viel Hintergrund Sie haben, würde es mir helfen, Sie auf die richtigen Ressourcen zu verweisen.

Danke, ich dachte, das Handbuch wäre die erste Anlaufstelle. Haben Sie auch von ESRI/anderen Schulungsmodulen gehört oder Erfahrungen gemacht, die ebenfalls hilfreich sein könnten?

Ich habe ein wenig mit RDBMS und SQL gearbeitet, bin aber bestrebt, mehr Erfahrung zu sammeln. Ich habe eine DB für ein Geographie-Forschungsprojekt mit MS Access erstellt, aber ich habe noch nie eine ernsthaftere Verwaltung einer DB auf einem Server gemacht, ich stelle mir vor, ich habe noch nicht viel DB-Management-Theorie / Namenskonventionsstrategie im Kopf . Ich habe den Eindruck, dass es sehr wichtig ist, die Einrichtung einer Unternehmensdatenbank und eines Unternehmens frühzeitig zu verstehen, um später Kopfschmerzen zu vermeiden.

Einer unserer größten Wünsche mit der Enterprise-GDB ist die Einrichtung von Benutzereinschränkungen und Versionsverwaltung. Wir haben derzeit das klassische Durcheinander von schlecht benannten und gepflegten .shp- und .gdb-Dateien, die über ein Netzlaufwerk verstreut sind.

Ich möchte eine SDE mit unseren Kerndaten und überlasse dann jeder Abteilung die Verantwortung für die Organisation und Pflege kleinerer Projektdateien. Das Hinzufügen von Inhalten zur SDE (für öffentlich zugängliche Daten) müsste also über den GIS-Administrator erfolgen.

Aus Ihren Antworten haben Sie wenig bis keine Erfahrung mit Servern / Enterprise-Datenbanken. Ich empfehle Ihnen dringend, die Kurse von ESRI zu besuchen. Da habe ich angefangen und aufgebaut. Wie andere schon sagten, ist die ESRI-Dokumentation großartig, wenn Sie alles von dort aus erledigen können, aber ich denke, Sie brauchen tatsächlich echtes Training. Weitere Fragen beantworte ich gerne.

DAS DAS DAS. Ich war viele Jahre Analyst und wurde in eine Enterprise-Umgebung ohne Erfahrung geworfen. Die Schulung war sehr ausführlich und die Dokumentation ist ehrlich gesagt genauso gut. Open Source wird ein großer Schmerz sein. Die ESRI kool-aid ist lecker, bietet aber auch jede Menge Unterstützung und Wissensbasis, die bei Problemen von vielen Leuten unterstützt wird.

Dies sind die von Lehrern geleiteten Kurse, die mir geholfen haben: -ArcGIS for Server: Site-Konfiguration und -Verwaltung -Konfigurieren und Verwalten der Mehrbenutzer-Geodatabase -Datenverwaltung in der Mehrbenutzer-Geodatabase -Verteilen von Daten mithilfe der Geodatabase-Replikation

Danke, ich weiß diesen Rat zu schätzen. Beziehen Sie sich auf von Lehrern geleitete Online-Kurse?

Schauen Sie sich die OpenGeo-Suite an, aber seien Sie darauf vorbereitet, die Dokumentation und möglicherweise Foren zu lesen.

Bereiten Sie sich darauf vor, auch Dokumentation und Foren mit ArcGIS-Server zu lesen. Ich habe den Kurs "Einführung in ArcGIS Server" besucht. Ja, es ist möglich, eine schnelle Basis-App zu erstellen, aber wenn Sie einen sicheren, öffentlich zugänglichen Server mit einer voll funktionsfähigen und reaktionsschnellen/zuverlässigen benutzerdefinierten Lösung für Ihren Geschäftsfall wünschen, ist all dieser Marketing-Hype ein etwas übertrieben.

Haben Sie schon ein Angebot von ESRI? Stellen Sie sicher, dass es für Ihren öffentlichen Anwendungsfall, einschließlich der Felddatenerfassung, und nicht nur für eine interne Einrichtung mit einer Handvoll Benutzern geeignet ist. Die OpenGeo-Suite wird auch nach diesem Kauf und dem jährlichen Wartungsangebot äußerst attraktiv aussehen. Geschwindigkeit, Robustheit, Funktionalität, Benutzerunterstützung usw. machen es auch attraktiv.

Sehen Sie sich die ESRI-Presse an, ArcGIS kennenlernen. Esri hat ein exemplarisches Handbuch erstellt, in dem Sie die Verwendung ihrer Software nachschlagen. Stellen Sie einfach sicher, dass Sie die richtige Edition für die Version erhalten.

Sie haben bereits eine gute Trainingsberatung erhalten. Ich möchte Ihnen einige unaufgeforderte Ratschläge geben, da ich Organisationen unterschiedlicher Größe dabei geholfen habe, ihre GIS-Operationen von Grund auf neu aufzubauen.

Ich kann mir vorstellen, dass ich noch nicht viel DB-Managementtheorie/Namenskonventionsstrategie im Kopf habe.

Sie haben Recht, es ist wichtig, mit einem guten Datenmodell zu beginnen. Dies ist ein wahres Beispiel dafür, dass eine Unze Prävention ein Pfund (oder in diesem Fall mehrere Tonnen) Heilung wert ist. Unmittelbar nach dem Laden der Daten möchten Sie Karten erstellen, Systeme integrieren usw. - sobald Sie Abhängigkeiten von Ihrem Datenmodell haben, ist es eine königliche PITA, Datenmodelle (ich habe winzig (25 FC's) auf groß migriert) zu migrieren (300+ FC's) Datenmodelle). Frustrationen mit einem schlechten Datenmodell werden Sie nachts wach halten und Sie erhalten wenig bis gar keine Unterstützung, um es zu beheben (hauptsächlich, weil es viel Zeit und Mühe (auch bekannt als Geld) kostet und niemand einen Unterschied sehen wird, wenn es x27s fertig.)
Ich empfehle uneingeschränkt die Verwendung eines vordefinierten Datenmodells, denn warum das Rad neu erfinden. Sie arbeiten für eine kleine Stadt und Esri hat ein lokales Regierungsinformationsmodell, das möglicherweise perfekt für Ihre Bedürfnisse geeignet ist. Dieses verfügt nicht nur über ein etabliertes Modell, sondern auch über ein Support-Netzwerk, vorgefertigte Karten, vorgefertigte Bearbeitungswerkzeuge usw. Und durch die Verwendung eines gemeinsamen Datenmodells sind Sie besser in der Lage, andere Datenquellen zu integrieren. Beachten Sie, dass das LGIM ein Ausgangspunkt ist und Sie den Großteil davon löschen möchten.

. anstatt aus der ESRI-Cloud.

Haftungsausschluss: Ich arbeite für GeoNorth
Esri's Koolaid schmeckt gut, aber Sie sollten sich umschauen und die Preise vergleichen. Esri bietet mehr als nur Esri zum Speichern/Bereitstellen von Daten aus der Cloud. GeoNorth ist ein Beispiel für ein Unternehmen, das Ihre SDE, AGS und Webkarten hostet, damit ein Kunde kein Geld für Server, jemanden für die Serververwaltung, Softwarelizenzen usw. ausgeben muss. AGS kann sehr teuer und nicht wert sein die Kosten für viele Organisationen, wenn billigere Optionen verfügbar sind. Unsere Hosting-Services reichen von einer einzelnen Komponente bis hin zum kompletten Stack. Ich weiß, dass GeoNorth nicht das einzige Unternehmen ist, das dies tut, aber ich musste noch nie nach anderen suchen.

Eine zu berücksichtigende Sache ist die Verwendung eines Internet-Mapping-Frameworks für Ihre Webkarten. Diese erhalten innerhalb weniger Stunden eine Karte online und werden der Öffentlichkeit zugänglich gemacht - ohne Programmierkenntnisse. GeoCortex (keine Zugehörigkeit) und MapOptix (das Produkt meiner Firma) sind zwei, mit denen ich zusammengearbeitet habe und für die ich bürgen kann.
All dies könnte auch eine Option sein, um Sie zum Laufen zu bringen und dann bestimmte gehostete Komponenten auslaufen zu lassen, wenn Ihre Fähigkeiten wachsen.

Heutzutage ist es wirklich nicht schwer, eine Enterprise GDB einzurichten – ArcCatalog/ArcTools hat die Tools, die das für Sie erledigen. Für SQL Server wird die DB eingerichtet und dann ist sie "GDB aktiviert". Sie müssen Statistiken und Zustände verwalten, können jedoch Python-Skripte finden, um diesen Prozess zu automatisieren. Verstehen Sie mich nicht falsch, die SDE-bezogenen Klassen, auf die Seanjonathon hingewiesen hat, sind der Schlüssel zur ordnungsgemäßen Verwaltung und Behebung, wenn etwas schief geht. Versionierungsstrategien sind ein Gleichgewicht zwischen dem, wie es sein sollte, und den Kopfschmerzen, mit denen Sie fertig werden möchten. Wenn Ihre Aufteilung der Datenverantwortung klar ist und Abteilung X niemals mit den Daten von Abteilung Y manipuliert, benötigen Sie möglicherweise überhaupt keine Versionen (aber haben immer noch eine versionierte GDB), da Berechtigungen verhindern würden, dass die eine die andere durcheinander bringt. Wenn Sie Versionen haben, müssen Sie diese verwalten.
Derzeit können Kartendienste am besten über AGS bereitgestellt werden, wenn sie in eine File GDB bezogen werden (das ist auch die Empfehlung von Esri). Sie können die erforderlichen Daten für die Veröffentlichung durch ein Skript extrahieren lassen oder die GDB-Replikation (einseitig) verwenden, um diese FGDB auf dem neuesten Stand zu halten.

Und schließlich - verlassen Sie sich niemals auf SQL Server .bak als Ihre GDB-Sicherung. Die Wiederherstellung dauert eine Weile, kann nur zu einem einzigen Zeitpunkt wiederhergestellt werden und ist berüchtigt dafür, dass sie beschädigt sind. Wenn Ihre SQL Server- oder SDE-Instanz beschädigt wird, sind sie großartig. Wenn Ihre Tabellen beschädigt oder gelöscht werden oder Funktionen versehentlich bearbeitet werden, sind sie in Ordnung – wenn sie überhaupt funktionieren. Tägliche FGDB-Backups zu haben, um auch nur eine einzelne Funktion wiederherzustellen, hat mir und / oder meinen Kunden unzählige Male erspart.


Turbolader-Datenmanipulation mit Python-Cursoren und -Wörterbüchern

von RichardFairhurs t

Die Probleme bei der Verwendung des Feldrechners, der Join- und der Zusammenfassungsstatistik-Tools

Der Feldrechner ist ein großartiges Werkzeug und einfach einzurichten, weist jedoch einige Einschränkungen auf, die skriptgesteuerte Routinen erheblich verlangsamen können, wenn Sie viele Daten mit großen Datensätzen bearbeiten müssen. Die offensichtlichste Einschränkung besteht darin, dass jeweils nur ein Feld berechnet werden kann. Dies bedeutet häufig, dass jeder Datensatz in der Feature-Class mehrmals verarbeitet werden muss, um mehrere Felder zu aktualisieren. Wenn Sie Datenübertragungen zwischen Feature-Classes mithilfe eines Joins durchführen müssen, ist es wichtig, das Join-Feld in beiden Feature-Classes zu indizieren, um Berechnungen zu vermeiden, deren Verarbeitung ewig dauert, und selbst dann ist die Geschwindigkeit bei einem Join erheblich geringer. Wenn Sie tatsächlich mehrere Felder verwenden müssen, um einen Join zu erstellen, der Datensätze zwischen Feature-Classes korrekt abgleicht, besteht Ihre einzige Möglichkeit darin, in beiden Feature-Classes ein neues Feld zu erstellen, das diese Feldwerte verkettet, um einen funktionierenden Join zu erstellen. Außerdem muss oft, bevor diese Joins erstellt werden können, eine Übersichtstabelle erstellt werden, was mehr Zeit in Anspruch nimmt.

Wenn Sie ArcGIS Desktop 10.1 oder höher verwenden, gibt es glücklicherweise eine Alternative, die solche Skripte drastisch beschleunigen und die Datenübertragung zwischen Feature-Classes flexibel und unglaublich schnell machen kann. Die Lösung besteht darin, den Feldrechner durch einen oder mehrere Datenzugriffs-Cursor (da-Cursor) und Joins zu ersetzen und Übersichtstabellen mit einem oder mehreren Python-Wörterbüchern zu erstellen, die mit einem da SearchCursor erstellt wurden.

Verwenden eines da UpdateCursors zum Ersetzen einer Feldberechnung innerhalb einer einzelnen Feature-Class:

Unten sehen Sie ein einfaches Skript, das einen da UpdateCursor für eine Feature-Class verwendet, um ein URL-Feld mit einem Hyperlink auszufüllen, der mit einem Wert aus einem anderen Feld erstellt wird. Die Methode strftime wird verwendet, um die Start- und Endzeit des Skripts auszugeben. Um dieses Skript an Ihre eigenen Daten anzupassen, müssen Sie nur den Feature-Class-Pfad und den Namen in Zeile 7, die Feldnamen in der Feldliste in Zeile 9 und den URL-String in Zeile 14 ändern. Dies sollte ungefähr 7-mal schneller sein als a perform ähnliche Feldberechnung.

Verwenden eines da UpdateCursors zum Ersetzen mehrerer Feldberechnungen innerhalb einer einzelnen Feature-Class:

Nehmen wir nun an, dass wir tatsächlich 2 weitere Feldberechnungen verarbeiten müssen, um die Aktualisierung dieser Feature-Class abzuschließen. Bei einer Berechnung müssen zwei weitere Felder addiert werden, und bei der anderen müssen die Werte in einem Feld von großgeschriebenen Werten in Groß-/Kleinschreibungswerte umgewandelt werden. Wenn also 100.000 Datensätze vorhanden sind, müssen alle diese Datensätze dreimal berechnet werden.

All dies kann in einem einzigen Durchgang von einem da UpdateCursor durch die 100.000 Datensätze gehandhabt werden. Da die Datensätze nur einmal geändert werden müssen und das Hinzufügen weiterer Felder zum Lesen oder Berechnen durch den UpdateCursor nur sehr wenig zusätzliche Verarbeitungszeit in Anspruch nimmt, ist der Geschwindigkeitsgewinn über 3 Feldberechnungen viel schneller als beim vorherigen Skript. Als Ergebnis wird die Geschwindigkeit des Skripts umso dramatischer, je mehr Feldberechnungen Sie mit einem einzigen Durchgang eines da UpdateCursors ersetzen können.

Unten sehen Sie das Skript, das alle drei Feldaktualisierungen durchführen kann (angenommen, es gibt keine Nullwerte in den Feldern, die addiert werden oder die Groß-/Kleinschreibung geändert wird). Um dieses Skript mit Ihren eigenen Daten zu verwenden, müssen Sie nur noch die Zeilen 7, 9 und 14 ändern (ändern Sie optional die Berechnungen in den Zeilen 16 und 18).

Verwenden eines Python-Wörterbuchs, das mit einem da SearchCursor erstellt wurde, um einen Join zu ersetzen, der zwei Feature-Classes verbindet:

Eine weitere übliche Datenbearbeitung besteht darin, eine Feature-Class mit einer anderen zu verbinden, um Werte von der Joined-Feature-Class in die Target-Feature-Class mithilfe des Feldrechners zu übertragen. Features, die mit einem Suchcursor in ein Python-Wörterbuch geladen werden, können jedoch viel schneller Join-Feldwerte in einer Feature-Class mit einer anderen abgleichen als ein Join. In Kombination mit der Verwendung eines da UpdateCursors zum Ersetzen des Feldrechners kann die Geschwindigkeit dieser Art von Datenbearbeitungen noch dramatischer sein als die von Datenbearbeitungen an einer einzelnen Feature-Class.

Beispiel 1 – Übertragung eines einzelnen Feldwerts zwischen Feature-Classes

Unten ist der Code, der erforderlich ist, um den Wert einer Feature-Class auf eine andere basierend auf einem gemeinsamen Join-Wert in einem anderen Feld zu übertragen. Um dieses Skript an Ihre eigenen Daten anzupassen, ändern Sie die Zeilen 7 und 14 in den Pfad und den Namen der Quell- (Join) und aktualisieren Sie (Ziel)-Feature-Class, damit sie den Feature-Classes entsprechen, die Sie normalerweise verbinden würden, ändern Sie die Zeilen 9 und 16, um das Feld zu ersetzen Liste mit dem Namen des Join-Feldes und dem Namen des zu übertragenden Feldes.

Beispiel 2 – Übertragung mehrerer Feldwerte zwischen Feature-Classes, bei denen eine 1:1-Übereinstimmung zwischen Feldsätzen vorliegt

Genau wie beim Feldrechner wird Ihr Skript umso schneller, je mehr Felder von einer Feature-Class in die andere übertragen werden. Handelt es sich bei der Übergabe um ein einfaches Feld für die Feldübergabe, können die Übergabefelder in einer for-Schleife behandelt werden. Unten sehen Sie ein Beispiel für eine Übertragung von 5 übereinstimmenden Feldern zwischen zwei Feature-Classes. Um diesen Code an Ihre Daten anzupassen, sollten Sie die Feature-Classes in den Zeilen 7 und 14 und die Feldlisten in den Zeilen 9 und 16 noch einmal ändern.

Beispiel 3 – Übertragung mehrerer Feldwerte zwischen Feature-Classes mit komplexen Feldmanipulationen

Wenn Sie komplexere Feldübertragungen durchführen müssen, die mehr tun als eine einfache Übertragung von Daten von einer Tabelle in eine andere, können Sie dies mit einem Code tun, der den Beispielfeldberechnungen ähnelt, die für eine einzelne Tabelle durchgeführt wurden. Hier sind die 3 Feldaktualisierungen meines zweiten Feldberechnungsbeispiels, die zwischen zwei separaten Tabellen mit gemeinsamen Join-Werten statt alle innerhalb einer einzigen Tabelle durchgeführt wurden.

Erstellen eines Python-Wörterbuchschlüssels mit mehreren Feldern zum Ersetzen eines verketteten Join-Felds:

Die Handhabung von Mehrfeld-Join-Werten, die mit Datensätzen zwischen zwei Feature-Classes übereinstimmen, ist auch mithilfe von Wörterbüchern und Cursorn möglich, ohne dass separate Felder zu einem neuen Feld verkettet werden müssen. Die Verkettung ist immer noch notwendig, kann aber im Arbeitsspeicher im Handumdrehen verarbeitet werden, was viel schneller ist als die Berechnung eines Felds. Unten sehen Sie ein Beispiel für die Übertragung eines einzelnen Felds, aber dieses Mal werden Datensätze mit 3 separaten Feldern abgeglichen, um die eindeutigen Werte zwischen den Feature-Classes zu definieren, die zum Abgleichen der Datensätze zwischen den Feature-Classes verwendet werden.

Ersetzen aufeinanderfolgender Verknüpfungen durch die gleichzeitige Verarbeitung mehrerer Python-Wörterbücher, die mit da SearchCursors erstellt wurden

Wenn mehrere Joins erstellt und entfernt werden müssen, um Daten zwischen Tabellen zu bearbeiten, können die Geschwindigkeitsgewinne noch gesteigert werden, da Sie mehrere Wörterbücher erstellen und dann alle Join-Beziehungen gleichzeitig während eines einzigen Durchgangs des Update-Cursors auf dem aktualisierte Feature-Class. Alle Quelltabellen sollten in Wörterbücher gelesen werden, bevor der Aktualisierungscursor verarbeitet wird, um diesen Vorteil zu erzielen. Je mehr Joins Sie auf diese Weise ersetzen können, desto besser wird Ihre Skriptgeschwindigkeit.

Unten sehen Sie ein Beispiel, in dem zwei Feature-Classes, die normalerweise mit der aktualisierten Feature-Class verbunden würden, durch Wörterbücher ersetzt und gleichzeitig von einer einzigen UpdateCursor-Operation verarbeitet werden.

Verwenden eines Python-Wörterbuchs, das mit einem da SearchCursor erstellt wurde, um eine Ausgabetabelle für Zusammenfassungsstatistiken zu ersetzen

Eine weitere häufige Notwendigkeit besteht darin, eine Zusammenfassung einer Feature-Class für die eindeutigen Werte eines Felds oder von Feldern zu erstellen, die mehrere Datensätze umfassen. Das Python-Wörterbuch kann anstelle einer Ausgabe der Zusammenfassungstabelle verwendet werden, um dies zu erreichen. Der Vorteil besteht darin, dass die Ausgabe im Arbeitsspeicher gespeichert wird und viel schneller erstellt werden kann als die Ausgabe einer tatsächlichen Übersichtstabelle. Unten sehen Sie ein Beispiel zum Erstellen eines Zusammenfassungswörterbuchs und zum Aktualisieren der Quelltabelle mit Summenwerten, die diesem Feld entsprechen, und zum Erstellen eines Prozentfelds in der Quelltabelle für jeden Datensatz, der die Zusammenfassung erstellt hat.

Sobald die Muster verstanden sind, ist es möglich, mit einem Update-Cursor oder einem Python-Wörterbuch praktisch alles zu tun, was Sie mit dem Feldrechner, einem Join oder einer Zusammenfassungstabelle tun können. Mit diesen Codierungstechniken war ich in der Lage, mehrere Skripte umzuschreiben, die Massendatenmanipulationen durchgeführt haben, sodass die Verarbeitung nicht mehr als eine Stunde dauert, sondern nur noch 3 bis 10 Minuten. Je mehr dieser Vorgänge Sie mit einem solchen Code ersetzen können, desto größer sind die Einsparungen bei der Verarbeitungszeit. Die Leistungssteigerungen können enorm sein und ermöglichen es, Daten ohne lange Wartezeiten auf dem neuesten Stand zu halten oder große Teile Ihrer Stapelverarbeitungszeit nach Geschäftsschluss in Anspruch zu nehmen. Es löst auch die Probleme, die auftreten, wenn Sie das Quelldatenschema nicht ändern können, um Indizes oder Feldverkettungen hinzuzufügen, und das Erstellen von Kopien der Daten nicht praktikabel ist.

Wenn Sie Fehler im Beispielcode finden, lassen Sie es mich bitte wissen und ich werde ein Update in diesem Blog veröffentlichen, um auf die Korrektur hinzuweisen. Wenn Sie dem Code weitere Kommentare hinzufügen möchten, um zu verstehen, was vor sich geht, lassen Sie es mich wissen und ich werde versuchen, den Code vollständiger zu kommentieren. Diese Codebeispiele wurden für Shapefiles, File-Geodatabase-Feature-Classes und nicht versionierte SDE-Feature-Classes entwickelt. Damit sie mit versionierten SDE-Feature-Classes funktionieren, sind zusätzliche Codeänderungen erforderlich.

Ich möchte Chris Synder meinen Dank aussprechen, der mir zuerst die Nützlichkeit dieser Techniken durch das Forum gezeigt und mir geholfen hat, sie anzuwenden.

von DanPatterson_Re müde

Gute Arbeit Richard. für meinen Unterricht vorgemerkt

von RichardFairhurs t

Ich habe einen Fehler in meinen Codebeispielen gefunden. Wo immer ich versucht habe, einen String in Title Case zu konvertieren, sollte die Syntax nicht lauten:

updateRow[ 5 ] = Titel(updateRow[ 5 ])

updateRow[ 5 ] = updateRow[ 5 ].title()

Hinweis: Der ursprüngliche Blog-Beitrag wurde korrigiert.

Danke dafür, Richard - sehr hilfreich.

Würde es Ihnen etwas ausmachen, die Logik in dieser Zeile für mich aufzuschlüsseln? Ich würde gerne wissen, was jede der Komponenten macht:

von RichardFairhurs t

Das ist eine gute Frage, und der Versuch, diese Codezeile zu erklären, wird mir wahrscheinlich helfen, sie auch in Zukunft zu verstehen und optimal zu nutzen.

Ich werde versuchen, es von links nach rechts zu zerlegen.

1. Zuweisung an die letzte Wörterbuchvariable (dies sollte offensichtlich sein, ist aber definitiv wichtig)

2. Die öffnende geschweifte Klammer (und die schließende geschweifte Klammer ganz am Ende) macht alles innerhalb eines Wörterbuchs. Alles andere innerhalb der geschweiften Klammern dient letztendlich dazu, die aus der Tabelle gelesenen Schlüssel/Wert-Paare zu extrahieren, die von späteren Wörterbuch-Suchprozessen verwendet werden.

3. r steht für eine Zeile, die von einem auf Ihrer Tabelle geöffneten Cursor gelesen wird. r[0] liest das erste (nullbasierte) Element der Zeile, das tatsächlich der Wert aus dem ersten Feld in jeder gelesenen Zeile ist. Der Doppelpunkt nach r[0] bedeutet, dass dieser Wert der Wörterbuchschlüssel ist, der von späteren Wörterbuchsuchen verwendet wird.

4: Nach dem Doppelpunkt steht der Wörterbuchwert, der dem Wörterbuchschlüssel zugeordnet ist. Dies wird durch alles definiert, was in das Klammerpaar fällt, ein Tupel oder eine Sammlung von Werten, die als einzelner Wert behandelt und übergeben werden können. Dictionary-Schlüssel/Wert-Paare sind darauf beschränkt, einen einzelnen Wert nach dem Doppelpunkt zu verwenden, aber dazu gehören Sammlungen wie ein Tupel oder eine Liste, solange sie als ein Wert übergeben werden können.

5. Die r[1:] innerhalb der Klammer sind Teil eines Listenverständnisses, das alle Feldwerte in den restlichen Cursorfeldern extrahiert, die als separate Elemente innerhalb des Tupels oder der Listensammlung gelesen werden. [1:] bedeutet, mit dem Wert des zweiten Felds in der Feldliste beginnen und Werte aus jedem folgenden Feld anhängen, bis das letzte Feld in der Feldliste gelesen wurde.

6 Das "for r in" ist Teil eines Listenverständnisses, das jede Zeile in einem Cursor durchläuft.

7. Der letzte Teil des Listenverständnisses erfolgt vor der geschweiften Endklammer des Wörterbuchs. Dieser Code öffnet einen Suchcursor in der angegebenen Tabelle ( sourceFC), der zum Lesen der Zeilen aus der Tabelle verwendet wird. Der Cursor wird vom Iterator in Punkt 6 oben Zeile für Zeile gelesen und jede Zeile enthält die Werte der Felder, die in der bereitgestellten Feldliste ( sourceFieldsList) angegeben sind.

Die obige Struktur ist gut, da jede Zeile zu einem Wörterbuchschlüssel führt, der immer eindeutig ist. Wenn mehr als eine Zeile denselben Wörterbuchschlüsselwert enthalten kann, müssen Sie normalerweise eine Struktur verwenden, um einen Cursor in ein Wörterbuch ähnlich dem unten gezeigten einzulesen (es gibt viele mögliche Variationen dieses Musters, daher ist dies nur ein Beispiel). :

  1. # Erstellen Sie ein Zusammenfassungswörterbuch aus einem da SearchCursor mit eindeutigen Schlüsselwerten eines Felds, das eine Liste der Summe dieses Wertes und der Datensatzanzahl speichert.
  2. valueDict = <>
  3. mit arcpy.da.SearchCursor(sourceFC, sourceFieldsList) als searchRows:
  4. für searchRow in searchRows:
  5. keyValue = searchRow[ 0 ]
  6. wenn nicht keyValue in valueDict:
  7. # dem Wörterbuch einen neuen keyValue-Eintrag zuweisen, der eine Liste des ersten NumberField-Werts und 1 für den ersten Datensatzzählerwert speichert
  8. valueDict[keyValue] = [searchRow[ 1 ], 1 ]
  9. # Summiere die letzte Zusammenfassung des NumberField-Werts mit dem aktuellen Datensatz und erhöhe die Datensatzanzahl, wenn der Schlüsselwert bereits im Wörterbuch vorhanden ist
  10. sonst:
  11. valueDict[keyValue][ 0 ] += searchRow[ 1 ]
  12. valueDict[keyValue][ 1 ] += 1

Tolle Erklärung - danke Richard!

Diese Informationen waren sehr hilfreich, Danke Richard.

Ich habe einen Join Field-Prozess ersetzt, der dauerte

40 Minuten mit arcpy.da.TableToNumPyArray und arcpy.da.ExtendTable, die jetzt in 6 Sekunden abgeschlossen sind.

Ich frage mich, warum die Standardtools nicht mit diesem leistungsstärkeren Modul implementiert werden?

Dies war eine der nützlichsten Python-Webseiten, die ich je gefunden habe. Die hier demonstrierten Techniken sparen Zeit, indem sie nicht nur schneller als die Alternativen laufen, sondern auch die Menge an Code reduzieren, die ich schreiben muss. Vielen Dank!

von RichardFairhurs t

Vielen Dank, dass Sie sich die Zeit genommen haben, Ihre Wertschätzung für diese Technik zu teilen. Die Beispiele in diesem Blog sind bewusst einfach gehalten, um das Wesentliche der Technik hervorzuheben.

Für ein fortgeschritteneres Beispiel, wie die Technik angewendet werden kann, sehen Sie sich den Code an, den ich als Reaktion auf arcpy entwickelt habe - Wie kann man die Leistung verschachtelter Suchcursor verbessern? - Geographischer Informationssystem-Stack. . Der Code in diesem Beitrag zeigt:

1) wie Sie Wörterbücher verwenden, wenn Sie mit einer Reihe von Tabellen arbeiten, die einen relationalen Baum mit mehreren Ebenen bilden,

2) wie man die Dictionary(list)-Methode verwendet, um einen Wörterbuchschlüssel effizient mit einer Liste von Listen-Wörterbuchwerten zu füllen, die mehrere dem Schlüssel zugeordnete Datensätze enthalten,

3) wie man auf die Liste der Listenwerte zugreift, wenn die Wörterbuchschlüssel für Übereinstimmungen verarbeitet werden, und

4) wie ein Tupel erstellt und verwendet wird, das als zusammengesetzter Mehrfeld-Wörterbuchschlüssel fungiert.

Ich habe Probleme bei der Verwendung des Beispiels für "Erstellen eines Python-Wörterbuchschlüssels mit mehreren Feldern zum Ersetzen eines verketteten Join-Felds:"

Ich habe durch Quell-/Update-Feature-Classes und -Feld ersetzt, aber wenn ich versuche, das Skript auszuführen, erhalte ich die Fehlermeldung:

Parsing-Fehler SyntaxError: ungültige Syntax (Zeile 23)

Ich kann nicht erkennen, was das Problem mit der Codezeile ist.

ab zeit strftime importieren

print "Skript starten: " + strftime("%Y-%m-%d %H:%M:%S")

sourceFieldsList = ["WPP_TYPE", "MATERIAL", "DIAMETER", "Unit_Rate"]

# Use list comprehension to build a dictionary from a da SearchCursor where the key values are based on 3 separate feilds
valueDict =

updateFieldsList = ["Asset_Type", "EXTG_Material", "Diameter", "Repl_Cost"]

mit arcpy.da.UpdateCursor(updateFC, updateFieldsList) als updateRows:
für updateRow in updateRows:
# store the Join value by combining 3 field values of the row being updated in a keyValue variable
keyValue = updateRow[0]+ "," + str(updateRow[1]) + "," + str(updateRow[2]
# Überprüfen Sie, ob sich der keyValue im Dictionary befindet
if keyValue in valueDict:
# transfer the value stored under the keyValue from the dictionary to the updated field.
updateRow[3] = valueDict[keyValue][0]
updateRows.updateRow(updateRow)

print "Finished script: " +strftime("%Y-%m-%d %H:%M:%S")

by NeilAyres

Firstly, it would help if you format the code correctly so it is more readable.

by NeilAyres

But i would think that the error is here :

That doesn't look like it is going to form a dictionary inside the <>.

Dictionaries are populated with key : value pairs.

Hang on, looking at that again.

But why not do this in 2 steps, use the OID as the key, put all the other data in a value list.

Then calculate a new concatenated value.

I'm not sure if this is your problem or not, but you are missing a closing parenthesis at the end of this line:

keyValue = updateRow[0]+ "," + str(updateRow[1]) + "," + str(updateRow[2]

von RichardFairhurs t

Try making the first field a string like you do when you are building the dictionary. Also ändern:

Fügen Sie auch die Endklammer in dieser Zeile für die letzte str()-Methode hinzu.

Danke, dass du das bemerkt hast, Richard, ich bin erstaunt, wie schnell der Python-Code funktioniert.

von RichardFairhurs t

Freut mich zu hören, dass du es zum Laufen gebracht hast. Jetzt wissen Sie, warum ich "Turbo Charging" in den Blogtitel aufgenommen habe.

Kann Esri dazu Stellung nehmen, ob an der Verbesserung der Leistung des Join-Tools gearbeitet wird?

Irgendwelche Tipps zur Verwendung der Insert-Cursor-Methode mit einem Wörterbuch, ohne die Feldnamen hart zu codieren?

von RichardFairhurs t

Ich bin mir nicht sicher, ob ein Wörterbuch die Leistung des Codes aus dem zweiten Beitrag, auf den Sie verwiesen haben, überhaupt verbessert. In diesem Beitrag versuchen Sie nicht, eine vorhandene Zeile abzugleichen. Sie übertragen nur die Daten in jeder Zeile, ohne etwas abzugleichen. Die Direktzugriffsfunktion des Wörterbuchs wird also nicht verwendet und Sie können keinen der Schritte aus dem vorgeschlagenen Code entfernen, indem Sie ein Wörterbuch einbinden.

Ich stimme dem Kommentar zu, der besagt, dass Sie das Einfügen in die Geodatabase-Felder OID, Fläche und Länge vermeiden sollten. Ich würde auch nicht in ein GlobalID-Feld einfügen, wenn Sie eines haben. Dort wird auch geprüft, ob ein Feld editierbar ist oder nicht. Wenn SDE beteiligt ist, ist mehr Code zum Starten und Stoppen einer Bearbeitungssitzung erforderlich, und die Leistung sinkt.

Was ist also das Endziel Ihrer Frage? Ein Werkzeug? Wenn ja, sehen Sie sich meine Alternative zum Append-Tool an, das in meinem Multi-Field to Single Field-Tool in diesem Blog enthalten ist. Es befasst sich mit dem Problem der nicht bearbeitbaren Felder und ermöglicht die Übertragung von Datensätzen zwischen zwei eigenständigen Tabellen, von einer Feature-Class in eine eigenständige Tabelle und zwischen Feature-Classes mit demselben Geometrietyp. Ich kann mich jedoch nicht erinnern, ob ich es mit SDE kompatibel gemacht habe oder nicht. Ich glaube, ich habe es getan, aber wenn nicht, lass es mich wissen. Ich habe den Code noch nie mit einem geometrischen Netzwerk getestet. Ich habe sie hauptsächlich für einfache Feature-Classes und File-Geodatabases optimiert.

Dies funktioniert großartig, aber ich habe ein Problem mit zu vielen Änderungen an einer versionierten Datenbank und es schlägt nach einer Weile fehl. Ich habe versucht, Autocommit hinzuzufügen, aber es funktioniert nicht in der Schleife. Ich bin mir auch nicht sicher, ob ich das richtig geschrieben habe.

Arceditor importieren
import arcpy
ab zeit strftime importieren

print "Skript starten: " + strftime("%Y-%m-%d %H:%M:%S")

sourceFieldsList = ["BI_SRV_MAP_LOC","SRVADDR1","SRVADDR2","SRVST","SRVCITY","SRVZIP","BUSINESS","HOME","BICUST","MOBILE","BI_FORMAT_NAME","BI_FORMAT_ADDL_NAME" ,"BI_KEY_CUST_CD","BI_ROUTE_CD","BI_OUT_PRI_CD","BI_MED_NEC_CD","BI_SRV_LOC","BI_AR_STAT","BI_ACCT", "BI_MTR_PHS", "BI_TRF_NBR", "BI_MTR_NBR"]

edit = arcpy.da.Editor(arcpy.env.workspace)
edit.startEditing(Wahr, Wahr)
edit.startOperation()

# Verwenden Sie Listenverständnis, um ein Wörterbuch aus einem da SearchCursor zu erstellen
valueDict =

updateFieldsList = ["SERVICE_MAP_LOCATION","SERVICE_ADDRESS","SERVICE_ADDRESS2","STATE","CITY","Zip","BusinessPhone","PrimaryPhone","CustID","MobilePhone","NAME","MISC_CHAR_1" ,"KeyAccount","MISC_CHAR_2","OutagePriority","MEDALERT","Service_Number","SERVICE_STATUS","Account_Number", "CISPhase","TRANSFORMER_ID","MeterNumber"]

mit arcpy.da.UpdateCursor(updateFC, updateFieldsList) als updateRows:
für updateRow in updateRows:
# Speichern Sie den Join-Wert der Zeile, die aktualisiert wird, in einer keyValue-Variablen
keyValue = updateRow[0]
# Überprüfen Sie, ob sich der keyValue im Dictionary befindet
Schlüsselwert drucken
if keyValue in valueDict:
# Übertragen Sie die unter keyValue gespeicherten Werte aus dem Dictionary in die aktualisierten Felder.
für n im Bereich (1,len(sourceFieldsList)):
updateRow = valueDict[keyValue][n-1]
updateRows.updateRow(updateRow)

del valueDict
arcpy.DeleteManagement("test")
edit.stopOperation()
"Bearbeitungen abgeschlossen" drucken

# Stoppen Sie die Bearbeitungssitzung und speichern Sie die Änderungen
edit.stopEditing(True)
print "Fertiges Skript: " + strftime("%Y-%m-%d %H:%M:%S")
print "Fertiges Skript: " + strftime("%Y-%m-%d %H:%M:%S")

Jede Anleitung wäre sehr dankbar, danke!

von RichardFairhurs t

Sie haben Ihren Code so geschrieben, dass er in jeden Datensatz schreibt, auch wenn sich tatsächlich nichts geändert hat. Um nur in Datensätze zu schreiben, bei denen sich der Wert geändert hat, müssen Sie eine if-Klausel hinzufügen, um die Datensätze zu vergleichen und nur in die Datensätze zu schreiben, die sich unterscheiden. Die hier angeführten einfachen Beispiele sollen nur das Kernkonzept verdeutlichen, nicht die ganze Vielfalt der Effekte, die durch Anpassungen des Programmablaufs und der Logik erreicht werden können.

Hier ist ein Teil eines Programms, das ich für meinen eigenen Bedarf geschrieben habe, das Datensätze in der Aktualisierungstabelle nur aktualisiert, wenn sie nicht mit der Quelltabelle übereinstimmen. Das in diesem Beispiel erstellte Wörterbuch schneidet Leerzeichen aus der Quelltabelle ab, da die Aktualisierungstabelle kein Leerzeichen hat, die Quelltabelle jedoch Leerzeichen hat:

Vielen Dank das ist genau das was ich suche. Ich werde es versuchen.

kannst du das apnDict erklären.

von RichardFairhurs t

Ich habe diese Zeile entfernt. Dieser Code ist ein überarbeiteter Auszug aus einem viel längeren Skript, das mehrere andere Unterroutinen hatte. Ich habe diese Zeile übersehen und hätte sie vor dem Posten des Codes entfernen sollen, da sie für den von Ihnen benötigten Code nicht relevant ist.

Danke, das Skript wird funktionieren, aber es läuft immer noch durch jeden Datensatz und nimmt eine Änderung vor. Ich fühle mich so nah. Ich sehe, dass der Schlüsselwert (aktualisierte Funktion) im valueDict (Quellfunktion) verglichen wird. Ich habe das Gefühl, in diesem Abschnitt stecke ich fest

if list(valueDict[keyValue]) <> updateRow[1:22]:
# Es wurde eine Änderung der Postanschrift, des Eigentümernamens oder beidem vorgenommen
changeCnt += 1

Arceditor importieren
import arcpy
ab zeit strftime importieren

serviceFC = arcpy.MakeFeatureLayer_management("E:arcgisserverResourcesConnectionsGIS_SCRIPTINGVS.sde.DBO.ELECTRIC.DBO.ServicePoint", "test","LINE_SECTION = 'PRIUG6819'"," "" OBJECTID OBJECTID VISIBLE NONEAncillaryRole AncillaryRole VISIBLE NONEEnabled VISIBLE NONESubtypeCD SubtypeCD VISIBLE NONEAccount_Number account_number VISIBLE NONESERVICE_MAP_LOCATION SERVICE_MAP_LOCATION VISIBLE NONEMeterNumber MeterNumber VISIBLE NONETRANSFORMER_ID TRANSFORMER_ID VISIBLE NONEMAP_NO MAP_NO VISIBLE NONELINE_SECTION LINE_SECTION VISIBLE NONESUBSTATION SUBSTATION VISIBLE NONEFEEDER_NUMBER FEEDER_NUMBER VISIBLE NONESERVICE_STATUS SERVICE_STATUS VISIBLE NONEService_Number service_number VISIBLE NONECC_Number CC_Number VISIBLE NONENAME BEZEICHNUNG Aktiviert VISIBLE NONESERVICE_ADDRESS SERVICE_ADDRESS VISIBLE NONESERVICE_ADDRESS2 SERVICE_ADDRESS2 VISIBLE NONECITY CITY VISIBLE NONESTATE STATE VISIBLE NONEBESCHREIBUNG VISIBLE NONEDateModified DateModified VISIBLE NONEInstallationDate Installa tionDate VISIBLE NONEComments Kommentare VISIBLE NONEServiceCurrentRating ServiceCurrentRating VISIBLE NONELoadManagement Lastführung VISIBLE NONEMISC_CHAR_1 MISC_CHAR_1 VISIBLE NONEMISC_CHAR_2 MISC_CHAR_2 VISIBLE NONEOutagePriority OutagePriority VISIBLE NONEZip VISIBLE NONEDetail Details Zip VISIBLE VISIBLE NONEKeyAccount KeyAccount VISIBLE NONELongitude Longitude VISIBLE NONELatitude Latitude VISIBLE NONETownship Township VISIBLE NONESection_ Section_ VISIBLE NONET_S T_S VISIBLE NONEcreated_user created_user VISIBLE NONEcreated_date created_date NONElast_edited_user last_edited_user VISIBLE NONElast_edited_date LAST_EDITED_DATE VISIBLE NONEGlobalID GlobalID VISIBLE NONECustomerID CustomerID VISIBLE NONEStationGuid StationGuid VISIBLE NONEphaseCode phaseCode VISIBLE NONEADD3 ADD3 VISIBLE NONEACCTBASE ACCTBASE VISIBLE NONEPrimaryPhone PrimaryPhone VISIBLE NONEBusinessPhone BusinessPhone- VISIBLE NONEMobilePhone Mobilephone VISIBLE NONECustID CustID VISIBLE NONECoopNumb CoopNumb VISIBLE NONECISPhase CISPhase SICHTBAR NONEMEDALERT MEDALERT SICHTBAR NONEFORM FORM SICHTBAR KEINE")

print "Skript starten: " + strftime("%Y-%m-%d %H:%M:%S")

sourceFieldsList = ["BI_SRV_MAP_LOC","SRVADDR1","SRVADDR2","SRVST","SRVCITY","SRVZIP","BUSINESS","HOME","BICUST","MOBILE","BI_FORMAT_NAME","BI_FORMAT_ADDL_NAME" ,"BI_KEY_CUST_CD","BI_ROUTE_CD","BI_OUT_PRI_CD","BI_MED_NEC_CD","BI_SRV_LOC","BI_AR_STAT","BI_ACCT", "BI_MTR_PHS", "BI_TRF_NBR", "BI_MTR_NBR"]

updateFieldsList = ["SERVICE_MAP_LOCATION","SERVICE_ADDRESS","SERVICE_ADDRESS2","STATE","CITY","Zip","BusinessPhone","PrimaryPhone","CustID","MobilePhone","NAME","MISC_CHAR_1" ,"KeyAccount","MISC_CHAR_2","OutagePriority","MEDALERT","Service_Number","SERVICE_STATUS","Account_Number", "CISPhase","TRANSFORMER_ID","MeterNumber"]


Starting Multiple Postmasters with Different Clusters You can configure Advanced Server to use multiple postmasters, each with its own database cluster. The steps required are version specific to the Linux host. On RHEL or CentOS 7.x | 8.x The edb-as13-server-core RPM for version 7.x | 8.x contains a unit file that starts the Advanced Server instance. The file allows you to start multiple services, with unique data directories and that monitor different ports. You must have root access to invoke or modify the script. The example that follows creates an Advanced Server installation with two instances the secondary instance is named secondary : Make a copy of the default file with the new name. As noted at the top of the file, all modifications must reside under /etc . You must pick a name that is not already used in /etc/systemd/system . Edit the file, changing PGDATA to point to the new data directory that you will create the cluster against. Create the target PGDATA with user enterprisedb . Run initdb , specifying the setup script: Edit the postgresql.conf file for the new instance, specifying the port, the IP address, TCP/IP settings, etc. Make sure that new cluster runs after a reboot: Start the second cluster with the following command: All you need to write a program is a text editor and a compiler (or an interpreter if you're writing in a non-compiled language). Code is usually just plain text. Really, you could write any program imaginable using Windows Notepad and a command-line C compiler. A lot of programmers don't even use IDEs. I personally used Gedit (a basic Linux text editor with syntax highlighting) for the longest time before I finally switched to Eclipse. In fact, I still use Gedit when I want to write a simple program. Sometimes I'll even just use nano if I want to whip up a quick script, because I'm too impatient to wait for an IDE to load. @Matt, it's simpler than it looks. Let's take a look on the second video: They are writing a python program. Python is an interpred language - meaning that a program written in python does not need to be compiled, it just need to be interpreted to run. If you have a simple editor, as notepad (windows) or nano (linux) you can write a simple text file, name it, let's say, "program.py" , and run the interpreted from command-line, as below: If you want to program in Lua for example, you can write a simple text file named "program.lua" using either notepad or nano and write a single line on your text file as below: Then go to the command prompt (cmd on windows, terminal in linux) and run the command: A raw program is a text file. All you really need to write a program is a text editor If your language choice is an interpreted one, you will need the interpreter to run your program (Lua, Basic, Python, etc. ). This interpreter must be installed on your computer If your language choice is a compiled one, you will need a toolchain installed (mainly a compiler and a linker) to translate your source code to a binary machine-understandable-and-runnable code. Each language (C, Java, C++, C#, VB.Net, etc. ) has it's own toolchain. Jesus, I feel old now, and I never even had to mess with punch cards or batch processing. Hell, I only had to use a hardcopy terminal once or twice over the course of my college career. Here's how we did things back in the late Cretaceous (circa 1986). I was working on VAX/VMS through a VT220 amber-on-black character-based terminal that could display in either 80x24 or 132x24. First, you fired up the text editor: EDT was the VMS equivalent of vi, falling somewhere in capability between DOS edlin and Notepad. You typed in your program text saved it to the file, and then exited the editor. Then you ran your code through the compiler: This translated the source code in HELLO.C and generated the object file HELLO.OBJ. The object file contained the machine code for the program, but it wasn't in an executable form yet. For one thing, the actual binary code for the printf call isn't present there's only a placeholder for it. You still had to run the object file through a linker, which incorporated the binary code from the standard library (and any other libraries you need) and formatted the file so that it could be recognized as an executable: The result of this step is the file HELLO.EXE, which is the executable version of your program. The procedure's pretty much the same on any modern system it's just that the specific toolchains are different. For example, the sequence of commands on a typical Linux system would be Since I grew up in this environment, I never understood how someone could need an IDE just to write their code. However, early this year I started working in Java, and while Eclipse has its many, many faults, I can understand how someone can come to rely heavily on an IDE to get their work done. Since Java's such a huge language compared to C, and since I'm still trying to get the finer points of the syntax down, it helps to have a smart development environment that knows what packages particular types are in and helps me organize the imports. Editor? I don't need no stinking editor or IDE to schreiben code: However, it's nice to have something to edit the file later. IDE (integrated development environments) have been around a lot longer than many people are suggesting in their answers. The only IDE I ever really liked was the one that came with Turbo C, which ran on DOS. It was like oxygen to the people who had been forced to muck around with edlin. I've tried many different IDE 'suites' on recommendations from friends who could not stop raving about how much time they save and how convenient they make everything. Every time I sit down to try and use one, I find that I fight it more than use it. For the most part, I just use the simplest of text editors. My favorite happens to be KATE, which comes with KDE. These are the features that I like: Great syntax highlighting Code folding Simple regex based search / replace Inline shell window Inline compiler window / debugger window Snippet gallery Symbol viewer Extremely lightweight memory footprint (some of my projects have several hundred source files) Easy tabs / split windows Simple sessions instead of complex 'projects' (Semi) simple plug-in architecture With just those basic features, I feel like I'm almost spoiled. I'm actually less productive when working with feature rich IDEs, and thankful that I never developed a dependency on one. Just as it's possible to make coffee without simultaneously frothing milk, drive to work without also talking on the phone and doing your taxes, or gaze at the stars without listening to "flight of the bumblebee" on a surround-sound system, it is possible to compile code without also running an editor, debugger, code analysis system and snake game. But. who really wants to gaze at the stars in silence?! An IDE is not a compiler, a debugger or anything similar, it is actually a front-end that allows you to access all these, which are typically separate programs. Behind the scenes of Visual Studio there's a compiler which you can access as a separate program, compiling your programs from the Command Prompt, and there's probably a debugger which is also separately accessible and so on -- I'm not too familiar with its infrastructure because I don't use it. Depending on who you ask, an IDE is either very useful, or it tends to get in your way. It also depends on what you are writing, on its size, your coding style and so on. I, for one, don't really feel the need to use an IDE too much, but I reckon that some tasks are better handled by it (or, depending on how you look at it, that I'm too lazy to write scripts/macros for those myself). It certainly is. In the first video, it is about C programming. To write C programs, you need the following: some kind of source files where the code is written to a toolchain to transform this source file into a binary, which is the only thing that a CPU can understand in the end. Strictly speaking, you don't need file, but I don't know any environment which does not use file for C/C++. As such, you need an editor to edit the source code. Although something as simple as notepad works, you really want something more elaborate to do coding (code highlighting, opening multiple file at the same time, etc. ). For the second point, you need a compiler (source code -> object code) and a linker (object code merged together + minimal support to start the program). Even with an IDE, most tasks done behind the scene may be done from the command line: for example, in visual studio, the IDE still uses files, and call compilers at the command line for you, but it could work some other way (and maybe does for more integration). So why not using an IDE ? Some people are quite anal about their code editor, because they really know it. For example, I am quite productive with the vi code editor. IDE are also limited if you need to interact with things that the IDE has not been designed for. There is a tradeoff here that depends on programmer ability, project, programming languages/tools, etc. Some languages don't even have a decent IDE, some other languages are almost unusable without one. Although I don't use IDE myself, one area where I think they are very useful is debugging integration for C and C++. You can certainly write programs without a graphical IDE. For compiled languages (e.g. C or C++) the process would go something like this: Write the program in your preferred text editor. From the command line, invoke the compiler and/or linker that will convert your program to executable machine code and pull in the required external libraries. (I'm a little hazy on the order of linking and compilation here, but I'm sure someone will correct me in no time. :)) For interpreted languages like PHP or Python, you write code in your preferred text editor (or an interactive shell like the one Python comes with) and the code is executed by an interpreted program. For example, to invoke a Python script, you'd run something like python.exe myScript.py . Python is not a purely interpreted language, since it does get compiled first, but that compiled form is run by the Python interpreter, so it still fits the definition. Other languages such as PHP are entirely interpreted. Yes, you can write code without a compiler and without an IDE. All it is is writing. Text. I think you are refering to the Integrated Development Environment's (IDE). They provide code hints and syntax highlighting among other things. A compiler just takes the files and compiles them into machine code or byte code. A compiler is usually used by an IDE by sending it a command to compile your files. It is possible to write without a compiler. These languages use an 'interpreter' and process the script at run time. All an IDE does is provide several tools in a single convenient place and then automate some of the processes. Those tools are generally. To write your source you can use any text editor that produces plain text, eg. NotePad, Word or a purpose built code text editor. Once you have your source in a text file you can then launch your compiler via the command line passing in your test file, eg cc my_program.c This will produce an object file that you can execute. To debug your program you launch your debugger via the commandline passing in your program, eg. gdb my_program You can then set breakpoints, step through your program, inspect stuff etc. With an IDE all of this happens with the press of a button behind the scenes and the IDE puts a fancy UI on top of it all. PS. Real programmers use the commandline I write my everyday code in a vim editor (basic text editor) and i can asure you that it goes smoothly (most of my code is PHP). Specially cause my dev env is a Dev base Linux distribution and i take quite advantage of shell tools. I have programmed like this for a year now and this has helped me a lot when dealing with remote application deployment and production modifications where you generally got access to a *Nix console via ssh. digital stored-program computers have been in use since the 1950s, while graphical user interfaces really only started to appear in the late 1960s (and for end users in the 1980s). People had to use - and program - computers irgendwie before then. While it contains some inaccuracies (not every platform's user interface is a layer atop a command-line system) you should probably read Neal Stephenson's short piece In the Beginning Was the Command Line. It'll really get you thinking about things on your computer work under the hood, and how it's "possible" to program without an IDE, get real work done with a command line, and so on. You really only need a text editor (hell, notepad will work) and a compiler/interpreter (the more important thing). You said something about doing it via command line? Shit sounds insane, but it is very well possible. I mean just using Windows built in command prompt you 'could' write to a file via echo "some codez" > target_file.sauce but you would have to A) Be really good at what you are doing B) Be writing a simple program You really need to think that an IDE is just an Editor + Compiler + (some sort of) Makefile + Debugger (sometimes) + Graphical UI Builder (sometimes) so of course you can choose not to use an IDE at all, and you replace them with an Editor of your choice (vim, emacs, gedit, notepad++, [insert_others_here]), an compiler (jdk for java, gcc, platform SDK or [insert_Cpp_toolchain_here] for C++, python interpreter, or whatever toolchain your language has), some sort of makefile (like autoh. tools, cmake, ant, maven, etc.), some sort of debugger (that usually is included with the compiler), and if you want an graphical ui builder (glade comes to mind), and there you have it your own IDE without an IDE. Which approach is best depends on you (and I think that IDE's today are slighty overrated) He's using pico, a nano clone. I use it occasionally. Usually I use emacs, which is slightly less helpful, but more featured. I don't use IDEs as a rule of thumb. Occasionally I've dropped into them for debugging or because the command-line toolchain was a pain to find (looking at you Xilinx). I also use them to sketch out C# in the rare occasion when I do a GUI. But IDEs are not very good editors in my experience: inflexible, weird character chords, not very easy to use, not many languages supported, take too much memory. You should look into the history of computing. It's fairly accessibly written and will give you a wonderful perspective on our work. You don't even need a text editor. :) :) If you're in windows try this: And then just compile it with your favorite command line compiler. :) Obviously you have to write it right the first time. Remember that real programmers use butterflies: http://xkcd.com/378/ Here is what is fun: Harvard Extension School is teaching programming with no IDE . unless telnet + pico is what you mean by an IDE. The easiest way is to use a basic text editor to write your Java programs, then transfer files to the FAS system using an FTP program, connect through telnet, and compile and run them on FAS (fas.harvard.edu - Java is already installed there). They MUST be on FAS in order to submit them for your homework. To use this method, you may want to learn enough about one of the Unix text editors to be able to make any needed quick corrections to your files, or plan to update the file locally and re-transfer it. More information about transferring files is on the FAQ page. DO NOT use a word processor, e.g. Word or WordPerfect! They add lots of formatting characters which you don't see, but which will prevent your programs from ever compiling. On Windows, you may use Notepad or Wordpad and make sure you save the files as "Text Document" with the .java extension. If the system tries to add a ".txt" suffix, put quotes around your file name and extension in the Save box to prevent this. You may also try any of the editors in the Useful Downloads section (one we highly recommend for PC's is Programmers File Editor). On the Mac, use BBEdit Lite (also linked on the Resources page), or one of the built-in Unix editors which are available in a Terminal window. You can obtain a secure telnet program or use one that you have, telnet into the FAS system, and write and edit your programs on the system. There are three Unix editors which you may try: pico, emacs, and vi. Once you've written your program and saved it, then, as above, you can compile and run it on FAS If you ask me, they are torturing the kids, but that is ok. There more Spartans, let alone Mothakes, Perioikoi and Helot than Harvard can admit in any given year. Yes, it is possible. I suppose something like Notepad is a no-IDE, but emacs and Textpad (I used both for C, Java coursework) are considered an IDE. Now . after coding in C# in VS2010, with WinForms and all, I would not want to go back to text editors at work - I would be yelled at for not getting crap done. For academic projects, however, when examples are small, it makes sense to use no IDE. Remember: in intro programming classes, many real-world issues are not present. You will probably not have to add .xml files as resources to a dll You would probably not need to debug it much, you would not need to use code contracts, or go from an unmanaged C++ to C++/ClI, then to C# and back. Academic assignments need not be messy because they can be done from scratch, and are measured in man-days/weeks. All files can be part of just one project (even for a compilers or an OS class). An IDE like Visual Studio can actually hinder you when a simple makefile will do. Think of the myriads of options that one must configure. Same with Eclipse - it is an over-engineered editor that is infinitely customizable. A simple makefile and two simple C files might be all that you need. In fact, you tend to have more control that way, when you specify every flag yourself. I have coded like that in a university lab once. It is funny, but one of the "embedded" (meaning it had to be so tiny that it would fit on an airplane) computers there had no GUI, and no mouse :) I was still able to log in, edit, compile and debug a C program, as well as add drivers and recompile the kernel. Migrating to 10.3 and effect on Python

Will I need to reinstall all of my modules? I'm moving form 2.5 to what looks to be 2.7, will my existing code run properly?

Just looking for quick feedback on what might be affected or things that maybe I've overlooked.

We just moved to 10.3.1 from 10.1 and installed background processing. Now we can't connect to personal geodatabases via python unless we run the script in ArcMap with background processing turned off. Not sure what impacts you might have regarding the change in terms of libraries/modules.

Why do you guys still use personal GDBs? Why not shift them all to File GDBs?

Also, I've only tested this on 10.2.2 (going from 10.1 SP1 modules), and nothing really changed. I had to change my .bat files to reference the new python executable but that's about it.

If you disable background processing, you will invoke the 32-bit Python interpreter, which can work with Personal GDB. There are some other instances where functions won't execute using the 64 bit interpreter and using the 32-bit int. is necessary. You can turn off background processing in GeoProcessing Options.

Yes, you will need to reinstall all of your third party Python modules.

If you have PIP installed, you can run the following (That will save a list of what is installed to a file for later reference):

c:python27ArcGIS10.1Scriptspip freeze > c:python27 equirements.txt

If you don't have it installed, this link will help. I believe you'll have to reinstall pip after upgrading anyways.

Running this command will get your packages back after upgrading.

c:python27arcgis10.3scriptspip install -r /path/to/requirements.txt

Regarding existing scripts, the structure of Arcpy and native Python modules haven't changed as far as I know so you don't need to rewrite them.


Publishing Python scripts as geoprocessing services: best practices

Why Python instead of models?

If you have been publishing your ModelBuilder models as geoprocessing (further GP) services you have probably realized that it can be quite cumbersome. If you haven’t moved to Python, I think you really should. Authoring Python scripts has serious advantages over authoring models in the context of publishing GP services. This is because during the publishing process, ArcGIS Server will turn data and anything that may be needed to change into variables and this might mess up the model if you haven’t followed the guidelines on authoring GP services. The rule of thumb for me was that if there are more than 10 objects in the model, it is a good time to switch to Python. Another thing is that you can easily make modifications in the Python code without republishing in contrast, you need to republish the model each time you want to release an updated version of the GP service. Finally, since you don’t need to restart the GP service when updating the Python file (in contrast to republishing the model which requires restarting service), there is no down-time for the service and users won’t notice anything.

What happens after publishing?

Let’s take a look at what is going on under the hood. You have run your script tool in ArcMap and got the result published as a service. Now you can find your service and all the accompanying data inside the arcgisserver folder somewhere on your disk drive. The path would be: C:arcgisserverdirectoriesarcgissystemarcgisinput\%GPServiceName%.GPServer

You will find a bunch of files within the folder. Let’s inspect some of them:

  • serviceconfiguration.json – provides an overview over all the properties of the service including its execution type, enabled capabilities, output directory and many others. Here you will see all the settings you usually see in the Service Editor window.
  • manifest.xml und manifest.json – provides an overview of the system settings that were used while publishing the service. Those are not the files you usually would want to inspect.

Inside the folder esriinfo/metadata there is a file named metadata.xml which is really helpful because there you can see what date a service was published. Two tags you should look at are:

Since this information is not exposed from the GUI in ArcGIS Desktop or ArcGIS Server Manager, this is the only way to find out what time the service was created. This information may be very handy when you are unsure about the release versions.

Inside the extracted/v101 folder, you will find the result file and the toolbox you have worked with when publishing the GP service. Here you will also find a folder named after the folder where you source Python file was stored and containing the source Python file.

Best practices to organize the Python code and files?

Let’s look inside the Python file. You might have noticed that when publishing some of the variables you’ve declared were renamed to g_ESRI_variable_%id%. The rule of a thumb is that you shouldn’t really use strings you can turn paths to datasets and names into variables. Of course you don’t have to do this since Esri will update those inline variables, but it is so much harder to refactor with those variable names, so you better organize your code correctly from the beginning.

If running the script tool in ArcGIS, scratch geodatabase is located at C:Users\%user%AppDataLocalTempscratch.gdb. However, after publishing the tool, the service will get a new scratch geodatabase. If you need to inspect the intermediate data created, go to the scratch geodatabase (the path can be retrieved with the arcpy.env.scratchGDB) which will be a new file geodatabase in each run of GP service with the following notation: c:arcgisserverdirectoriesarcgisjobs\%service%_gpserver\%jobid%scratchscratch.gdb.

Keep in mind that GP service will always use its local server jobs folder for writing intermediate data and this behavior cannot be changed. But having the service writing to the scratch workspace is actually a lot safer than writing to a designated location on disk. This is because there is no chance of multiple GP service instances trying to write to the same location at the same time which can result in dead-locking and concurrency issues. Remember that each submitted GP job will be assigned to a new unique scratch folder and geodatabase in the arcgisjobs folder.

Make sure you don’t use arcpy.env.workspace in your code always declare a path variable and assign it to be the folder or a geodatabase connection. For the datasets path, use the os.path.join() instead of concatenating strings. For performance reasons, use in Erinnerung workspace for intermediate data with the following notation:

You can take advantage of using in Erinnerung workspace, but for troubleshooting purposes it might be better to write something to disk to inspect later on. In this case, it might be handy to create a variable called something like gpTempPlace which you can change to be either “in Erinnerung” or a local file geodatabase depending whether you run clean code in production or troubleshoot the service in the staging environment.

Make sure you don’t use the same name for variable and feature class/field name. This sometimes leads to unexpected results when running the service. It might be helpful to add “_fc” in the end for feature class variable and “_field” for the field variable. This way, you will also be able to distinguish them much easier. The same is applicable for the feature class and feature layer (created with Make Feature Layer GP tool) names.

Remember that you can adjust the Logging level of ArcGIS Server (in Manger) or GP service only (done in Service Editor window) for troubleshooting purposes. It is often useful to set the Message Level setting to Info level before publishing the GP service into production because this will give you the detailed information what exactly went wrong when running the GP service. You can access this information either from the Results window in ArcMap or from the ArcGIS Server logs in Manager.

How do I update the published service?

A special word should go for those users who needs to publish the GP services often while making changes in the code. It is important to understand that after publishing the GP service, the copied Python code file and the toolbox don’t maintain any connection to the source Python file and the source toolbox you have authored. This implies that after making edits to the script tool, you need to push those changes to the published service on server.

There are two types of changes you can make on your source project: the tool parameters in the script tool properties and the Python code. Keep in mind that you cannot edit the published toolbox so if you added a new parameter or modified existing parameter data type, you would need to republish the service. However, if have only modified the Python script source code, there is no need to republish the whole service as you only need to replace the contents within the Python file.

Even though you can automate service publishing workflow with Python, it still takes time to move the toolbox and the Python code files. Therefore, you can save a lot of time by finding a way to replace the Python code in the published Python code file. In order to update the Python code file, you have really just two options – you either copy and replace the published file with the updated source file or copy/paste the source code. This approach may work if you have a tiny Python script and all the paths to the data on your machine and on the server are the same. This can be a plausible solution when you have Desktop and Server on the same machine. If you have a configuration file where the Python source code file gets all the paths and dataset names from, you could also safely replace the published Python file. However, this is still an extra thing to do.

The best practice I came to while working for two years on the GP services is to split the code files and the tool itself. Let me explain.

How do I separate the toolbox logic and Python code?

Create a Python file (a caller script) which will contain all the importieren statements for the Python modules and your files. By appending the path to your Python files, you will be able import the Python files you are working on this is very useful when your GP service consists not just of one file yet of multiple modules.

This file should also include all the parameters which are exposed in the script tool.

Then you define a main function which will be executed when running the GP service. You call the functions defined within the files you imported.

It is also handy to add some parameter handling logic when you run the script tool in ArcMap, you supply some values for the tool which will become default values visible when users will execute GP service from ArcMap or from any other custom interface. In order to avoid that, you can just leave those parameters empty and then return empty output for GP script tool publishing only purposes.

Create a script tool from this caller Python file defining the parameters and their data types. After the tool will be published as a GP service, you can work with the Python files which will contain only the code that actually does the job.

After performing and saving the changes in the code, feel free to run the GP service directly – the caller Python file (published as a GP service) will import the codefile1 at the folder you specified and run the code. There is no need to restart the GP service or re-import your update module.