Mehr

Syntaxfehler vom Python-Parser des ArcGIS-Feldrechners, wenn dann?

Syntaxfehler vom Python-Parser des ArcGIS-Feldrechners, wenn dann?


Verwenden von ArcMap - Ich möchte ein Feld basierend auf dem Wert eines anderen Felds berechnen. Ich möchte das Feld 'Date_Class' basierend auf dem Wert in einem anderen Feld 'MIN_YEAR_B' aktualisieren. Ich habe versucht, dies mit Python zu tun, mit:

Codeblock:

def ReClass (Date_Class): if (MIN_YEAR_B >= 1600 und MIN_YEAR_B <= 1650): Date_Class = 1 elif (MIN_YEAR_B > 1650 und MIN_YEAR_B <= 1700): Date_Class = 2 elif (MIN_YEAR_B > 1700 und MIN_YEAR_B <= 1749): Datum = 3 elif (MIN_YEAR_B < 1600): Date_Class = 0

Und das Argument ist:

Date_Class=ReClass(!Date_Class!)

Ich erhalte einen Syntaxfehler - nicht sicher warum


Es gibt ein paar Probleme: Auf eines wurde von recurvata hingewiesen, aber es gibt auch ein Einrückungsproblem (dies könnte nur an der Formatierung liegen, nicht an Ihrem Code, aber es muss überprüft werden) und Ihr Code gibt nichts zurück.

Das Argument deiner FunktionReClass()sollte seinMIN_YEAR_Bda Sie dies verwenden.

def ReClass(MIN_YEAR_B): x = -1 if (MIN_YEAR_B < 1600): x = 0 elif (MIN_YEAR_B <= 1650): x = 1 elif (MIN_YEAR_B <= 1700): x = 2 elif (MIN_YEAR_B <= 1749): x = 3 sonst: x = 4 Rückgabe x

Date_Class=ReClass(!MIN_YEAR_B!)


Sie müssen auch MIN_YEAR_B in der Funktion übergeben.

Date_Class=ReClass(!Date_Class!, !MIN_YEAR_B!)


Ytdjtkui

Haben US-Konzerne bei den deutschen Demonstrationen gegen Artikel 13 Demonstranten bezahlt?

I2C-Signal und Leistung über große Reichweite (10 Meter Kabel)

Was (sonst) geschah am 1. Juli 1858 in London?

Wie gehe ich mit Leerlauf im Testteam um oder vermeide ihn?

Gibt es eine einfache Möglichkeit, in Tikz so etwas wie das im Bild zu programmieren?

Gibt es eine gute Möglichkeit, Anmeldeinformationen außerhalb eines Passwort-Managers zu speichern?

Kann ein heidnischer Theist gerettet werden?

Wie kann man verhindern, dass YouTube bereits angesehene Videos anzeigt?

Lightning-Webkomponente - muss ich Änderungen für jedes einzelne Eingabefeld in einem Formular verfolgen?

Identifizieren Sie ein Bühnenstück über ein VR-Erlebnis, in dem die Teilnehmer ermutigt werden, schreckliche Aktivitäten zu simulieren

Was bedeutet der Abschnitt "3 Uhr morgens" in Manpages?

Metaprogrammierung: Deklarieren Sie eine neue Struktur im Handumdrehen

Könnte Sonnenenergie im 19. Jahrhundert genutzt und Kohle ersetzt werden?

Meinungsfreiheit und wo sie gilt

Unterrichten von unbestimmten Integralen, die eine spezielle Schreibweise erfordern

Ein bekanntes Ereignis für einen Geschichtsjunkie

Java - Was bedeuten Konstruktortypargumente, wenn sie *vor* dem Typ platziert werden?

Wie nennt man die Infoboxen mit Text und manchmal auch Bildern am Seitenrand, die wir in Lehrbüchern finden?

Der effizienteste Algorithmus, um alle möglichen Ganzzahlpaare zu finden, die sich zu einer gegebenen Ganzzahl summieren

Verwenden der Wenn/Dann-Anweisung in ArcGIS Field Calculator?

If/Then Field CalculatorMethode zum Eingeben von Zeitreihendaten in ArcGISVBScript - If/Then-Anweisung - Field CalculatorVerwenden von .len() in IF THEN-Anweisung in ArcMap-FeldrechnerFinden Sie das Minimum in einer Spalte der Attributtabelle mit Python auf Field CalculatorMehrere Zeilen in einem einzelnen gestapelten Textfeld Verwenden von ArcGIS Desktop?Erstellen einer If Then-Anweisung in Field Calculator zwischen 2 Werten?Ausblenden und Neuanordnen von Attributtabellenspalten in QGIS?If/Then-Anweisung mit LIKE unter Verwendung des Field CalculatorLabel-Ausdrucks, der eine Beschriftung mit mehreren Sätzen analysiert, sodass alle 5 Wörter angezeigt werden auf einer neuen Zeile

Ich versuche, eine Spalte hinzuzufügen, die die Vegetationsproduktion (numerisch) in Bezug auf die Bodenreihen anzeigt. Ich habe jede Bodenserie bereits in der Attributtabelle, aber es fällt mir schwer, die Wenn/Dann-Anweisung zu schreiben, um etwas in der Art zu sagen "Wenn Bodenserie "vc" ist, dann sollte die Produktion 2500 betragen". Kann mir jemand helfen?

Verwenden Sie den Hilfebereich und versuchen Sie es ernsthaft und fragen Sie dann hier, wenn Sie Hilfe benötigen. Es ist besser, die Python-Syntax zu lernen, da VB keine Standardsprache mehr ist.

Das habe ich versucht und hat nicht geholfen. Nicht sicher, wie man diesem Kommentarfeld ein weiteres Foto hinzufügt

Wenn [SoilSeries] = Ga Then [UF_Prod]="2055"

Sie haben die Hilfe nicht gelesen. Schau dir die Beispiele an. Verwenden Sie die Python-Syntax und aktivieren Sie "Codeblock anzeigen".

Die erste verwandte Frage zeigt die richtige Implementierung von if/then im Feldrechner sowohl für VBscript als auch für Python

Ich versuche, eine Spalte hinzuzufügen, die die Vegetationsproduktion (numerisch) in Bezug auf die Bodenreihen anzeigt. Ich habe jede Bodenserie bereits in der Attributtabelle, aber es fällt mir schwer, die Wenn/Dann-Anweisung zu schreiben, um etwas in der Art zu sagen "Wenn Bodenserie "vc" ist, dann sollte die Produktion 2500 betragen". Kann mir jemand helfen?

Verwenden Sie den Hilfebereich und versuchen Sie es ernsthaft und fragen Sie dann hier, wenn Sie Hilfe benötigen. Es ist besser, die Python-Syntax zu lernen, da VB keine Standardsprache mehr ist.

Das habe ich versucht und hat nicht geholfen. Nicht sicher, wie man diesem Kommentarfeld ein weiteres Foto hinzufügt

Wenn [SoilSeries] = Ga Then [UF_Prod]="2055"

Sie haben die Hilfe nicht gelesen. Schau dir die Beispiele an. Verwenden Sie die Python-Syntax und aktivieren Sie "Codeblock anzeigen".

Die erste verwandte Frage zeigt die richtige Implementierung von if/then im Feldrechner sowohl für VBscript als auch für Python

Ich versuche, eine Spalte hinzuzufügen, die die Vegetationsproduktion (numerisch) in Bezug auf die Bodenreihen anzeigt. Ich habe jede Bodenserie bereits in der Attributtabelle, aber es fällt mir schwer, die Wenn/Dann-Anweisung zu schreiben, um etwas in der Art zu sagen "Wenn Bodenserie "vc" ist, dann sollte die Produktion 2500 betragen". Kann mir jemand helfen?

Ich versuche, eine Spalte hinzuzufügen, die die Vegetationsproduktion (numerisch) in Bezug auf die Bodenreihen anzeigt. Ich habe jede Bodenserie bereits in der Attributtabelle, aber es fällt mir schwer, die Wenn/Dann-Anweisung zu schreiben, um etwas in der Art zu sagen "Wenn Bodenserie "vc" ist, dann sollte die Produktion 2500 betragen". Kann mir jemand helfen?

Verwenden Sie den Hilfebereich und versuchen Sie es ernsthaft und fragen Sie dann hier, wenn Sie Hilfe benötigen. Es ist besser, die Python-Syntax zu lernen, da VB keine Standardsprache mehr ist.

Das habe ich versucht und hat nicht geholfen. Nicht sicher, wie man diesem Kommentarfeld ein weiteres Foto hinzufügt

Wenn [SoilSeries] = Ga Then [UF_Prod]="2055"

Sie haben die Hilfe nicht gelesen. Schau dir die Beispiele an. Verwenden Sie die Python-Syntax und aktivieren Sie "Codeblock anzeigen".

Die erste verwandte Frage zeigt die richtige Implementierung von if/then im Feldrechner sowohl für VBscript als auch für Python

Verwenden Sie den Hilfebereich und versuchen Sie es ernsthaft und fragen Sie dann hier, wenn Sie Hilfe benötigen. Es ist besser, die Python-Syntax zu lernen, da VB keine Standardsprache mehr ist.

Das habe ich versucht und hat nicht geholfen. Nicht sicher, wie man diesem Kommentarfeld ein weiteres Foto hinzufügt

Wenn [SoilSeries] = Ga Then [UF_Prod]="2055"

Sie haben die Hilfe nicht gelesen. Schau dir die Beispiele an. Verwenden Sie die Python-Syntax und aktivieren Sie "Codeblock anzeigen".

Die erste verwandte Frage zeigt die richtige Implementierung von if/then im Feldrechner sowohl für VBscript als auch für Python

Verwenden Sie den Hilfebereich und versuchen Sie es ernsthaft und fragen Sie dann hier, wenn Sie Hilfe benötigen. Es ist besser, die Python-Syntax zu lernen, da VB keine Standardsprache mehr ist.

Verwenden Sie den Hilfebereich und versuchen Sie es ernsthaft und fragen Sie dann hier, wenn Sie Hilfe benötigen. Es ist besser, die Python-Syntax zu lernen, da VB keine Standardsprache mehr ist.

Das habe ich versucht und hat nicht geholfen. Nicht sicher, wie man diesem Kommentarfeld ein weiteres Foto hinzufügt

Das habe ich versucht und hat nicht geholfen. Nicht sicher, wie man diesem Kommentarfeld ein weiteres Foto hinzufügt

Wenn [SoilSeries] = Ga Then [UF_Prod]="2055"

Wenn [SoilSeries] = Ga Then [UF_Prod]="2055"

Sie haben die Hilfe nicht gelesen. Schau dir die Beispiele an. Verwenden Sie die Python-Syntax und aktivieren Sie "Codeblock anzeigen".

Sie haben die Hilfe nicht gelesen. Schau dir die Beispiele an. Verwenden Sie die Python-Syntax und aktivieren Sie "Codeblock anzeigen".

Die erste verwandte Frage zeigt die richtige Implementierung von if/then im Feldrechner sowohl für VBscript als auch für Python

Die erste verwandte Frage zeigt die richtige Implementierung von if/then im Feldrechner sowohl für VBscript als auch für Python


Syntax

Die Eingabe-Features, für die die Netzwerkstandorte berechnet werden.

Bei Linien- und Polygon-Features werden nur Geodatabase-Feature-Classes unterstützt, da die Netzwerkstandortinformationen in einem Blob-Feld (angegeben im Feldparameter Standortbereiche) gespeichert werden.

Das zur Berechnung der Standorte verwendete Netzwerk-Dataset.

Wenn ein Sublayer eines Netzwerkanalyse-Layers als Eingabe-Features verwendet wird, muss der Parameter auf das Netzwerk-Dataset gesetzt werden, auf das der Netzwerkanalyse-Layer verweist.

Die Suchtoleranz zum Auffinden der Eingabe-Features im Netzwerk. Features, die außerhalb der Suchtoleranz liegen, werden nicht lokalisiert. Der Parameter enthält einen Wert und Einheiten für die Toleranz.

Der Parameter wird nicht verwendet, wenn Positionen für Linien- oder Polygon-Features berechnet werden. Verwenden Sie in solchen Fällen "#" als Parameterwert.

Gibt an, welche Quellen im Netzwerk-Dataset beim Suchen von Positionen durchsucht werden und welche Teile der Geometrie (auch als Fangtypen bezeichnet) verwendet werden.

  • SHAPE – Der Punkt wird auf dem nächsten Punkt eines Elements in dieser Netzwerkquelle platziert.
  • MITTE – Der Punkt befindet sich auf dem nächsten Mittelpunkt eines Elements in dieser Netzwerkquelle.
  • END – Der Punkt wird auf dem nächsten Endpunkt eines Elements in dieser Netzwerkquelle lokalisiert.
  • NONE – Der Punkt wird nicht auf Elementen in dieser Netzwerkquelle lokalisiert.

Um mehrere Snap-Typen für eine einzelne Netzwerkquelle anzugeben, verwenden Sie die Kombination der Snap-Typ-Schlüsselwörter, die durch einen Unterstrich getrennt sind. MIDDLE_END gibt beispielsweise an, dass die Standorte in der Mitte oder am Ende der Netzwerkquelle gefangen werden können.

Bei Geodatabase-Netzwerk-Datasets können die Fangtypen für jeden Untertyp der Netzwerkquelle ("Streets : Local Streets","SHAPE"]) angegeben werden.

Beim Berechnen von Positionen für Linien- oder Polygon-Features wird nur der Fangtyp Form verwendet, auch wenn andere Fangtypen angegeben sind.

Jede Netzwerkquelle, die nicht in dieser Liste enthalten ist, verwendet ihren Standard-Snap-Typ. Es ist am sichersten, alle Netzwerkquellen in Ihre Liste aufzunehmen und den Snap-Typ für jede explizit festzulegen.

  • MATCH_TO_CLOSEST —Vergleicht die neuen Netzwerkstandorte mit der nächsten Netzwerkquelle unter allen Quellen mit einem in den Suchkriterien angegebenen Snap-Typ. Dies ist die Standardeinstellung.
  • PRIORITY — Gleicht die neuen Netzwerkstandorte mit der ersten Netzwerkquelle mit einem in den Suchkriterien angegebenen Snap-Typ ab. Die Quellen werden in der Prioritätsreihenfolge durchsucht und die Suche wird beendet, wenn der Ort innerhalb der Suchtoleranz gefunden wird.

Der Parameter wird nicht verwendet, wenn Positionen für Linien- oder Polygon-Features berechnet werden. Verwenden Sie in solchen Fällen "#" als Parameterwert.

Name des zu erstellenden oder zu aktualisierenden Felds mit der Quell-ID des berechneten Netzwerkstandorts. Ein Feld namens SourceID wird standardmäßig erstellt oder aktualisiert.

Der Parameter wird nicht verwendet, wenn Positionen für Linien- oder Polygon-Features berechnet werden. Verwenden Sie in solchen Fällen "#" als Parameterwert.

Name des zu erstellenden oder zu aktualisierenden Felds mit der Quell-OID des berechneten Netzwerkstandorts. Ein Feld namens SourceOID wird standardmäßig erstellt oder aktualisiert.

Der Parameter wird nicht verwendet, wenn Positionen für Linien- oder Polygon-Features berechnet werden. Verwenden Sie in solchen Fällen "#" als Parameterwert.

Name des zu erstellenden oder zu aktualisierenden Felds mit dem Prozentwert des berechneten Netzwerkstandorts. Ein Feld namens PosAlong wird standardmäßig erstellt oder aktualisiert.

Der Parameter wird nicht verwendet, wenn Positionen für Linien- oder Polygon-Features berechnet werden. Verwenden Sie in solchen Fällen "#" als Parameterwert.

Name des zu erstellenden oder zu aktualisierenden Felds mit der Seite der Kante, auf der sich das Punkt-Feature an der berechneten Netzwerkposition befindet. Ein Feld namens SideOfEdge wird standardmäßig erstellt oder aktualisiert.

Der Parameter wird nicht verwendet, wenn Positionen für Linien- oder Polygon-Features berechnet werden. Verwenden Sie in solchen Fällen "#" als Parameterwert.

Name des zu erstellenden oder zu aktualisierenden Felds mit der x-Koordinate des berechneten Netzwerkstandorts. Ein Feld namens SnapX wird standardmäßig erstellt oder aktualisiert.

Der Parameter wird nicht verwendet, wenn Positionen für Linien- oder Polygon-Features berechnet werden. Verwenden Sie in solchen Fällen "#" als Parameterwert.

Name des zu erstellenden oder zu aktualisierenden Felds mit der y-Koordinate des berechneten Netzwerkstandorts. Ein Feld namens SnapY wird standardmäßig erstellt oder aktualisiert.

Der Parameter wird nicht verwendet, wenn Positionen für Linien- oder Polygon-Features berechnet werden. Verwenden Sie in solchen Fällen "#" als Parameterwert.

Name des zu erstellenden oder zu aktualisierenden Felds mit der Entfernung des Punkt-Features von der berechneten Netzwerkposition. Ein Feld namens Distance wird standardmäßig erstellt oder aktualisiert.

Der Parameter wird nicht verwendet, wenn Positionen für Linien- oder Polygon-Features berechnet werden. Verwenden Sie in solchen Fällen "#" als Parameterwert.

Name des zu erstellenden oder zu aktualisierenden Felds mit der Z-Koordinate des berechneten Netzwerkstandorts. Ein Feld namens SnapZ wird standardmäßig erstellt oder aktualisiert.

Der Parameter wird nicht verwendet, wenn Positionen für Linien- oder Polygon-Features berechnet werden. Verwenden Sie in solchen Fällen "#" als Parameterwert.

Beim Berechnen von Positionen für Punkt-Features wird der Parameter nur verwendet, wenn das Eingabe-Netzwerk-Dataset Konnektivität basierend auf Z-Koordinatenwerten der Netzwerkquellen unterstützt. In allen anderen Fällen verwenden Sie "#" als Parameterwert.

Name des zu erstellenden oder zu aktualisierenden Felds mit den Standortbereichen der berechneten Netzwerkstandorte für die Linien- oder Polygon-Features. Ein Feld namens Standorte wird standardmäßig erstellt oder aktualisiert.

Der Parameter wird nur bei der Berechnung von Positionen für Linien- oder Polygon-Features verwendet. Verwenden Sie für Eingabepunkt-Features "#" als Parameterwert.

Dieser Parameter ist nur anwendbar, wenn die Eingabe-Features aus dem Unter-Layer eines Netzwerkanalyse-Layers stammen und keine Barrierenobjekte sind. In allen anderen Fällen verwenden Sie "#" als Parameterwert.

  • EXCLUDE —Gibt an, dass die Netzwerkstandorte nur auf überquerbaren Teilen des Netzwerks platziert werden. Dadurch wird verhindert, dass Netzwerkstandorte auf Elementen platziert werden, die Sie aufgrund von Einschränkungen oder Barrieren nicht erreichen können. Bevor Sie Ihre Netzwerkstandorte mit dieser Option verlagern, stellen Sie sicher, dass Sie bereits alle Beschränkungsbarrieren zum Netzwerkanalyse-Layer hinzugefügt haben, um die erwarteten Ergebnisse zu erhalten.
  • INCLUDE —Gibt an, dass die Netzwerkstandorte auf allen Elementen des Netzwerks platziert werden. Die mit dieser Option verschobenen Netzwerkstandorte sind während des Lösungsprozesses möglicherweise nicht erreichbar, wenn sie auf eingeschränkten Elementen platziert werden.

Gibt eine Abfrage an, um die Suche auf eine Teilmenge der Features innerhalb einer Quell-Feature-Class einzuschränken. Dies ist nützlich, wenn Sie keine Funktionen finden möchten, die für einen Netzwerkstandort möglicherweise ungeeignet sind. Wenn Sie beispielsweise Schwerpunkte von Polygonen laden und nicht auf Ortsstraßen suchen möchten, können Sie eine Abfrage definieren, die nur nach Hauptstraßen sucht.

Der Parameterwert wird als Liste mit verschachtelten Listen angegeben. Die verschachtelte Liste besteht aus zwei Werten, die den Namen und den SQL-Ausdruck für alle Netzwerkquellen angeben. Die Syntax für den SQL-Ausdruck unterscheidet sich je nach Typ der Netzwerkquell-Feature-Class geringfügig. Wenn Sie beispielsweise Quell-Feature-Classes abfragen, die in File- oder Enterprise-Geodatabases, Shapefiles oder SDC gespeichert sind, schließen Sie Feldnamen in doppelte Anführungszeichen ein: "CFCC" . Wenn Sie in Personal-Geodatabases gespeicherte Quell-Feature-Classes abfragen, schließen Sie Felder in eckige Klammern ein: [CFCC] .

Wenn Sie keine Abfrage für eine bestimmte Quelle angeben möchten, verwenden Sie "#" als Wert für den SQL-Ausdruck oder schließen Sie den Quellennamen und den SQL-Ausdruck aus dem Parameterwert aus. Wenn Sie nicht für alle Netzwerkquellen eine Abfrage angeben möchten, verwenden Sie "#" als Parameterwert.

Der Parameterwert [["Streets",""CFCC" = 'A15'"], ["Streets_ND_Junctions",""]] gibt beispielsweise einen SQL-Ausdruck für die Streets-Quell-Feature-Class und keinen Ausdruck für die Streets_ND_Junctions-Quelle an Feature-Klasse. Beachten Sie, dass die doppelten Anführungszeichen, die zum Einschließen des Feldnamens CFCC verwendet werden, mit umgekehrten Schrägstrichen maskiert werden, um einen Parsing-Fehler des Python-Interpreters zu vermeiden.


2 Antworten 2

Wenn Sie Ihren Code so ändern, sollte es funktionieren:

Die Methode execute weiß nichts über den Parameter, den Sie als Cabina definiert haben, Sie müssen diesen innerhalb dieser Funktion erneut definieren.

Sie definieren Cabina als Parameter und behandeln es dann beim Erstellen Ihres Ausdrucks so, als ob es sich um eine Zeichenfolgenvariable handelt. Sie müssen auf den Parameterwert zugreifen und daraus den SQL-Ausdruck erstellen.

Vielen Dank an alle, es ist Arbeit! Jetzt gehe ich tiefer in den Parameter Value ein!


Vertiefung

Python verwendet Einrückungen (Leerzeichen am Anfang einer Zeile), um den Geltungsbereich im Code zu definieren. Andere Programmiersprachen verwenden zu diesem Zweck oft geschweifte Klammern.

Beispiel

If-Anweisung ohne Einrückung (wird einen Fehler auslösen):

Das Schlüsselwort elif ist eine Python-Methode, um zu sagen: "Wenn die vorherigen Bedingungen nicht erfüllt waren, versuchen Sie es mit dieser Bedingung".

Beispiel

In diesem Beispiel ist a gleich b , also ist die erste Bedingung nicht wahr, aber die elif-Bedingung ist wahr, also geben wir auf dem Bildschirm aus, dass "a und b gleich sind".

Das Schlüsselwort else fängt alles ab, was nicht von den vorhergehenden Bedingungen abgefangen wird.

Beispiel

In diesem Beispiel ist a größer als b , also ist die erste Bedingung nicht wahr, auch die elif-Bedingung ist nicht wahr, also gehen wir zur else-Bedingung und geben auf dem Bildschirm aus, dass "a größer als b" ist.

Sie können auch ein else ohne das elif haben:

Beispiel


JSON-Datenstrukturen – Arbeiten mit Hierarchie und Multikardinalität

von RJSunderman

Wenn ich mit Kunden spreche, die mit ArcGIS GeoEvent Server beginnen möchten, werde ich oft gefragt, ob GeoEvent Server über einen Eingabe-Connector für einen bestimmten Datenanbieter oder Gerätetyp verfügt. Meine Antwort lautet fast immer, dass wir es vorziehen, über REST zu integrieren, und die Frage, die Sie sich stellen sollten, lautet: "Bietet der Anbieter oder das Gerät eine RESTful-API an, deren Endpunkte ein GeoEvent Server-Eingang für die Abfrage konfiguriert werden kann?"

Idealerweise möchten Sie zwei Integrationsfragen beantworten können:

  1. Wie werden die Daten an einen GeoEvent Server-Eingang gesendet?
  2. Wie werden die Daten formatiert Wie sieht die Struktur der Daten aus?

Beispielsweise kann eine Eingabe so konfiguriert werden, dass sie Daten akzeptiert, die an einen von GeoEvent Server gehosteten REST-Endpunkt gesendet werden. Das beantwortet die erste Frage – die Integration erfolgt über REST, wobei der Anbieter Daten als HTTP/POST-Anfrage an einen GeoEvent-Server-Endpunkt sendet. Die zweite Frage, wie die Daten formatiert werden, steht im Mittelpunkt dieses Blogs.

Wie sieht ein typischer JSON-Datensatz aus?

Wenn ein Datenanbieter als JSON formatierte Ereignisdaten sendet, werden in der Regel mehrere Ereignisdatensätze in einer Liste wie dieser organisiert:

Der oben dargestellte Block der JSON-Daten enthält drei Elemente oder Objekte . Es wäre natürlich, sich jedes Element als Ereignisdatensatz mit eigener "ID", "Status" und "Ort" vorzustellen. Jeder Ereignisdatensatz hat auch ein Datum/eine Uhrzeit, zu der das Element zuletzt "kalibriert" wurde (ausgedrückt als epochenlange ganze Zahl in Millisekunden).

Was meinen wir, wenn wir von einer "multi-cardinalen" JSON-Struktur sprechen?

Die oben dargestellten JSON-Daten sind multikardinal, da die Daten in einem Array organisiert wurden. Wir sagen, die Datenstruktur ist multikardinal, weil ihre Kardinalität im mathematischen Sinne der Anzahl der Elemente in einer Gruppe mehr als eins beträgt. Das Array ist in eckige Klammern eingeschlossen: "items": [ . ]

Wenn das Array eine Liste einfacher Ganzzahlen wäre, würden die Daten ungefähr so ​​aussehen: "Werte": [ 1, 3, 5, 7, 9 ]

Die Datenelemente in der obigen Abbildung sind keine einfachen ganzen Zahlen. Jedes Element wird in geschweifte Klammern gesetzt, wodurch JSON ein Objekt identifiziert. Für GeoEvent Server ist es wichtig, dass sowohl das Array einen Namen hat als auch jedes Objekt innerhalb des Arrays eine homogene Struktur hat, was bedeutet, dass jeder Ereignisdatensatz im Allgemeinen ein gemeinsames Schema oder eine Sammlung von Name/Wert-Paaren verwenden sollte, um Daten des Artikels.

Was meinen wir, wenn wir von einer "hierarchischen" JSON-Struktur sprechen?

Die Datenelemente im Array sind selbst hierarchisch. Werte, die mit "id", "status" und "calibrated" verknüpft sind, sind einfache numerische, Zeichenfolgen- oder boolesche Werte. Der "Standort"-Wert hingegen ist ein Objekt, das zwei untergeordnete Werte einkapselt - "Breitengrad" und "Längengrad". Da "location" seine Daten innerhalb einer Unterstruktur organisiert, wird die Gesamtstruktur jedes Datenelements im Array als hierarchisch betrachtet.

Es ist zu beachten, dass die Koordinatenwerte innerhalb der Unterstruktur "location" verwendet werden können, um eine Punktgeometrie zu erstellen, "location" selbst ist jedoch keine Geometrie. Dies wird deutlich, wenn man untersucht, wie eine GeoEvent-Definition verwendet wird, um die im dargestellten JSON-Block enthaltenen Daten darzustellen.

Verschiedene Ansichten zum Anzeigen dieser Daten mithilfe einer GeoEvent-Definition

Wenn Sie in GeoEvent Server eine neue Empfangs-JSON für eine REST-Endpunkt-Eingabe konfigurieren, die Eigenschaft JSON-Objektname nicht angegeben lassen, eine GeoEvent-Definition für Sie erstellen lassen und angeben, dass der eingehende Adapter nicht versucht, eine Geometrie daraus zu erstellen empfangenen Attributwerten würde die erstellte GeoEvent-Definition mit der unten abgebildeten übereinstimmen:

Beachten Sie, dass die Kardinalität von "Elementen" als Viele angegeben ist (das Unendlichkeitszeichen bedeutet einfach "mehr als eins"). Auch wenn der oben dargestellte Block von JSON-Daten über HTTP/POST an die Eingabe gesendet wird, wird die Ereigniszählung der Eingabe nur um eins erhöht, was darauf hinweist, dass nur ein Ereignisdatensatz empfangen wurde.

Beachten Sie auch, dass "items" in dieser Konfiguration ein Gruppenelementtyp ist. Dies impliziert, dass die Struktur nicht nur multikardinal ist, sondern auch als Gruppe von Elementen organisiert ist, die in JSON normalerweise ein Array ist.

Beachten Sie schließlich, dass der "Standort" auch ein Gruppenelementtyp ist. Die Kardinalität von "Ort" ist jedoch One not Many. Dies sagt Ihnen, dass der Wert ein einzelnes Element ist, kein Array von Elementen oder Werten.

Auf Datenwerte zugreifen

Wenn Sie mit der in der oben dargestellten GeoEvent-Definition angegebenen Struktur arbeiten möchten, müssen Sie, wenn Sie auf die Koordinatenwerte für "Breitengrad" oder "Längengrad" zugreifen möchten, den gewünschten Breiten- und Längengrad angeben. Denken Sie daran, dass die Daten als einzelner Ereignisdatensatz empfangen wurden und "items" eine Liste oder ein Array von Elementen ist. Jedes Element im Array hat seinen eigenen Satz von Koordinatenwerten. Betrachten Sie die folgenden Ausdrücke:

Die obigen Ausdrücke geben an, dass das dritte Element in der Liste "Elemente" dasjenige ist, an dem Sie interessiert sind. Sie können nicht auf items.location.latitude verweisen, da Sie keinen Index angegeben haben, um eines der drei Elemente im Array "items" auszuwählen. Der Index des Arrays ist nullbasiert, was bedeutet, dass sich das erste Element bei Index 0 befindet, das zweite bei Index 1 und so weiter.

Diese Daten als einzelnen Ereignisdatensatz aufzunehmen, ist wahrscheinlich nicht das, was Sie tun möchten. Es ist unwahrscheinlich, dass eine willkürliche Wahl, die Koordinaten des dritten Elements anstelle des ersten oder zweiten Elements in der Liste zu verwenden, die Elemente in der Liste angemessen darstellen würde. Diese drei Elemente haben deutlich unterschiedliche geografische Standorte, daher sollten wir einen Weg finden, sie als drei separate Ereignisdatensätze aufzunehmen.

Neukonfiguration der Datenaufnahme

Als ich zum ersten Mal erwähnte, dass ein Receive JSON auf einer REST-Endpunkt-Eingabe konfiguriert wurde, damit der dargestellte JSON-Block zur Verarbeitung in GeoEvent Server aufgenommen werden kann, gab ich an, dass die JSON-Objektname-Eigenschaft nicht angegeben werden sollte. Dies geschah, um eine Diskussion über die Struktur der Daten zu unterstützen.

Wenn die abgebildeten JSON-Daten repräsentativ für Daten waren, die Sie aufnehmen wollten, sollten Sie beim Konfigurieren der GeoEvent Server-Eingabe einen expliziten Wert für den Parameter JSON-Objektname angeben. In diesem Fall würden Sie "items" als Wurzelknoten der Datenstruktur angeben.

Die Angabe von "items" als JSON-Objektname weist die Eingabe an, die Daten als Array von Werten zu behandeln und jedes Element aus dem Array als eigenen Ereignisdatensatz aufzunehmen. Wenn Sie diese Änderung an unserer Eingabe vornehmen und die GeoEvent-Definition löschen, die sie beim letzten Empfang der JSON-Daten erstellt hat, wird eine etwas andere GeoEvent-Definition generiert, wie unten dargestellt:

Das erste, was Sie beachten sollten, wenn der dargestellte Block von JSON-Daten an die Eingabe gesendet wird, ist, dass die Ereigniszählung der Eingabe um drei erhöht wird – was darauf hinweist, dass GeoEvent Server drei Ereignisdatensätze empfangen hat. Beachten Sie beim Betrachten der neuen GeoEvent-Definition, dass es kein Attribut namens "items" gibt - die Elemente im Array wurden aufgeteilt, damit die Ereignisdatensätze separat aufgenommen werden können. Beachten Sie auch, dass die Kardinalität jedes der Ereignisdatensatzattribute jetzt Eins ist. Es gibt keine Listen oder Arrays mit mehreren Elementen in der durch diese GeoEvent-Definition angegebenen Struktur. Der "Ort" ist immer noch eine Gruppe, was in Ordnung ist, jeder Ereignisdatensatz sollte (einen) Ort haben und die Koordinatenwerte können legitim als Kinder innerhalb einer Unterstruktur organisiert werden.

Die Aktualisierungen der in der GeoEvent-Definition angegebenen Struktur ändern, wie auf die Koordinatenwerte zugegriffen wird. Nachdem die Ereignisdatensätze nun getrennt wurden, können Sie auf die Attribute jedes Datensatzes zugreifen, ohne einen von mehreren Elementindizes anzugeben, um ein Element aus einer Liste auszuwählen.

Sie sollten jetzt bereit sein, die Eingabe neu zu konfigurieren, um eine Geometrie zu konstruieren, sowie einige kleinere Aktualisierungen an den Datentypen jedes Attributs in der GeoEvent-Definition vorzunehmen, um "id" als Long und "kalibriert" als Datum zu behandeln . Außerdem müssen Sie der GeoEvent-Definition ein neues Feld vom Typ Geometrie hinzufügen, um die zu erstellende Geometrie aufzunehmen.

Hoffentlich bietet dieser Blog zusätzliche Einblicke in die Arbeit mit hierarchischen und multikardinalen JSON-Datenstrukturen in GeoEvent Server. Wenn Sie Ideen für zukünftige Blog-Posts haben, lassen Sie es mich wissen. Das Team sucht immer nach Möglichkeiten, Sie mit den Echtzeit- und Big-Data-GIS-Funktionen von ArcGIS erfolgreicher zu machen.


Generatoren

Generatoren sollten Sie öfter verwenden. Sie sind speichereffizienter als Listen, da jeder Wert spontan generiert wird, anstatt sich alle auf einmal merken zu müssen.

Dies ist zum Beispiel besonders nützlich in has_op() . Alles, was Sie tun müssen, ist die öffnenden und schließenden Klammern zu entfernen. Das ändert sich in die Verwendung eines Generatorausdrucks anstelle eines Listenverständnisses. Nehmen wir an, das erste Element in Token ist eine Übereinstimmung. Wenn Sie einen Generatorausdruck verwenden, gibt any() sofort True zurück, und keines der anderen Token wird überhaupt überprüft. Wenn Sie ein Listenverständnis verwenden, beginnt any() nichts zu tun, bis alle Token verarbeitet wurden.

Es ist auch in eval_tokens nützlich, wenn Sie has_op verwenden. Kurz gesagt, es kommt selten vor, dass bei der Verwendung von any() ein Listenverständnis einem Generatorausdruck vorzuziehen ist.

Sie haben andere Funktionen, die gut als Generatorfunktionen funktionieren könnten, außer dass die Funktionen, die sie verwenden, alle Listen sein müssen, was bedeuten würde, dass sie die Listenfunktion verwenden müssten. Es mag immer noch eine gute Idee sein, aber es ist kein klarer Vorteil.


Ist das die beste Lösung?

Ich habe ein Jahr lang Textdateien geparst und meine Methode im Laufe der Zeit perfektioniert. Trotzdem habe ich einige zusätzliche Recherchen durchgeführt, um herauszufinden, ob es eine bessere Lösung gibt. Tatsächlich schulde ich verschiedenen Community-Mitgliedern Dank, die mich bei der Optimierung meines Codes beraten haben. Die Community bot auch verschiedene Möglichkeiten zum Parsen der Textdatei an. Einige von ihnen waren klug und aufregend. Mein persönlicher Favorit war dieser. Ich habe mein Beispielproblem und die Lösung in den folgenden Foren vorgestellt:

Wenn Ihr Problem noch komplexer ist und reguläre Ausdrücke es nicht schaffen, dann wäre der nächste Schritt das Parsen von Bibliotheken. Hier sind ein paar Orte, um damit anzufangen:

    : Ein PyCon-Vortrag von Erik Rose, der sich mit den Vor- und Nachteilen verschiedener Parsing-Bibliotheken befasst. : Tools und Bibliotheken, mit denen Sie Parser erstellen können, wenn reguläre Ausdrücke nicht ausreichen.

Adapter¶

Adapter sind HTTP-Clientimplementierungen, die von Geocodierern verwendet werden.

Einige Adapter unterstützen möglicherweise Keep-Alives, Anforderungswiederholungen, http2, Persistenz von Cookies, Antwortkomprimierung und so weiter.

Adapter sollten als Implementierungsdetail betrachtet werden. Meistens müssen Sie nichts über ihre Existenz wissen, es sei denn, Sie möchten die HTTP-Clienteinstellungen optimieren.

Neu in Version 2.0: Adapter werden derzeit provisorisch bereitgestellt.

Unterstützte Adapter¶

Der Adapter, der die Anforderungsbibliothek verwendet.

Requests unterstützt Keep-Alives, Retrys, persistiert Cookies, erlaubt die Komprimierung von Antworten und verwendet [derzeit] HTTP/1.1.

Requests-Paket muss installiert sein, um diesen Adapter verwenden zu können.

Klasse geopy.adapter. URLLibAdapter ( * , Stellvertreter , ssl_context ) ¶

Der Fallback-Adapter, der urllib aus der Python-Standardbibliothek verwendet, finden Sie unter urllib.request.urlopen() .

urllib unterstützt keine Keep-Alives, fordert Wiederholungen an, behält keine Cookies bei und ist nur HTTP/1.1.

urllib war die einzige verfügbare Option zum Senden von Anfragen in geopy 1.x, daher verhält sich dieser Adapter in Bezug auf HTTP-Anfragen genauso wie geopy 1.x.

Klasse geopy.adapter. AioHTTP-Adapter ( * , Stellvertreter , ssl_context ) ¶

Der Adapter, der die aiohttp-Bibliothek verwendet.

aiohttp unterstützt Keep-Alives, behält Cookies bei, erlaubt Antwortkomprimierung und verwendet HTTP/1.1 [derzeit].

aiohttp-Paket muss installiert sein, um diesen Adapter verwenden zu können.

Basisklassen¶

Eine Ausnahme, die von Adaptern ausgelöst werden muss, wenn eine HTTP-Antwort mit einem nicht erfolgreichen Statuscode empfangen wurde.

Die Base Geocoder-Klasse übersetzt diese Ausnahme in eine Instanz von geopy.exc.GeocoderServiceError .

Botschaft (str) – Standard-Ausnahmemeldung.

Statuscode (int) – HTTP-Statuscode

Text (str) – HTTP-Haupttext

Basisklasse für einen Adapter.

Es gibt zwei Arten von Adaptern:

BaseAsyncAdapter – asynchroner (asyncio) Adapter.

Konkrete Adapterimplementierungen müssen einen der beiden obigen Basisadapter erweitern.

Weitere Informationen zum Angeben eines von Geocodierern zu verwendenden Adapters finden Sie unter geopy.geocoders.options.default_adapter_factory.

Wie get_text, außer dass als Antwort ein gültiges JSON erwartet wird. Der zurückgegebene Wert ist das geparste JSON.

geopy.exc.GeocoderParseError muss ausgelöst werden, wenn die Antwort nicht geparst werden kann.

URL (str) – Die Ziel-URL.

Überschriften (diktieren) – Ein Diktat mit benutzerdefinierten HTTP-Anforderungsheadern.

Stellen Sie eine GET-Anfrage und geben Sie die Antwort als String zurück.

Diese Methode sollte keine anderen Ausnahmen auslösen als diese:

geopy.adapters.AdapterHTTPError sollte ausgelöst werden, wenn die Antwort erfolgreich abgerufen wurde, der Statuscode jedoch nicht erfolgreich war.

geopy.exc.GeocoderTimedOut sollte ausgelöst werden, wenn die Anforderung abläuft.

geopy.exc.GeocoderUnavailable sollte ausgelöst werden, wenn der Zielhost nicht erreichbar ist.

geopy.exc.GeocoderServiceError ist der am wenigsten spezifische Fehler in der Ausnahmehierarchie und sollte in allen anderen Fällen ausgelöst werden.

URL (str) – Die Ziel-URL.

Überschriften (diktieren) – Ein Diktat mit benutzerdefinierten HTTP-Anforderungsheadern.

Basisklasse für synchrone Adapter.

Klasse geopy.adapter. BaseAsyncAdapter ( * , Stellvertreter , ssl_context ) ¶

Basisklasse für asynchrone Adapter.


Das Kalender Modul

Das Kalendermodul stellt kalenderbezogene Funktionen bereit, einschließlich Funktionen zum Drucken eines Textkalenders für einen bestimmten Monat oder ein bestimmtes Jahr.

Standardmäßig verwendet der Kalender Montag als ersten Tag der Woche und Sonntag als letzten. Um dies zu ändern, rufen Sie die Funktion calendar.setfirstweekday() auf.

Hier ist eine Liste der Funktionen, die mit dem Kalender Modul &minus

Kalender.Kalender(Jahr,w=2,l=1,c=6)

Gibt eine mehrzeilige Zeichenfolge mit einem Kalender für das Jahr und das Jahr zurück, das in drei durch Leerzeichen getrennte Spalten formatiert ist. w ist die Breite in Zeichen jedes Datums, jede Zeile hat die Länge 21*w+18+2*c. l ist die Anzahl der Zeilen für jede Woche.

kalender.ersterWochentag( )

Gibt die aktuelle Einstellung für den Wochentag zurück, der jede Woche beginnt. Wenn der Kalender zum ersten Mal importiert wird, ist dies standardmäßig 0, was Montag bedeutet.

Gibt True zurück, wenn year ein Schaltjahr ist, andernfalls False.

Gibt die Gesamtzahl der Schalttage in den Jahren im Bereich (y1,y2) zurück.

Kalender.Monat(Jahr,Monat,w=2,l=1)

Returns a multiline string with a calendar for month month of year year, one line per week plus two header lines. w is the width in characters of each date each line has length 7*w+6. l is the number of lines for each week.

calendar.monthcalendar(year,month)

Returns a list of lists of ints. Each sublist denotes a week. Days outside month month of year year are set to 0 days within the month are set to their day-of-month, 1 and up.

calendar.monthrange(year,month)

Returns two integers. The first one is the code of the weekday for the first day of the month month in year year the second one is the number of days in the month. Weekday codes are 0 (Monday) to 6 (Sunday) month numbers are 1 to 12.

calendar.prcal(year,w=2,l=1,c=6)

Like print calendar.calendar(year,w,l,c).

calendar.prmonth(year,month,w=2,l=1)

Like print calendar.month(year,month,w,l).

calendar.setfirstweekday(weekday)

Sets the first day of each week to weekday code weekday. Weekday codes are 0 (Monday) to 6 (Sunday).

calendar.timegm(tupletime)

The inverse of time.gmtime: accepts a time instant in time-tuple form and returns the same instant as a floating-point number of seconds since the epoch.

calendar.weekday(year,month,day)

Returns the weekday code for the given date. Weekday codes are 0 (Monday) to 6 (Sunday) month numbers are 1 (January) to 12 (December).


Schau das Video: استخدم Python لاستخراج بيانات Twitter من MongoDB إلى ArcGIS