Mein vorheriger Blogbeitrag, \/blogs\/tilting\/2017\/06\/10\/a-case-of-missing-prefixes-esris-geometries?sr=search&searchId=c6def5e0-70d7-4799-991e-cfbe7cafee76&searchIndex=0<\/A>, war ungeplant. Ich begann, diesen Blogbeitrag und den nächsten zu schreiben, und mir wurde klar, dass die Hintergrundinformationen, die ich einfügen wollte, in keinen der beiden wirklich passten, also schrieb ich die Hintergrundinformationen separat.<\/EM><\/P><\/P>Im Laufe der Jahre habe ich festgestellt, dass die ArcPy Geometry-Konstruktoren eigenwillig sind, besonders bei Rand- oder Nischenfällen wie leeren Geometrien. Als engagierter Nutzer, der es für wichtig hält, Entwicklern Feedback zu geben, habe ich im Laufe der Zeit mehrere Fehlerberichte und Verbesserungsvorschläge bezüglich der Geometry-Konstruktoren eingereicht. Auf Anhieb kann ich nicht sagen, wie viele davon umgesetzt wurden, möglicherweise nur einer, aber es war nicht einer ganz oben auf meiner Wunschliste.<\/P><\/P>Vor ein paar Jahren habe ich die Unterstützung leerer Geometrien mit ArcPy Geometry Class Constructors<\/A> Idee eingereicht. Da so wenige Nutzer mit leeren Geometrien arbeiten, überrascht mich die erstaunliche Anzahl von 2 Stimmen bisher nicht. <\/EM>WieDavid Wynne<\/A> von Esri in den Kommentaren anmerkt, werden leere Geometrien tatsächlich von den ArcPy Geometry-Konstruktoren unterstützt, nur die Syntax ist nicht dokumentiert. Da leere Geometrien von den Konstruktoren unterstützt werden, denke ich, dass meine ursprüngliche Idee unter Pythonic ArcPy Geometries<\/A>zusammengeführt werden sollte, da es mir eigentlich um eine intuitivere und idiomatischere Art geht, leere Geometrien mit ArcPy Geometry-Konstruktoren zu erstellen. Ich würde meine beiden Ideen zusammenführen, wenn ich könnte, aber das kann ich nicht selbst und möchte die Idee nicht einfach löschen.<\/EM><\/P><\/P>Am Beispiel der ArcPy Polygon-Klasse schauen wir uns verschiedene Möglichkeiten an, wie man versuchen könnte, eine leere Geometrie mit den ArcPy Geometry-Konstruktoren zu erstellen:<\/P><SPAN class="operator token">>><\/SPAN><SPAN class="operator token">><\/SPAN> ctor_stmts <SPAN class="operator token">=<\/SPAN> <SPAN class="punctuation token">(<\/SPAN> <SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN> <SPAN class="string token">''<\/SPAN><SPAN class="punctuation token">,<\/SPAN> <SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN> <SPAN class="string token">'None'<\/SPAN><SPAN class="punctuation token">,<\/SPAN> <SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN> <SPAN class="string token">'arcpy.Array()'<\/SPAN><SPAN class="punctuation token">,<\/SPAN> <SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN> <SPAN class="string token">'arcpy.Array(None)'<\/SPAN><SPAN class="punctuation token">,<\/SPAN> <SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN> <SPAN class="string token">'arcpy.Point()'<\/SPAN><SPAN class="punctuation token">,<\/SPAN> <SPAN class="punctuation token">.<\/span><span class="punctuation token">.<span class="punctuation token"></span></span> <span class="string token">'arcpy.Array([])'</span>, <span class="punctuation token">.</span><span class="punctuation token">.</span><span class="punctuation token">.</span> <span class="string token">'arcpy.Array([None])'</span>, <span class="punctuation token">.</span><span class="punctuation token">.</span><span class="punctuation token">.</span> <span class="string token">'arcpy.Array(arcpy.Array())'</span>, <span class="punctuation token">.</span><span class="punctuation token">.</span><span class="punctuation token">.</span> <span class="string token">'arcpy.Array(arcpy.Array(None))'</span>, <span class="punctuation token">.</span><span class="punctuation token">.</span><span class="punctuation token">.</span> <span class="string token">'arcpy.Array(arcpy.Array([]))'</span> <span class="punctuation token">.</span><span class="punctuation token">.</span><span class="punctuation token">.</span> ) <span class="punctuation token">.</span><span class="punctuation token">.</span><span class="punctuation token"></span> <span class="operator token">>></span><span class="operator token">></span> <span class="keyword token">for</span> i<span class="punctuation token">,</span> stmt <span class="keyword token">in</span> enumerate<span class="punctuation token">(</span>ctor_stmts<span class="punctuation token">)</span><span class="punctuation token">:</span> <span class="punctuation token"></span>stmt <span class="operator token">=</span> <span class="string token">"arcpy.Polygon({})"</span>.format(stmt) <span class="punctuation token"></span>try: <span class=punctuationtoken print("{:0>2}. {:<46}: {}".format(i+1, stmt, eval(stmt).WKT)) except Exception as err: print("{:0>2}. {:<46}: {}....".format(i+1, stmt, err.message[:35])) 01. arcpy.Polygon() : Object: CreateObject kann nicht erstellen .... 02. arcpy.Polygon(None) : Object: CreateObject kann nicht erstellen .... 03. arcpy.Polygon(arcpy.Array()) : <SPAN class="punctuation token">:<\/SPAN> Objekt<SPAN class="punctuation token">:<\/SPAN> CreateObject kann nicht erstellen <SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN> <SPAN class="number token">04<\/SPAN><SPAN class="punctuation token">.<\/SPAN> arcpy<SPAN class="punctuation token">.<\/SPAN>Polygon<SPAN class="punctuation token">(<\/SPAN>arcpy<SPAN class="punctuation token">.<\/SPAN>Array<SPAN class="punctuation token">(<\/SPAN>None<SPAN class="punctuation token">)<\/SPAN><SPAN class="punctuation token">)<\/SPAN> <SPAN class="punctuation token">:<\/SPAN> MULTIPOLYGON EMPTY <SPAN class="number token">05<\/SPAN><SPAN class="punctuation token">.<\/SPAN> arcpy<SPAN class="punctuation token">.<\/SPAN>Polygon<SPAN class="punctuation token">(<\/SPAN>arcpy<SPAN class="punctuation token">.<\/SPAN>Point<SPAN class="punctuation token">(<\/SPAN><SPAN class="punctuation token">)<\/SPAN><SPAN class="punctuation token">)<\/SPAN> <SPAN class="punctuation token">:<\/SPAN> MULTIPOLYGON EMPTY <SPAN class="number token">06<\/SPAN><SPAN class="punctuation token">.<\/SPAN> arcpy<SPAN class="punctuation token">.<\/SPAN>Polygon<SPAN class="punctuation token">(<\/Span>arcpy<Span class="punctuation token">.<\/span>Array<Span class="punctuation token">(<\/span><Span class="punctuation token">[<\/span><Span class="punctuation token">]<\/span><Span class="punctuation token">)<\/span><Span class="punctuation token">)<\/span> <Span class="punctuation token">:<\/span> Objekt<Span class="punctuation token">:<\/span> CreateObject kann nicht erstellen <Span class="punctuation token">.<\/span><Span class="punctuation token">.<\/span><Span class="punctuation token">.<\/span><Span class="punctuation token">.<\/span> <Span class="number token">07<\/span><Span class="punctuation token">.<\/span> arcpy<Span class="punctuation token">.<\/span>Polygon<Span class="punctuation token">(<\/span>arcpy<Span class="punctuation token">.<\/span>Array<Span class="punctuation token">(<\/span><Span class="punctuation token">[None]<\/span><Span class="punctuation token">)<\/span><Span class="punctuation token">)<\/span> <Span class="punctuation token">:<\/span> MULTIPOLYGON EMPTY <Span class="number token">08<\/span><Span class="punctuation token">.<\/span> arcpy<Span class="punctuation token">.<\/span>Polygon<Span class="punctuation token">(<\/span>arcpy<Span class="punctuation token">.<\/span>Array<Span class="punctuation token">(<\/span>arcpy<Span class="punctuation token">.<\/span>Array<Span class="punctuation token">(<\/span><Span class="punctuation token">)<\/span><Span class="punctuation token">)<\/span><Span class="punctuation token">)<\/span> <Span class="punctuation token">:<\/span> MULTIPOLYGON EMPTY <Span class="number token">09<\/span><Span class="punctuation token">.<\/span> arcpy<Span class="punctuation token">.<\/span>Polygon<Span class="punctuation token">(<\/span>arcpy<Span class="punctuation token">.<\.\/>Array<spanclass=\"punc-token\"><(</spancarpy<spanclass=\"punc-token\"><.></spancarpy<spanclass=\"punc-token\"><Array<spanclass=\"punc-token\"><(</spancarpy<spanclass=\"punc-token\"><.></spancarpy<spanclass=\"punc-token\"><Array<spanclass=\"punc-token\"><(</spannarpy<spanclass=\"punc-token\"><None<spanclass=\"punc-token\"><)></spannarpy<spanclass=\"punc-token\"><)></spannarpy<spanclass=\"punc-token\"><)></spannarpy <Spancarpyclass=\"punc-token\"><:></spancarpy MULTIPOLYGON EMPTY <spanclass=\"numbertoken\"><10</spancarpy<punc-token>.></spancarpy Polygon(arcpy.Array(arcpy.Array([])))&nbpsp;<:MULTIPOLYGON EMPTY >> <SPANNUMBERROWS>< </SPANNUMBERROWS>
<\/P>
Im Laufe der Jahre habe ich festgestellt, dass die ArcPy Geometry-Konstruktoren eigenwillig sind, besonders bei Rand- oder Nischenfällen wie leeren Geometrien. Als engagierter Nutzer, der es für wichtig hält, Entwicklern Feedback zu geben, habe ich im Laufe der Zeit mehrere Fehlerberichte und Verbesserungsvorschläge bezüglich der Geometry-Konstruktoren eingereicht. Auf Anhieb kann ich nicht sagen, wie viele davon umgesetzt wurden, möglicherweise nur einer, aber es war nicht einer ganz oben auf meiner Wunschliste.<\/P>
Vor ein paar Jahren habe ich die
<SPAN class="operator token">>><\/SPAN><SPAN class="operator token">><\/SPAN> ctor_stmts <SPAN class="operator token">=<\/SPAN> <SPAN class="punctuation token">(<\/SPAN> <SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN> <SPAN class="string token">''<\/SPAN><SPAN class="punctuation token">,<\/SPAN> <SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN> <SPAN class="string token">'None'<\/SPAN><SPAN class="punctuation token">,<\/SPAN> <SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN> <SPAN class="string token">'arcpy.Array()'<\/SPAN><SPAN class="punctuation token">,<\/SPAN> <SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN> <SPAN class="string token">'arcpy.Array(None)'<\/SPAN><SPAN class="punctuation token">,<\/SPAN> <SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN> <SPAN class="string token">'arcpy.Point()'<\/SPAN><SPAN class="punctuation token">,<\/SPAN> <SPAN class="punctuation token">.<\/span><span class="punctuation token">.<span class="punctuation token"></span></span> <span class="string token">'arcpy.Array([])'</span>, <span class="punctuation token">.</span><span class="punctuation token">.</span><span class="punctuation token">.</span> <span class="string token">'arcpy.Array([None])'</span>, <span class="punctuation token">.</span><span class="punctuation token">.</span><span class="punctuation token">.</span> <span class="string token">'arcpy.Array(arcpy.Array())'</span>, <span class="punctuation token">.</span><span class="punctuation token">.</span><span class="punctuation token">.</span> <span class="string token">'arcpy.Array(arcpy.Array(None))'</span>, <span class="punctuation token">.</span><span class="punctuation token">.</span><span class="punctuation token">.</span> <span class="string token">'arcpy.Array(arcpy.Array([]))'</span> <span class="punctuation token">.</span><span class="punctuation token">.</span><span class="punctuation token">.</span> ) <span class="punctuation token">.</span><span class="punctuation token">.</span><span class="punctuation token"></span> <span class="operator token">>></span><span class="operator token">></span> <span class="keyword token">for</span> i<span class="punctuation token">,</span> stmt <span class="keyword token">in</span> enumerate<span class="punctuation token">(</span>ctor_stmts<span class="punctuation token">)</span><span class="punctuation token">:</span> <span class="punctuation token"></span>stmt <span class="operator token">=</span> <span class="string token">"arcpy.Polygon({})"</span>.format(stmt) <span class="punctuation token"></span>try: <span class=punctuationtoken print("{:0>2}. {:<46}: {}".format(i+1, stmt, eval(stmt).WKT)) except Exception as err: print("{:0>2}. {:<46}: {}....".format(i+1, stmt, err.message[:35])) 01. arcpy.Polygon() : Object: CreateObject kann nicht erstellen .... 02. arcpy.Polygon(None) : Object: CreateObject kann nicht erstellen .... 03. arcpy.Polygon(arcpy.Array()) : <SPAN class="punctuation token">:<\/SPAN> Objekt<SPAN class="punctuation token">:<\/SPAN> CreateObject kann nicht erstellen <SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN> <SPAN class="number token">04<\/SPAN><SPAN class="punctuation token">.<\/SPAN> arcpy<SPAN class="punctuation token">.<\/SPAN>Polygon<SPAN class="punctuation token">(<\/SPAN>arcpy<SPAN class="punctuation token">.<\/SPAN>Array<SPAN class="punctuation token">(<\/SPAN>None<SPAN class="punctuation token">)<\/SPAN><SPAN class="punctuation token">)<\/SPAN> <SPAN class="punctuation token">:<\/SPAN> MULTIPOLYGON EMPTY <SPAN class="number token">05<\/SPAN><SPAN class="punctuation token">.<\/SPAN> arcpy<SPAN class="punctuation token">.<\/SPAN>Polygon<SPAN class="punctuation token">(<\/SPAN>arcpy<SPAN class="punctuation token">.<\/SPAN>Point<SPAN class="punctuation token">(<\/SPAN><SPAN class="punctuation token">)<\/SPAN><SPAN class="punctuation token">)<\/SPAN> <SPAN class="punctuation token">:<\/SPAN> MULTIPOLYGON EMPTY <SPAN class="number token">06<\/SPAN><SPAN class="punctuation token">.<\/SPAN> arcpy<SPAN class="punctuation token">.<\/SPAN>Polygon<SPAN class="punctuation token">(<\/Span>arcpy<Span class="punctuation token">.<\/span>Array<Span class="punctuation token">(<\/span><Span class="punctuation token">[<\/span><Span class="punctuation token">]<\/span><Span class="punctuation token">)<\/span><Span class="punctuation token">)<\/span> <Span class="punctuation token">:<\/span> Objekt<Span class="punctuation token">:<\/span> CreateObject kann nicht erstellen <Span class="punctuation token">.<\/span><Span class="punctuation token">.<\/span><Span class="punctuation token">.<\/span><Span class="punctuation token">.<\/span> <Span class="number token">07<\/span><Span class="punctuation token">.<\/span> arcpy<Span class="punctuation token">.<\/span>Polygon<Span class="punctuation token">(<\/span>arcpy<Span class="punctuation token">.<\/span>Array<Span class="punctuation token">(<\/span><Span class="punctuation token">[None]<\/span><Span class="punctuation token">)<\/span><Span class="punctuation token">)<\/span> <Span class="punctuation token">:<\/span> MULTIPOLYGON EMPTY <Span class="number token">08<\/span><Span class="punctuation token">.<\/span> arcpy<Span class="punctuation token">.<\/span>Polygon<Span class="punctuation token">(<\/span>arcpy<Span class="punctuation token">.<\/span>Array<Span class="punctuation token">(<\/span>arcpy<Span class="punctuation token">.<\/span>Array<Span class="punctuation token">(<\/span><Span class="punctuation token">)<\/span><Span class="punctuation token">)<\/span><Span class="punctuation token">)<\/span> <Span class="punctuation token">:<\/span> MULTIPOLYGON EMPTY <Span class="number token">09<\/span><Span class="punctuation token">.<\/span> arcpy<Span class="punctuation token">.<\/span>Polygon<Span class="punctuation token">(<\/span>arcpy<Span class="punctuation token">.<\.\/>Array<spanclass=\"punc-token\"><(</spancarpy<spanclass=\"punc-token\"><.></spancarpy<spanclass=\"punc-token\"><Array<spanclass=\"punc-token\"><(</spancarpy<spanclass=\"punc-token\"><.></spancarpy<spanclass=\"punc-token\"><Array<spanclass=\"punc-token\"><(</spannarpy<spanclass=\"punc-token\"><None<spanclass=\"punc-token\"><)></spannarpy<spanclass=\"punc-token\"><)></spannarpy<spanclass=\"punc-token\"><)></spannarpy <Spancarpyclass=\"punc-token\"><:></spancarpy MULTIPOLYGON EMPTY <spanclass=\"numbertoken\"><10</spancarpy<punc-token>.></spancarpy Polygon(arcpy.Array(arcpy.Array([])))&nbpsp;<:MULTIPOLYGON EMPTY >> <SPANNUMBERROWS>< </SPANNUMBERROWS>
Bevor wir Gedanken oder Kommentare teilen, denke ich, es ist wichtig, uns genau an die ArcPy Polygon 22Dokumentation22 erinnert zu halten:
Polygon (Eingaben, {räumliche Referenz}, {hat_z}, {hat_m})
Die Koordinaten, die zur Erstellung des Objekts verwendet werden. Der Datentyp kann entweder ein Point-Objekt oder ein Array-Objekt sein.
Einige Beobachtungen vor den Kommentaren:
repr(arcpy.Array()) == repr(arcpy.Array([]))
__repr__
arcpy.Array()
<Array []><\/SPAN>. Leere ArcPy-Arrays sind gültige Objekte, und die Dokumentation besagt, dass ArcPy-Array-Objekte an den ArcPy-Polygon-Konstruktor übergeben werden können.<\/EM><\/LI><\/UL><\/LI>Beispiele 04 & 07:Ähnlich wie bei den Beispielen 03 & 06 sind diese beiden Beispiele gleich, z.B., repr(arcpy.Array(None)) == repr(arcpy.Array([None])).<\/SPAN><\/LI>Beispiel 04 war die vorgeschlagene Methode von David Wynne<\/A> in Support Empty Geometries with ArcPy Geometry Class Constructors<\/A>.<\/LI><\/UL><\/LI>Beispiel 05:Die Dokumentation besagt, dass ein Point-Objekt als Eingabe verwendet werden kann.<\/LI>Der Aufruf von arcpy.Point()<\/SPAN> erzeugt keinen leeren Punkt, wie der Aufruf von arcpy.Array()<\/SPAN>, sondern erzeugt einen Punkt bei 0, 0: <Point (0.0, 0.0, #, #)><\/SPAN>. Obwohl oben nicht demonstriert, zeigen weitere Tests, dass jeder Punkt funktioniert, z.B., arcpy.Polygon(arcpy.Point(10000.5, -4500.3))<\/SPAN> erzeugt ebenfalls ein leeres Multi-Polygon.<\/LI><\/UL><\/LI>Beispiele 08 & 10:Ähnlich wie bei den Beispielen 03 & 06 und den Beispielen 04 & 07 sind diese beiden Beispiele gleich.<\/LI>Der Aufruf von arcpy.Array(arcpy.Array())<\/SPAN> erzeugt ein leeres ArcPy-Array, das in einem ArcPy-Array verschachtelt ist. Die ArcPy Array<\/A>-Dokumentation besagt, dass ein ArcPy Array eine gültige Eingabe für den ArcPy Array-Konstruktor ist.<\/LI><\/UL><\/LI><\/UL><\/P>Es gibt einige Merkwürdigkeiten bei den Ergebnissen des obigen Polygon-Konstruktor-Tests. Ich denke, die Beispiele 03 & 06 werden Benutzer am ehesten verwirren. Die Dokumentation besagt klar, dass ArcPy Array-Objekte gültige Eingaben sind und leere ArcPy Arrays gültige Objekte sind. Warum erzeugt das Übergeben eines leeren ArcPy Arrays an den ArcPy Polygon-Konstruktor dann einen Fehler? Obwohl die Beispiele 04 & 07 funktionieren, erscheint es merkwürdig, dass ein ArcPy Array mit einem Python None<\/SPAN> inhaltlich irgendwie anders ist als ein leeres ArcPy Array beim Erstellen einer leeren Geometrie.<\/P><\/P>Beispiel 05 ist eine Überraschung und macht für mich am wenigsten Sinn. Die Dokumentation besagt klar, dass ein Point-Objekt eine gültige Eingabe für den ArcPy Polygon-Konstruktor ist. Aber wie sieht ein Polygon mit nur einem Punkt aus? Ein leeres Multi-Polygon laut Esri. Was die Sache für mich noch seltsamer macht, ist die Tatsache, dass es keinen leeren ArcPy Point gibt und dass jeder an den ArcPy Polygon-Konstruktor übergebene ArcPy Point eine leere Geometrie erzeugt.<\/P><\/P>Die Verwendung von dis 14 Disassembler for Python bytecode<\/A>, um sich den Bytecode für jede der obigen Konstruktor-Anweisungen anzusehen, ließ vermuten, dass Beispiel 05 die leistungsstärkste Konstruktor-Anweisung sein würde. Das Ausführen von timeit 14 Measure execution time of small code snippets<\/A> auf den Konstruktor-Anweisungen zeigte, dass Beispiel 05 am schnellsten leere Geometrien erzeugte – nicht viel schneller, aber dennoch am schnellsten. Das trägt nur zum Rätsel des Einzelpunktpolygons bei.<\/EM><\/P><\/P>Die Beispiele 08 & 10 werden in einem späteren Blogbeitrag behandelt, daher werde ich hier nicht weiter darauf eingehen.<\/P><\/P>Wie passen also die Ergebnisse dieses Tests zur Idee\u200c / Anfrage\u200c / Bitte um mehr Pythonic ArcPy Geometries<\/A>? Für mich ist die Antwort, dass Beispiel 01 der primäre Weg sein sollte, um leere ArcPy-Geometrien zu erstellen. Das heißt: Das Übergeben keiner Argumente an einen ArcPy Geometry-Konstruktor sollte den entsprechenden leeren Geometrietyp erzeugen. Für Objekte, die das Konzept der Leere unterstützen, ist es in Python ziemlich üblich, dass das Übergeben keiner Argumente an den Konstruktor ein leeres Objekt erzeugt. Schauen wir uns einige Beispiele an:<\/P>>><\/>><\/> # Häufig verwendete eingebaute Datenstrukturen<\/>\n>><\/>><\/> list(<\/>)<\/>\n[<\/>]<\/>\n>><\/>><\/> set(<\/>)<\/>\nset(<\/>[<\/>]<\/>)<\/>\n>><\/>><\/> dict(<\/>)<\/>\n{<\/>}<\/>\n>><\/>><\/> str(<\/>)<\/>\n''<\/>\n>><\/>><\/> \n, 'arcpy.Array(arcpy.Array(None))', 'arcpy.Array(arcpy.Array([]))')>>> für geometry in geometry_classes:... für i, stmt in enumerate(ctor_stmts):... stmt = "arcpy.Geometry('{}',{})".format(geometry, stmt)... versuchen:... print("{:0>2}. {:<60}: {}".format(i+1, stmt, eval(stmt).WKT ) )... & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;außer Exception als err:... & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;print ("{:0>2}. {:<60}: {}...." .format(i+1, stmt, err.message[:20]))... print ("")... 01. arcpy.Geometry('point',) : Objekt: CreateObject....02. arcpy.Geometry('point',None) : Objekt: CreateObject....03. arcpy.Geometry('point',arcpy.Array()) : Objekt: CreateObject....04. arcpy.Geometry('point',arcpy.Array(None)) : Objekt: CreateObject....05. arcpy.Geometry('point',arcpy.Point()) : PUNKT (0 0)06. arcpy.Geometry('point',arcpy.Array([])) : Objekt: CreateObject....07. arcpy.Geometry('point',arcpy.Array([None])) : Objekt: CreateObject....08. arcpy.Geometry('point',arcpy.Array(arcpy token">.<\/SPAN>Array(<\/SPAN>)<\/SPAN>)<\/SPAN>)<\/SPAN> :<\/SPAN> Objekt:<\/SPAN> CreateObject.<\/SPAN>.<\/SPAN>.<\/SPAN>.<\/SPAN>09<\/SPAN>.<\/SPAN> arcpy.<\/SPAN>Geometry(<\/SPAN>'point'<\/SPAN>,<\/SPAN>arcpy.<\/SPAN>Array(<\/SPAN>arcpy.<\/SPAN>Array(<\/SPAN>None)<\/SPAN>)<\/SPAN>)<\/SPAN> :<\/SPAN> Objekt:<\/SPAN> CreateObject.<\/Span>.<\/span>.<\/span>.<\/span>10<\/Span>.<\/Span> arcpy.<\/Span>Geometry(<\/Span>'point'<\/Span>,<\/Span>arcpy.<\/Span>Array(<\/Span>arcpy.<\/Span>Array(<\/Span>[<\/Span>]<\/Span>)<\/Span>)<\/Span>)<\/Span> :<\/Span> Objekt:<\/Span> CreateObject.<\/span>.<\/span>.<\/span>.<\/span>01<\/span>.<\/span> arcpy.<\/span>Geometry(<\/span>'multipoint'<\/span>,<\/span>)<\/span> :<\/span> Objekt:<\/span> CreateObject.<\/span>.<\/span>.<\/span>.<\/span>02<\/span>.<\/span> arcpy.<\/span>Geometry(<\/span>'multipoint'<\/span>,None )<\/ pan> .<\/SPAN>.<\/SPAN>.<\/SPAN>02<\/SPAN>.<\/SPAN> arcpy.<\/SPAN>Geometry(<\/SPAN>'polyline'<\/SPAN>,<\/SPAN>None)<\/SPAN> :<\/SPAN> Objekt:<\/SPAN> CreateObject.<\/SPAN>.<\/SPAN>.<\/SPAN>.<\/SPAN>03<\/SPAN>.<\/SPAN> arcpy.<\/SPAN>Geometry(<\/SPAN>'polyline'<\/SPAN>,<\/SPAN>arcpy.<\/SPAN>Array(<\/SPAN>)<\/SPAN>)<\/SPAN> :<\/SPAN> Objekt:<\/SPAN> CreateObject.<\/SPAN>.<\/span>.<\/span>.<\/span> 04 < /Span > . < /Span > Arcpy . < /Span > Geometry ( < /Span > 'Polyline' < /Span > , < /Span > Arcpy . < /Span > Array ( < /Span > None ) < /Span > ) < /Span >& nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; < Span Class = "Punctuation Token" > : < / Span > MULTILINESTRING EMPTY< Span Class = "Number Token" > 05 < / Span >< Span Class = "Punctuation Token" > . < / Span > Arcpy < Span Class = "Punctuation Token" > . < / Span > Geometry < Span Class = "Punctuation Token" > ( < / Span >< Span Class = "String Token" > 'Polyline' < / Span >< Span Class = "Punctuation Token" > , < / Span > Arcpy < Span Class = "Punctuation Token" > . < / Span > Point < Span Class = "Punctuation Token" > ( < / Span >< Span Class = "Punctuation Token" > ) < / Span >< Span Class = "Punctuation Token" > ) < / Span >& nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; < Span Class = "Punctuation Token" > : < / Span > MULTILINESTRING EMPTY< Span Class = "Number Token" > 06 < / Span >< Span Class = "Punctuation Token" > . < / Span > Arcpy < Span Class = "Punctuation Token" > . < / Span > Geometry < Span Class = "Punctuation Token" > ( < / Span >< Span Class = "String Token" > 'Polyline' < / Span >< Span Class = "Punctuation Token" > , < / Span > Arcpy < Span Class = "Punctuation Token" > . < / Span > Array < Span Class = "Punctuation Token" > ( < / Span >< Span Class = "Punctuation Token" > [ < / Span >< Span Class = "Punctuation Token" > ] < / Span >< Span Class = "Punctuation Token" > ) < / Span >< Span Class = "Punctuation Token" > ) < / Span >& nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; < Span Class = "Punctuation Token" > : < / Span > Objekt< span class=
Es gibt einige Merkwürdigkeiten bei den Ergebnissen des obigen Polygon-Konstruktor-Tests. Ich denke, die Beispiele 03 & 06 werden Benutzer am ehesten verwirren. Die Dokumentation besagt klar, dass ArcPy Array-Objekte gültige Eingaben sind und leere ArcPy Arrays gültige Objekte sind. Warum erzeugt das Übergeben eines leeren ArcPy Arrays an den ArcPy Polygon-Konstruktor dann einen Fehler? Obwohl die Beispiele 04 & 07 funktionieren, erscheint es merkwürdig, dass ein ArcPy Array mit einem Python None<\/SPAN> inhaltlich irgendwie anders ist als ein leeres ArcPy Array beim Erstellen einer leeren Geometrie.<\/P><\/P>Beispiel 05 ist eine Überraschung und macht für mich am wenigsten Sinn. Die Dokumentation besagt klar, dass ein Point-Objekt eine gültige Eingabe für den ArcPy Polygon-Konstruktor ist. Aber wie sieht ein Polygon mit nur einem Punkt aus? Ein leeres Multi-Polygon laut Esri. Was die Sache für mich noch seltsamer macht, ist die Tatsache, dass es keinen leeren ArcPy Point gibt und dass jeder an den ArcPy Polygon-Konstruktor übergebene ArcPy Point eine leere Geometrie erzeugt.<\/P><\/P>Die Verwendung von
Die Beispiele 08 & 10 werden in einem späteren Blogbeitrag behandelt, daher werde ich hier nicht weiter darauf eingehen.<\/P>
Wie passen also die Ergebnisse dieses Tests zur Idee\u200c / Anfrage\u200c / Bitte um mehr
>><\/>><\/> # Häufig verwendete eingebaute Datenstrukturen<\/>\n>><\/>><\/> list(<\/>)<\/>\n[<\/>]<\/>\n>><\/>><\/> set(<\/>)<\/>\nset(<\/>[<\/>]<\/>)<\/>\n>><\/>><\/> dict(<\/>)<\/>\n{<\/>}<\/>\n>><\/>><\/> str(<\/>)<\/>\n''<\/>\n>><\/>><\/> \n, 'arcpy.Array(arcpy.Array(None))', 'arcpy.Array(arcpy.Array([]))')>>> für geometry in geometry_classes:... für i, stmt in enumerate(ctor_stmts):... stmt = "arcpy.Geometry('{}',{})".format(geometry, stmt)... versuchen:... print("{:0>2}. {:<60}: {}".format(i+1, stmt, eval(stmt).WKT ) )... & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;außer Exception als err:... & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;print ("{:0>2}. {:<60}: {}...." .format(i+1, stmt, err.message[:20]))... print ("")... 01. arcpy.Geometry('point',) : Objekt: CreateObject....02. arcpy.Geometry('point',None) : Objekt: CreateObject....03. arcpy.Geometry('point',arcpy.Array()) : Objekt: CreateObject....04. arcpy.Geometry('point',arcpy.Array(None)) : Objekt: CreateObject....05. arcpy.Geometry('point',arcpy.Point()) : PUNKT (0 0)06. arcpy.Geometry('point',arcpy.Array([])) : Objekt: CreateObject....07. arcpy.Geometry('point',arcpy.Array([None])) : Objekt: CreateObject....08. arcpy.Geometry('point',arcpy.Array(arcpy token">.<\/SPAN>Array(<\/SPAN>)<\/SPAN>)<\/SPAN>)<\/SPAN> :<\/SPAN> Objekt:<\/SPAN> CreateObject.<\/SPAN>.<\/SPAN>.<\/SPAN>.<\/SPAN>09<\/SPAN>.<\/SPAN> arcpy.<\/SPAN>Geometry(<\/SPAN>'point'<\/SPAN>,<\/SPAN>arcpy.<\/SPAN>Array(<\/SPAN>arcpy.<\/SPAN>Array(<\/SPAN>None)<\/SPAN>)<\/SPAN>)<\/SPAN> :<\/SPAN> Objekt:<\/SPAN> CreateObject.<\/Span>.<\/span>.<\/span>.<\/span>10<\/Span>.<\/Span> arcpy.<\/Span>Geometry(<\/Span>'point'<\/Span>,<\/Span>arcpy.<\/Span>Array(<\/Span>arcpy.<\/Span>Array(<\/Span>[<\/Span>]<\/Span>)<\/Span>)<\/Span>)<\/Span> :<\/Span> Objekt:<\/Span> CreateObject.<\/span>.<\/span>.<\/span>.<\/span>01<\/span>.<\/span> arcpy.<\/span>Geometry(<\/span>'multipoint'<\/span>,<\/span>)<\/span> :<\/span> Objekt:<\/span> CreateObject.<\/span>.<\/span>.<\/span>.<\/span>02<\/span>.<\/span> arcpy.<\/span>Geometry(<\/span>'multipoint'<\/span>,None )<\/ pan> .<\/SPAN>.<\/SPAN>.<\/SPAN>02<\/SPAN>.<\/SPAN> arcpy.<\/SPAN>Geometry(<\/SPAN>'polyline'<\/SPAN>,<\/SPAN>None)<\/SPAN> :<\/SPAN> Objekt:<\/SPAN> CreateObject.<\/SPAN>.<\/SPAN>.<\/SPAN>.<\/SPAN>03<\/SPAN>.<\/SPAN> arcpy.<\/SPAN>Geometry(<\/SPAN>'polyline'<\/SPAN>,<\/SPAN>arcpy.<\/SPAN>Array(<\/SPAN>)<\/SPAN>)<\/SPAN> :<\/SPAN> Objekt:<\/SPAN> CreateObject.<\/SPAN>.<\/span>.<\/span>.<\/span> 04 < /Span > . < /Span > Arcpy . < /Span > Geometry ( < /Span > 'Polyline' < /Span > , < /Span > Arcpy . < /Span > Array ( < /Span > None ) < /Span > ) < /Span >& nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; < Span Class = "Punctuation Token" > : < / Span > MULTILINESTRING EMPTY< Span Class = "Number Token" > 05 < / Span >< Span Class = "Punctuation Token" > . < / Span > Arcpy < Span Class = "Punctuation Token" > . < / Span > Geometry < Span Class = "Punctuation Token" > ( < / Span >< Span Class = "String Token" > 'Polyline' < / Span >< Span Class = "Punctuation Token" > , < / Span > Arcpy < Span Class = "Punctuation Token" > . < / Span > Point < Span Class = "Punctuation Token" > ( < / Span >< Span Class = "Punctuation Token" > ) < / Span >< Span Class = "Punctuation Token" > ) < / Span >& nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; < Span Class = "Punctuation Token" > : < / Span > MULTILINESTRING EMPTY< Span Class = "Number Token" > 06 < / Span >< Span Class = "Punctuation Token" > . < / Span > Arcpy < Span Class = "Punctuation Token" > . < / Span > Geometry < Span Class = "Punctuation Token" > ( < / Span >< Span Class = "String Token" > 'Polyline' < / Span >< Span Class = "Punctuation Token" > , < / Span > Arcpy < Span Class = "Punctuation Token" > . < / Span > Array < Span Class = "Punctuation Token" > ( < / Span >< Span Class = "Punctuation Token" > [ < / Span >< Span Class = "Punctuation Token" > ] < / Span >< Span Class = "Punctuation Token" > ) < / Span >< Span Class = "Punctuation Token" > ) < / Span >& nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; < Span Class = "Punctuation Token" > : < / Span > Objekt< span class=
Nice job Joshua... sadly 'None' still isn't from previous discussions, nothing has changed
Joshua Bixby / Dan Patterson
Do you know how you would invoke the 'within' method? Been struggling with that one.
It's on the Geometry site, but, alas no good sample 😕 Geometry—Help | ArcGIS for Desktop
In the Pro help... still applies to ArcMap http://pro.arcgis.com/en/pro-app/arcpy/data-access/searchcursor-class.htm
Andrew Valenski, I responded in your cross post: Arcpy write geometry error. Instead of cross-posting the same question to slightly-related, existing discussions, it would have been better in this case to just post a new question with a bit more information. I see you started a new question: https://community.esri.com/thread/197968-re-how-to-use-arcpy-geometry-measureonline
In GeoNet, instead of cross posting you can post your question in one space/place and share that question in other spaces/places. That allows the question to get higher visibility without creating multiple, independent versions of the same question that can lead to confusion.
This is an excellent analysis @JoshuaBixby!
Most important thing is that technique for creation of empty geometries should be noted in the docs at least, and even better should be made consistent with other Pythonic methods of creating empties...
Angemeldete Mitglieder können Beiträge verfassen, Updates folgen und mehr. Neu hier? Registrieren Sie ein kostenloses Konto.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.