Mehr

Verwenden von Geometriesammlungen mit Fiona, um die Ausgabe von Multipoints und Points zu schreiben?


Bei dieser Funktion erhalte ich folgende Fehlermeldung:

ValueError: Der Geometrietyp des Datensatzes stimmt nicht mit dem Geometrietyp des Sammlungsschemas überein: 'Point' != 'MultiPoint'

Das Problem ist, dass ich Multipoints mit regulären Punkten gemischt habe. Wenn ich versuche, die Ausgaben unter zu schreiben, bekomme ich ein Schema-Verwirrungsproblem

Der Datensatz, der Probleme bei 'output.write' verursacht, ist dieser (Hinweis: für einen MultiPoint hat er nur ein x, y):

{'geometry': {'type': 'MultiPoint', 'coordinates': [(13531245.475704141, 2886003.2689278126)]}, 'type': 'Feature', 'id': '0', 'properties': OrderedDict([ (u'H20Status', u'Ausreichend')])}

Wenn ich gehe:

if geom['type'] == 'MultiPoint': # Multipoints in Punkte aufteilen # d.h.  für pt in my_shape: pt = self.move_point(pt, vergleichen, dist)

'pt' wird zu 'Punkt':

PUNKT (13531245.47570414 2886003.268927813)

Wenn ich dann versuche, es zurück zu dem zu schreiben, was es war (ein Multipoint):

# in Ausgabedatei schreiben - WHERE EVERYTHING FAILS output.write({'geometry':mapping(pt), 'properties': item['properties']})

Ich bekomme das:

ValueError: Der Geometrietyp des Datensatzes stimmt nicht mit dem Geometrietyp des Sammlungsschemas überein: 'Point' != 'MultiPoint'

Wenn ich versuche, 'pt' VOR dem Schreibvorgang in einen 'MultiPoint' neu zu schreiben (und dies ist wieder ein Multipoint mit EINEM Koordinatensatz), so,

mpoint = MultiPoint(pt)

Ich bekomme das:

Datei "C:Python27libsite-packagesshapelygeometrymultipoint.py", Zeile 143, in geos_multipoint_from_py assert len(array['shape']) == 2 AssertionError

*Voll funktionsfähiger Code nach Hilfe von @gene und @Vince *

def process_file(self, in_file, out_file, Compare_file, dist): # Eingabedatei öffnen und Datei vergleichen # Schleife jeweils mit fiona.open(in_file, 'r') als Eingabe: meta = input.meta # Die outFile hat das gleiche crs, Schema als inFile mit fiona.open(out_file, 'w', **meta) als Ausgabe: mit fiona.open(compare_file, 'r') als Compare: # Formschöne Geometrien aus Datei lesen # Durchlaufen aller formschönen Objekte # type(item) = 'dict' for item in input: geom = item['geometry'] my_shape = shape(geom) # prüfen ob es ein Multipoint oder Point ist if geom['type'] == 'MultiPoint': # Multipoints in Punkte aufteilen # ie  for pt in my_shape: single_point = self.move_point(pt, vergleichen, dist) mpoint = MultiPoint([(single_point.x, single_point.y)]) mpoint_for_merge = shape(mapping(mpoint)) # in Outfile schreiben - WO ALLES JETZT WORKS output.write({'geometry':mapping(mpoint_for_merge), 'properties': item['properties']}) elif geom['type'] == 'Point': # Rückgabe von move_point ist eine formschöne Geometrie # ie  my_shape = self.move_point(my_shape, Compare, Dist) # in Ausgabedatei schreiben output.write({'geometry':mapping(my_shape), 'properties': item['properties']}) else: raise ValueError('unhandled Geometrie Typ: ' + repr(geom.type))

Halten Sie die Dinge einfach, ein MultiPoint ist eine einfache Liste von Punkten und die Art der Geometrie kann von Fiona (key ['geometry']['type']) oder von Shapely (geometry.type) erhalten werden.

mit fiona.open(in_file, 'r') als Eingabe: mit fiona.open(compare_file, 'r') als Vergleich: meta = input.meta mit fiona.open(out_file, 'w', **meta) als Ausgabe : für item in input: geom = item['geometry'] my_shape = shape(geom) # prüfen ob es ein Multipoint ist if geom['type'] == 'MultiPoint': für pt in my_shape: my_shape = self.move_point (pt, vergleichen, dist) else: # die Punkte my_shape = self.move_point(my_shape, vergleichen, dist)

Sie können auch verwenden

if my_shape.type == 'MultiPoint':

Neu

Ihr Problem besteht darin, einen Point in einen MultiPoint zu verwandeln. Bei Shapely müssen Sie die Koordinaten des Punktes verwenden und nicht den Punkt selbst (siehe Punktsammlungen).

Multi = MultiPoint([(13531245.475704141, 2886003.2689278126)]) print Multi MULTIPOINT (13531245.47570414 2886003.268927813) point = Multi[0] print point POINT (13531245.47570414 2886003.268927813)

Jetzt können Sie nicht verwendenmpoint = MultiPoint(Punkt)aber

mpoint = MultiPoint([(point.x, point.y)]) print mapping(mpoint) {'type': 'MultiPoint', 'coordinates': ((13531245.475704141, 2886003.2689278126),)} # and print shape(mapping( mPunkt)) MEHRPUNKT (13531245.47570414 2886003.268927813)

Formschön : Tupel ohne Kommas mit LineString

Es ist ziemlich kompliziert, aber lange Rede, kurzer Sinn: Ich habe mehrere Bibliotheken wie OSMNx verwendet, um eine Route zwischen mehreren Orten einer Stadt zu zeichnen. Jetzt würde ich es als shp-Datei konvertieren.

Die Route ist eine Liste voller Knoten-IDs. Dann wurden diese IDs verwendet, um den Breiten- und Längengrad jedes Knotens zu extrahieren. Ich habe Tupel erstellt, um die Koordinaten jedes Knotenpaares (ein Start, eine Ankunft) mit einer for-Schleife zu verketten, wie folgt:

Hier ist das Ergebnis von print(journey) am Ende der Schleife:

Jedes Tupel wird korrekt angezeigt. Aber wenn ich Reise in einen formschönen LineString umwandeln möchte. Und es gibt dies zurück:

Folglich kann ich es mit fiona nicht in ein shp konvertieren:

-------------------------------------------------- ------------------------- TypeError Traceback (letzter Aufruf zuletzt) ​​in () 4 > 5 ----> 6 with fiona.open( 'test.shp', 'w', 'ESRI Shapefile', Schema) as c: 7 c.write( < 8 'geometry': mapping(trace)

/usr/local/lib/python3.5/dist-packages/fiona/drin.py in open(path, mode, driver, schema, crs, encoding, layer, vfs, enabled_drivers, crs_wkt) 173 c = Collection(path, mode, crs=crs, driver=driver, schema=this_schema, 174 encoding=encoding , layer=layer, vsi=vsi, archive=archive, --> 175 enabled_drivers=enabled_drivers, crs_wkt=crs_wkt) 176 else: 177 raise ValueError(

/usr/local/lib/python3.5/dist-packages/fiona/collection.py in drin(self, path, mode, driver, schema, crs, encoding, layer, vsi, archive, enabled_drivers, crs_wkt, **kwargs) 154 elif self.mode in ('a', 'w'): 155 self.session = WritingSession() --> 156 self.session.start(self, **kwargs) 157 außer IOError: 158 self.session = None

fiona/ogrext.pyx in fiona.ogrext.WritingSession.start (fiona/ogrext2.c:16207)()

TypeError: Argument vom Typ 'int' ist nicht iterierbar

Ich verstehe nicht, warum Tupel ohne Komma zwischen Breiten- und Längengrad konvertiert werden. Darüber hinaus gibt es mehrere Duplizierungen (die zweiten Koordinaten der dritten Zeile sind die ersten Koordinaten der vierten Zeile usw.) und möglicherweise eine Fehlerquelle für die zukünftige shp.


Fiona

Fiona ist die übersichtliche und flinke Vektor-API von GDAL für Python-Programmierer.

Fiona ist so konzipiert, dass es einfach und zuverlässig ist. Es konzentriert sich auf das Lesen und Schreiben von Daten im Standard-Python-IO-Stil und stützt sich auf bekannte Python-Typen und -Protokolle wie Dateien, Wörterbücher, Mappings und Iteratoren anstelle von OGR-spezifischen Klassen. Fiona kann reale Daten mit mehrschichtigen GIS-Formaten und gezippten virtuellen Dateisystemen lesen und schreiben und lässt sich problemlos in andere Python-GIS-Pakete wie pyproj, Rtree und Shapely integrieren. Fiona wird nur von CPython-Versionen 2.7 und 3.4+ unterstützt.


GeometryEngine-Puffermethode (IEnumerable Geometry , IEnumerable Double , Boolean)

Die Geometrien müssen den gleichen Raumbezug haben. Planare Entfernungs- und Flächenmessungen können bei Verwendung eines ungeeigneten Raumbezugs extrem ungenau sein. Stellen Sie sicher, dass Sie das Fehlerpotenzial beim Raumbezug der Geometrie verstehen. Wenn Sie genauere Ergebnisse berechnen müssen, sollten Sie einen anderen Raumbezug oder das geodätische Äquivalent BufferGeodetic(IEnumerable Geometry , IEnumerable Double , LinearUnit, Double, GeodeticCurveType, Boolean) verwenden. Weitere Informationen zu Raumbezügen finden Sie im Dokument Einführung in Raumbezüge. Wenn unionResult true ist, enthält die Ausgabesammlung ein einzelnes Ergebnis. Wenn geometries leer ist, wird ein leeres Array zurückgegeben.

Diese Methode ermöglicht die Erstellung unterschiedlicher gepufferter Ausgabegeometriegrößen für jede Eingabe im Geometrien Sammlung basierend auf den Werten in der Entfernungen Sammlung. In den meisten Fällen würde es eine Eins-zu-Eins-Entsprechung der Eingabe geben Geometrien zum Eingabepuffer Entfernungen. Es ist jedoch möglich, weniger Eingabepuffer zu haben Entfernungen als Eingabe Geometrien. In diesem Fall der letzte Distanzwert im Puffer Entfernungen Sammlung wird für den Rest der Geometrien. Im Extremfall könnte man im Eingabepuffer einen einzelnen Pufferwert angeben Entfernungen Sammlung und dieser Wert würde für alle Eingaben gelten Geometrien Sammlung.

Die aus dieser statischen Methode generierten Polygone basieren auf der SpatialReference der Eingabegeometrien. Eine SpatialReference ist eine Kombination aus einem Ellipsoid, einem Datum und einem Koordinatensystem, das verwendet wird, um geographische Daten der dreidimensionalen Erde auf einer zweidimensionalen Oberfläche (wie einem Stück Papier oder einem Computermonitor) anzuzeigen (auch bekannt als Projekt). Einen guten Artikel zur Beschreibung der Funktionsweise eines Raumbezugs finden Sie hier. Beim Erstellen von Puffern ist es wichtig zu wissen, dass einige SpatialReferences besser sind als andere, um genaue Ergebnisse zu erzielen. Um mit dieser Methode die genauesten Pufferpolygone zu erhalten, sollten Sie eine flächenerhaltende SpatialReference verwenden, wie z. B.: Albers, Lambert, Mollweide, Hammer, Sinusoidal und dergleichen. Wenn die Eingabegeometrien für diese Methode nicht auf einer guten flächenerhaltenden SpatialReference basieren, stehen zwei Optionen zur Verfügung, um genaue Puffer zu erzeugen: (1) Verwenden Sie die statische Methode Project(Geometry, SpatialReference), um die Geometrie auf eine Koordinate zu projizieren System, das besser für Puffer geeignet ist, oder (2) verwenden Sie die statische Methode BufferGeodetic(IEnumerable Geometry , IEnumerable Double , LinearUnit, Double, GeodeticCurveType, Boolean), die einen internen Projektionsalgorithmus verwendet, um die Geometrie in ein Kugelkoordinatensystem umzuwandeln, um die genaueste Puffer möglich.

Generieren Sie mehrere einzelne Puffer oder einen einzelnen vereinigten Puffer um mehrere Punkte.


Verwenden von Geometriesammlungen mit Fiona, um die Ausgabe von Multipoints und Points zu schreiben? - Geografisches Informationssystem

Was ist das größte Grundstück in der Stadt San Francisco?

JSON-Daten im großen Maßstab aufnehmen und verarbeiten

In diesem Tutorial erfahren Sie, wie Sie eine StreamSets Data Collector (SDC)-Pipeline erstellen, um Hunderttausende von JSON-Objekten aufzunehmen, jedes einzelne über JavaScript-Code zu verarbeiten und die Ergebnisse in Apache Hive zu schreiben.

SF OpenData, das offizielle Open-Data-Portal der Stadt und des Landkreises San Francisco, stellt Hunderte von Stadtdatensätzen für Entwickler, Analysten, Einwohner und mehr zur Verfügung. Einer dieser Datensätze enthält die Polygonkoordinaten für jedes einzelne Grundstück in der Stadt - insgesamt 206560 Datensätze im Shapefile-Format.

Glücklicherweise konvertierte Mirco Zeiss, ein Berater bei CGI in Deutschland, die Shapefile-Daten in JSON und schob sie in ein GitHub-Projekt, da er „eine wirklich große .json-Datei zum Testen verschiedener Codes benötigte“. Wir können SDC verwenden, um die JSON-Daten zu lesen, die Fläche jedes Loses in einem JavaScript-Evaluator zu berechnen und die resultierenden Datensätze zur Analyse in Hive zu schreiben. Insbesondere möchten wir die Frage "Was ist das größte Grundstück in der Stadt San Francisco?" beantworten.

Sie benötigen Folgendes:

Hadoop - Ich habe die QuickStart VM für Cloudera Distribution Hadoop (CDH) 5.5 verwendet, aber andere Versionen und Distributionen werden wahrscheinlich genauso gut funktionieren. Ich empfehle dringend, das CDH Quickstart Tutorial durchzuarbeiten, wenn Sie noch keine Erfahrung mit Hadoop haben.

StreamSets Data Collector – In diesem Tutorial wird davon ausgegangen, dass Sie neben CDH auch StreamSets in der Cloudera QuickStart-VM installiert haben. In diesem Blogeintrag finden Sie eine praktische Anleitung für den Einstieg. Nochmal Ich sehr empfehlenswert das Tutorial durcharbeiten, um ein Gefühl für SDC zu bekommen.

Gängige Entwicklungstools wie git

Laden Sie die JSON-Quelldaten herunter

Der erste Schritt besteht darin, die JSON-Quelldaten von GitHub herunterzuladen. Klonen Sie das Projekt einfach:

Die Datei citylots.json ist groß – 181 MB – und enthält über 200.000 JSON-Objekte, die jeweils ein einzelnes Stadtgrundstück darstellen. Hier sind die ersten Zeilen der Datei, die für die Lesbarkeit formatiert sind:

Die gesamte Datei ist ein einzelnes JSON-Objekt, das in seiner Eigenschaft features ein Array von lot-Objekten enthält.

Wir verwenden das SDC-Verzeichnis Origin, um die JSON-Daten einzulesen. Da das Directory Origin entweder eine Reihe von JSON-Objekten oder ein JSON-Array von Objekten akzeptieren kann, müssen wir die Daten ein wenig vorverarbeiten. Glücklicherweise ist dies eine einfache Sache, indem Sie alles vor der ersten öffnenden eckigen Klammer „[“ am Anfang der Datei und alles nach der letzten schließenden eckigen Klammer „]“ am Ende der Datei löschen. Sie müssen einen Editor verwenden, der mit sehr großen Dateien umgehen kann. Ich habe vim verwendet. Speichern Sie die Datei als citylots-array.json .

Jetzt haben die Quelldaten das richtige Format, Sie können mit SDC arbeiten.

  1. Wenn Sie das StreamSets-Lernprogramm noch nicht durchlaufen haben, müssen Sie im StreamSets-Basisverzeichnis Verzeichnisse erstellen, die Ursprungs-, Ziel- und Fehlerdateien enthalten:
  • /<base-Verzeichnis>/tutorial/origin
  • /<base-Verzeichnis>/tutorial/destination
  • /<base-Verzeichnis>/tutorial/error

Verschieben Sie die Datei citylots-array.json in das /<base-Verzeichnis>/tutorial/origin

Wenn Sie noch nicht angemeldet sind, melden Sie sich bei SDC an.

Von dem Zuhause Seite oder Einstieg Seite, klick Neue Pipeline erstellen.

In dem Neue Pipeline Geben Sie einen Pipelinenamen und eine optionale Beschreibung ein und klicken Sie auf speichern.

Klicken Sie im Eigenschaftenfenster auf das Fehleraufzeichnungen Registerkarte für die Fehleraufzeichnungen Eigentum, wählen In Datei schreiben. Dadurch werden Fehlerdatensätze in eine Datei geschrieben, sodass Sie mit Fehlerdatensätzen umgehen können, ohne die Pipeline anhalten zu müssen.

Drücke den Fehleraufzeichnungen - In Datei schreiben Tab und Set Verzeichnis in das /<base-Verzeichnis>/tutorial/error

Wir verwenden den Verzeichnisursprung, um die JSON-Stadtlosdaten zu verarbeiten.

Um die Stufe zum Canvas hinzuzufügen, klicken Sie in der Hilfeleiste zur Pipeline-Erstellung auf Wählen Sie Origin >-Verzeichnis. Oder klicken Sie in der Bühnenbibliothek auf das Verzeichnis Ursprung. Der Ursprung wird im Zeichenbereich angezeigt und das Eigenschaftenbedienfeld zeigt die Eigenschaften für die Bühne an.

Klicken Sie im Eigenschaftenfenster auf das Dateien Registerkarte und konfigurieren Sie die folgenden Eigenschaften. Verwenden Sie die Standardeinstellungen für nicht aufgeführte Eigenschaften:

  1. Drücke den JSON Registerkarte und konfigurieren Sie die folgenden Eigenschaften. Verwenden Sie die Standardeinstellungen für nicht aufgeführte Eigenschaften:

Ihre Pipeline sollte so aussehen:

Es ist eine gute Idee, eine Vorschau der Daten anzuzeigen, um zu überprüfen, ob Sie den Verzeichnisursprung richtig konfiguriert haben. Klicken Sie über dem Pipeline-Canvas auf das Vorschau und akzeptieren Sie die Standardeigenschaften. Sie sollten in der Lage sein, die ersten Datensätze von Ausgabedaten unter der Pipeline-Leinwand und sehen Sie sich die Koordinaten des Polygons des Stadtgrundstücks an:

Wenn Fehler auftreten, überprüfen Sie die Eigenschaften für die Pipeline und den Ursprung.

Nachdem wir nun überprüft haben, dass das Directory Origin die JSON-Daten korrekt liest, klicken Sie auf das Vorschau schließen Symbol.

Konfigurieren eines JavaScript-Evaluators

Da unsere Pipeline nun erfolgreich JSON-Daten einliest, müssen wir die Fläche jedes Stadtgrundstücks berechnen. Ich habe eine Version des Algorithmus zur Berechnung der Fläche eines Polygons auf der Erdoberfläche verwendet, die in einer Antwort auf den Geographic Information Systems StackExchange von Tim Schaub bereitgestellt wurde.

Füge hinzu ein JavaScript-Evaluator Prozessor mit dem Canvas und verbinden Sie den ersten Ausgabeort des Directory Origin damit.

Klicken Sie bei ausgewähltem JavaScript-Evaluator im Eigenschaftenbedienfeld auf die Schaltfläche JavaScript Tab.

Löschen Sie den vorhandenen Inhalt der Skript Textfeld und fügen Sie das folgende Skript ein:

Zeigen Sie die Pipeline erneut in der Vorschau an, klicken Sie auf den JavaScript-Evaluator, und Sie sollten sehen, dass die Ausgabedatensätze jetzt ein AREA-Feld aufweisen:

Beachten Sie, dass das Skript nur das Eigenschaftsfeld vom Eingabe- in den Ausgabebereich kopiert. Dies „flacht“ den Datensatz ab und erleichtert das Schreiben in eine Apache Hive-Tabelle.

Drücke den Vorschau schließen Symbol, und wir fügen ein Ziel für unsere verarbeiteten Datensätze hinzu.

Konfigurieren eines Hadoop FS-Ziels

Wir könnten direkt ein Hive-Streaming-Ziel konfigurieren, aber das Schreiben in Hive ist viel, viel langsamer als das einfache Anhängen von Daten an eine Datei auf der Festplatte. Daher testen wir die Pipeline für den gesamten Datensatz, indem wir sie einfach in eine JSON-Datei schreiben . Dies gibt uns ein gewisses Vertrauen, dass die Pipeline korrekt ist, bevor wir Zeit investieren, um sie gegen Hive zu betreiben.

Füge hinzu ein Hadoop FS Ziel auf den Canvas und verbinden Sie den JavaScript Evaluator damit.

Klicken Sie im Eigenschaftenfenster auf das Hadoop FS Tab. Um Hadoop FS zum Schreiben in ein lokales Dateisystem zu verwenden, konfigurieren Sie die folgenden Eigenschaften. Verwenden Sie die Standardeinstellungen für nicht aufgeführte Eigenschaften:

  1. Drücke den Ausgabedateien Registerkarte und konfigurieren Sie die folgenden Eigenschaften. Verwenden Sie die Standardeinstellungen für nicht aufgeführte Eigenschaften:

Nachdem die grundlegende Pipeline nun abgeschlossen ist, können Sie sie starten, indem Sie auf klicken Start Symbol.

Die Konsole wechselt in den Monitormodus und zeigt zusammenfassende Statistiken im Monitorfenster an. Es dauert einige Minuten, bis die DEZA die Aufzeichnungen durchgearbeitet hat.

Wenn alle 206.560 Datensätze aufgenommen wurden, beachten Sie, dass der JavaScript-Evaluator 6 Fehler erkannt hat:

Klick auf das JavaScript-Evaluator im Pipeline-Canvas und dann die Fehler Registerkarte auf der linken Seite. Sie werden sehen, dass die sechs Fehler alle sind SCRIPTING_04 - Skript hat Datensatz an Fehler gesendet: TypeError: Eigenschaft "type" kann nicht von null gelesen werden. Drillen Sie sich den ersten Fehler an und Sie werden sehen, warum - das Geometriefeld für diesen Datensatz ist null.

Wenn Sie die anderen fünf aufgelisteten Datensätze durcharbeiten, werden Sie feststellen, dass sie alle eine Nullgeometrie aufweisen. Es stellt sich heraus, dass eine Handvoll Plots keine aufgezeichneten Koordinaten haben. Lassen Sie uns sie herausfiltern, damit der JavaScript-Evaluator seine Eingaben erfolgreich verarbeiten kann.

Routendaten mit dem Stream Selector

Wir konfigurieren einen Stream Selector, um nur die Datensätze mit einem Geometriefeld ungleich null an den JavaScript-Evaluator zu leiten.

Klicken Sie in der Hilfeleiste zur Pipeline-Erstellung auf Prozessor zum Verbinden auswählen > Stream Selector. Oder wählen Sie in der Bühnenbibliothek das Stream-Auswahl Prozessor und verbinden Sie den Verzeichnisursprung damit.

Drücke den Bedingungen Tab. Eine Bedingung für den Standardstream wird angezeigt. Der Standardstream stellt alle Datensätze dar, die nicht von anderen Bedingungen erfasst werden.

Drücke den Hinzufügen Symbol. Im Eigenschaftenfenster wird ein Bedingungstextfeld angezeigt, und der entsprechende Ausgabeort wird auf der Bühne im Zeichenbereich angezeigt.

Die folgende Bedingung erfasst Datensätze, bei denen das Geometriefeld nicht null ist. Sie können den Ausdruck kopieren und einfügen, aber versuchen Sie, ihn einzugeben, um zu sehen, wie die Funktion zur Ausdrucksvervollständigung Ihnen hilft, die Funktion auszuwählen und eine gültige Syntax sicherzustellen.

Alle Datensätze, die dieser Bedingung entsprechen, werden an den ersten Ausgabestrom übergeben. Alle anderen Datensätze werden von der Standardbedingung erfasst und durch den zweiten Ausgabestrom geleitet.

Der Stream Selector sollte so aussehen:

In unserem Szenario haben wir keine Verwendung für Datensätze ohne zugehörige Geometrie, also verwerfen wir sie einfach. SDC enthält eine Trash-Destination, die unsere Bedürfnisse perfekt erfüllt. Einfach a hinzufügen Müll Ziel auf die Leinwand und verbinden Sie die Standardausgabe des Stream Selectors (markiert mit „2“) damit.

Wenn Sie jetzt versuchen, die Pipeline auszuführen, werden Sie feststellen, dass sie keine Datensätze verarbeitet. Warum ist das? Nun, die Pipeline hat bereits alle Dateien in ihrem Eingabeverzeichnis verarbeitet und wartet daher auf neue Eingaben. Da wir unsere Pipeline noch entwickeln, müssen wir ihren Status zurücksetzen können, damit sie dieselben Eingabedaten erneut verarbeiten kann.

Stoppen Sie die Pipeline, wenn sie ausgeführt wird, klicken Sie auf das Mehr über dem Pipeline-Canvas und klicken Sie dann auf Ursprung zurücksetzen. Sie werden aufgefordert, zu bestätigen, dass Sie den Ursprung wirklich zurücksetzen möchten, also klicken Sie auf OK.

Klicken Sie nun auf die Lauf Symbol. Die Pipeline verarbeitet die Ursprungsdaten erneut und nach ein paar Minuten sollten Sie sehen, dass alle 206.560 Datensätze erfolgreich und ohne Fehler verarbeitet wurden:

Drücke den Halt Symbol, um die Pipeline zu stoppen.

Nachdem wir nun gesehen haben, dass unsere Pipeline ordnungsgemäß funktioniert, müssen wir das Hadoop FS-Ziel durch ein Ziel ersetzen, das Abfragen zulässt. Wir erstellen eine neue Tabelle in Hive, um unsere Ausgabedatensätze zu erhalten. Das SDC Hive Streaming-Ziel unterstützt das ORC-Dateiformat (Optimized Row Columnar), daher müssen wir dies in unserem Data Definition Language (DDL)-Code angeben.

Angenommen, Sie verwenden Cloudera Distribution Hadoop (CDH) QuickStart-VM:

Öffnen Sie einen neuen Browser-Tab und gehen Sie zu http://quickstart.cloudera:8888/beeswax/

Fügen Sie den folgenden DDL-Code in den Abfragebereich ein:

Klicken Ausführen.

Hive sollte die Tabelle in wenigen Sekunden erstellen und der Bildschirm sieht so aus:

Konfigurieren eines Hive-Streaming-Ziels

Hive ist bereit für unsere Ausgabedatensätze. Konfigurieren wir das Hive-Streaming-Ziel:

Klicken Sie im Pipeline-Canvas auf das Hadoop FS Ziel und klicken Sie dann auf Löschen Symbol.

Füge hinzu ein Bienenstock-Streaming Ziel auf den Canvas und verbinden Sie den JavaScript Evaluator damit.

Klicken Sie im Eigenschaftenfenster auf das Allgemeines Tab. Konfigurieren Sie die folgenden Eigenschaften. Verwenden Sie die Standardeinstellungen für nicht aufgeführte Eigenschaften:

  1. Drücke den Bienenstock Tab. Konfigurieren Sie die folgenden Eigenschaften. Verwenden Sie die Standardeinstellungen für nicht aufgeführte Eigenschaften:

Führen Sie die Pipeline aus und senden Sie Datensätze an Hive

Stoppen Sie die Pipeline, wenn sie ausgeführt wird, klicken Sie auf das Mehr Symbol über dem Pipeline-Canvas und klicken Sie dann auf Ursprung zurücksetzen. Sie werden aufgefordert, zu bestätigen, dass Sie den Ursprung wirklich zurücksetzen möchten, also klicken Sie auf OK.

Klicken Sie nun auf die Lauf Symbol. Auch hier verarbeitet die Pipeline die Ursprungsdaten erneut und nach etwa ein paar Stunden sollten Sie sehen, dass alle 206.560 Datensätze erfolgreich und ohne Fehler verarbeitet wurden:

Na und Ist Das größte Grundstück in der Stadt San Francisco?

Jetzt können wir eine Abfrage in Hive ausführen! Holen wir uns die zehn größten Lose. Fügen Sie die folgende Abfrage in den Hive-Abfragebereich ein und klicken Sie auf Ausführen:

Nach ein paar Minuten sollten Sie dieses Ergebnis sehen:

Hier die Ergebnisse in besser lesbarer Form:

mapblklot blklot block_num lot_num von_st to_st Straße st_typ ungerade gerade Bereich
1300001 1300001 1300 1 2901 2901 LYON ST Ö 6104089
1700001 1700001 1700 1 1101 1199 09TH AVE Ö 4149480
4591A079 4591A079 4591A 79 520 520 SPEER AVE E 2893706
7283004 7283004 7283 4 991 991 MERCED-SEE BLVD Ö 2480004
1939001 1939001 1939 1 300 600 KALIFORNIEN AVE E 1684637
6220002 6220002 6220 2 61 61 JOHN F. SHELLEY DR Ö 1351541
4502A002 4502A002 4502A 2 3305 3305 03RD ST Ö 696521
900003 900003 900 3 3751 3751 LAGUNA ST Ö 657407
1939002 1939002 1939 2 0 0 UNBEKANNT NULL E 620400
7284001 7284001 7284 1 599 599 HORIZONT BLVD Ö 462228

Also, bei 6.104.089 m 2 oder 2,36 Quadratmeilen, 2901 Lyon Straße ist das größte Grundstück in San Francisco. Was könnte an dieser Adresse stehen? Lass uns mal sehen:

Es ist das Presidio! Für die Zwecke der Stadt San Francisco ist das Presidio ein riesiges Grundstück.

In diesem Tutorial haben Sie gelernt:

So nehmen Sie JSON-Daten über den Verzeichnisursprung auf

So implementieren Sie eine nicht-triviale Berechnung in einem JavaScript-Evaluator

So verwenden Sie das Hadoop FS-Ziel für die schnelle Entwicklung Ihrer Pipeline

So verwerfen Sie Datensätze, die die gewünschten Kriterien nicht erfüllen

So schreiben Sie Datensätze in Apache Hive

Und schließlich haben Sie erfahren, dass das Presidio das größte Stadtgrundstück in San Francisco ist!


Vorbereitete Geometrien¶

Um eine vorbereitete Geometrie zu erhalten, greifen Sie auf die Eigenschaft GEOSGeometry.prepared zu. Sobald Sie über eine PreparedGeometry-Instanz verfügen, können die unten aufgeführten räumlichen Prädikatmethoden mit anderen GEOSGeometry-Objekten verwendet werden. Eine Operation mit einer vorbereiteten Geometrie kann um Größenordnungen schneller sein – je komplexer die vorbereitete Geometrie, desto schneller wird die Operation. Weitere Informationen finden Sie auf der GEOS-Wiki-Seite zu vorbereiteten Geometrien.

VorbereiteteGeometrie ¶

Alle Methoden von PreparedGeometry nehmen ein anderes Argument an, das eine GEOSGeometry-Instanz sein muss.

enthält ( andere ) ¶ enthält_properly ( andere ) ¶ deckt ( andere ) ¶ Kreuze ( andere ) ¶ disjunkt ( andere ) ¶ schneidet ( andere ) ¶ überlappt ( andere ) ¶ berührt ( andere ) ¶ innerhalb ( andere ) ¶


Geometriefabriken¶

aus Datei(file_h
Parameter:file_h (ein Python Datei Objekt oder ein Zeichenfolgenpfad zur Datei) -- Eingabedatei, die räumliche Daten enthält contains
Rückgabetyp:ein GEOSGeometrie entsprechend den Geodaten in der Datei
  • Schnur (string) -- String, der räumliche Daten enthält
  • srid (Ganzzahl) -- Raumbezugskennung

ein GEOSGeometrie entsprechend den räumlichen Daten in der Zeichenfolge


Treiber¶

Basisklasse für alle Fahrer.

Parameter:rd ( RequestDataset ) – Das Eingabeanforderungs-Dataset-Objekt.
Klasse ocgis.Treiber.base. AbstractTabellarDriver ( rd ) [Quelle] ¶

Basisklasse für tabellarische Treiber (kein optimaler Zugriff auf einzelne Variablen).

Klasse ocgis.Treiber.base. AbstractUnstructuredDriver [Quelle] ¶

Klasse ocgis.driver.nc. DriverNetcdf ( rd ) [Quelle] ¶

Treiber für netCDF-Dateien, der jeden Hinweis auf Metadaten vermeidet.

Treiber-Schlüsselwortargumente ( driver_kwargs ) zum Anforderungs-Dataset:

Metadaten-fähiger netCDF-Treiber, der standardmäßig CF-Grid interpretiert.

Klasse ocgis.driver.nc_scrip. TreiberNetcdfSCRIP ( rd ) [Quelle] ¶

Treiber für das strukturierte und unstrukturierte Rasterformat SCRIP NetCDF. SCRIP ist ein Legacy-Format, das der wichtigste Vorläufer der NetCDF-CF-Konvention ist. Standardmäßig werden SCRIP-Raster als unstrukturierte Daten behandelt, wodurch ein unstrukturiertes Raster erstellt wird.

Klasse ocgis.driver.nc_ugrid. TreiberNetcdfUGRID ( rd ) [Quelle] ¶

Treiber für NetCDF-Daten nach UGRID-Konvention. Es interpretiert auch die CF-Konvention für Achsen, die nicht von UGRID überlastet sind.

Klasse ocgis.driver.vector. TreiberVektor ( rd ) [Quelle] ¶

Treiber für Vektor-GIS-Daten.

Treiber-Schlüsselwortargumente ( driver_kwargs ) zum Anforderungs-Dataset:

Treiber für durch Kommas getrennte Wertedateien.


HGeometry enthält auch eine Datenstruktur/einen Datentyp für planare Graphen. Insbesondere hat es eine EdgeOracle-Datenstruktur, die in (O(n))-Zeit eingebaut werden kann, um zu testen, ob der Graph in konstanter Zeit eine Kante enthält. Alle Geometrietypen werden durch einen numerischen Typ r parametrisiert. Es ist bekannt, dass Gleitkommaarithmetik und geometrische Algorithmen nicht gut zusammenpassen, d.h. aufgrund von Gleitkommafehlern kann es zu völlig falschen Ergebnissen kommen. Daher rate ich dringend davon ab, Double oder Float für diese Typen zu verwenden. In einigen Algorithmen ist es ausreichend, wenn der Typ r Fractional ist. Daher können Sie einen genauen Zahlentyp wie Rational verwenden.

PolyTri ist ein Polygontriangulator für einfache Polygone basierend auf dem Seidel-Algorithmus [1]. PolyTri wird unter der Unlizenz veröffentlicht.


Eingabeargumente

X — Erste Koordinate Vektor | Matrix

Erste Koordinate, angegeben als Vektor oder Matrix. Matrixeingänge werden nur für kartesische Achsen unterstützt.

Die Interpretation der ersten Koordinate hängt vom Achsentyp ab. Für kartesische Achsen ist die erste Koordinate x-Achsenposition in Dateneinheiten.

Wenn x und y beide Vektoren mit der gleichen Länge sind, zeichnet line eine einzelne Linie.

Wenn x und y Matrizen mit der gleichen Größe sind, dann zeichnet line mehrere Linien. Die Funktion zeichnet Spalten von y gegen x auf.

Wenn einer von x oder y ein Vektor und der andere eine Matrix ist, dann zeichnet line mehrere Linien. Die Länge des Vektors muss einer der Matrixdimensionen entsprechen:

Wenn die Vektorlänge gleich der Anzahl der Matrixzeilen ist, wird jede Matrixspalte gegen den Vektor aufgetragen.

Wenn die Vektorlänge gleich der Anzahl der Matrixspalten ist, dann zeichnet die Linie jede Matrixzeile gegen den Vektor.

Wenn die Matrix quadratisch ist, zeichnet die Linie jede Spalte gegen den Vektor.

Bei Polarachsen ist die erste Koordinate der Polarwinkel θ im Bogenmaß. Bei geografischen Achsen ist die erste Koordinate der Breitengrad in Grad. Um Linien in diesen Achsentypen zu zeichnen, müssen x und y dieselbe Größe haben.

Beispiel: x = Zeilenabstand(0,10,25)

Datentypen: einzeln | doppelt | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | kategorisch | Datum/Uhrzeit | Dauer

Y — Zweite Koordinate Vektor | Matrix

Zweite Koordinate, angegeben als Vektor oder Matrix. Matrixeingänge werden nur für kartesische Achsen unterstützt.

Die Interpretation der zweiten Koordinate hängt vom Achsentyp ab. Für kartesische Achsen ist die zweite Koordinate ja-Achsenposition in Dateneinheiten.

Wenn x und y beide Vektoren mit der gleichen Länge sind, zeichnet line eine einzelne Linie.

Wenn x und y Matrizen mit der gleichen Größe sind, dann zeichnet line mehrere Linien. Die Funktion zeichnet Spalten von y gegen x auf.

Wenn einer von x oder y ein Vektor und der andere eine Matrix ist, dann zeichnet line mehrere Linien. Die Länge des Vektors muss einer der Matrixdimensionen entsprechen:

Wenn die Vektorlänge gleich der Anzahl der Matrixzeilen ist, wird jede Matrixspalte gegen den Vektor aufgetragen.

Wenn die Vektorlänge gleich der Anzahl der Matrixspalten ist, dann zeichnet die Linie jede Matrixzeile gegen den Vektor.

Wenn die Matrix quadratisch ist, zeichnet die Linie jede Spalte gegen den Vektor.

Bei Polarachsen ist die zweite Koordinate der Radius in Dateneinheiten. Bei geografischen Achsen ist die zweite Koordinate der Längengrad in Grad. Um Linien in diesen Achsentypen zu zeichnen, müssen x und y dieselbe Größe haben.

Beispiel: y = sin(x)

Datentypen: einzeln | doppelt | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | kategorisch | Datum/Uhrzeit | Dauer

Z — Dritte Koordinate Vektor | Matrix

Dritte Koordinate, angegeben als Vektor oder Matrix. Matrixeingänge werden nur für kartesische Achsen unterstützt.

Die Interpretation der dritten Koordinate hängt vom Achsentyp ab. Für kartesische Achsen ist die dritte Koordinate z-Achsenposition in Dateneinheiten.

Wenn x, y und z alle Vektoren mit der gleichen Länge sind, zeichnet line eine einzelne 3D-Linie.

Wenn x , y und z alle Matrizen mit der gleichen Größe sind, dann zeichnet line mehrere 3D-Linien unter Verwendung der Matrixspalten.

Wenn einer oder zwei von x , y und z ein Vektor sind und die anderen Matrizen derselben Größe sind, dann zeichnet line mehrere 3D-Linien. Die Länge des Vektors muss einer der Matrixdimensionen entsprechen.

Bei polaren und geografischen Achsen beeinflusst die dritte Koordinate die Schichtung der 2D-Linien auf den Achsen. Um die dritte Koordinate in diesen Achsentypen zu verwenden, müssen x , y und z dieselbe Größe haben.

Beispiel: z = sin(x) + cos(y)

Datentypen: einzeln | doppelt | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | kategorisch | Datum/Uhrzeit | Dauer

Axt — Zielachsen Achsenobjekt | PolarAxes-Objekt | GeographicAxes-Objekt

Zielachsen, angegeben als Axes-Objekt, PolarAxes-Objekt oder GeographicAxes-Objekt. Wenn Sie die Achsen nicht angeben, zeichnet die Linienfunktion in den aktuellen Achsen.

Name-Wert-Paarargumente

Geben Sie optionale durch Kommas getrennte Paare von Name,Wert-Argumenten an. Name ist der Argumentname und Value ist der entsprechende Wert. Name muss in Anführungszeichen stehen. Sie können mehrere Namens- und Wertpaarargumente in beliebiger Reihenfolge als Name1,Wert1 angeben. NameN,WertN .

Beispiel: line(x,y,'Color','red','LineWidth',3) erzeugt eine rote Linie mit einer Breite von 3 Punkten.

Die hier aufgeführten Eigenschaften sind nur eine Teilmenge. Eine vollständige Liste finden Sie unter Linieneigenschaften .

'Farbe' — Linienfarbe [0 0,4470 0,7410] (Standard) | RGB-Triplett | hexadezimaler Farbcode | 'r' | 'g' | 'b' | .

Linienfarbe, angegeben als RGB-Triplet, hexadezimaler Farbcode, Farbname oder Kurzname.

Geben Sie für eine benutzerdefinierte Farbe ein RGB-Triplett oder einen hexadezimalen Farbcode an.

Ein RGB-Triplett ist ein Zeilenvektor mit drei Elementen, dessen Elemente die Intensitäten der roten, grünen und blauen Komponenten der Farbe angeben. Die Intensitäten müssen im Bereich [0,1] liegen, zB [0,4 0,6 0,7] .

Ein hexadezimaler Farbcode ist ein Zeichenvektor oder ein String-Skalar, der mit einem Rautesymbol ( # ) beginnt, gefolgt von drei oder sechs hexadezimalen Ziffern, die von 0 bis F reichen können. Bei den Werten wird die Groß-/Kleinschreibung nicht beachtet. Somit sind die Farbcodes '#FF8800' , '#ff8800' , '#F80' und '#f80' gleichwertig.

Alternativ können Sie einige gängige Farben nach Namen angeben. Diese Tabelle listet die benannten Farboptionen, die entsprechenden RGB-Tripletts und hexadezimalen Farbcodes auf.


Schau das Video: Geospatial data analysis in Fiona (Oktober 2021).