Mon précédent article de blog, \/blogs\/tilting\/2017\/06\/10\/a-case-of-missing-prefixes-esris-geometries?sr=search&searchId=c6def5e0-70d7-4799-991e-cfbe7cafee76&searchIndex=0<\/A>, n'était pas prévu. J'ai commencé à écrire cet article de blog et le suivant, et j'ai réalisé que les informations de base que je voulais inclure ne rentraient pas vraiment dans l'un ou l'autre, alors j'ai rédigé les informations de base séparément.<\/EM><\/P><\/P>Au fil des ans, j'ai trouvé les constructeurs de géométrie ArcPy un peu capricieux, surtout avec des cas limites ou spécifiques comme les géométries vides. En tant qu'utilisateur engagé, qui croit qu'il est important de fournir des retours aux développeurs, j'ai soumis plusieurs bugs et demandes d'amélioration au fil du temps concernant les constructeurs de géométrie. Dès le départ, je ne peux pas dire combien ont été implémentés, peut-être juste un, mais ce n'était pas en haut de ma liste de souhaits.<\/P><\/P>Il y a quelques années, j'ai soumis l'idée Support Empty Geometries with ArcPy Geometry Class Constructors<\/A>. Voyant combien peu d'utilisateurs travaillent avec des géométries vides, je ne suis pas surpris par les 2 votes qu'elle a reçus jusqu'à présent. <\/EM>Comme le souligne David Wynne<\/A> d'Esri dans les commentaires, les géométries vides sont en fait supportées par les constructeurs de géométrie ArcPy, c'est juste que la syntaxe n'est pas documentée. Étant donné que les géométries vides sont supportées par les constructeurs, je pense que mon idée originale devrait être fusionnée sous Pythonic ArcPy Geometries<\/A> puisque ce que je recherche vraiment est une manière plus intuitive et idiomatique de créer des géométries vides en utilisant les constructeurs de géométrie ArcPy. Je fusionnerais mes deux idées si je le pouvais, mais je ne peux pas moi-même, et je ne veux pas simplement supprimer l'idée.<\/EM><\/P><\/P>En utilisant la classe Polygon d'ArcPy comme exemple, examinons différentes façons dont on pourrait essayer de construire une géométrie vide en utilisant les constructeurs de géométrie ArcPy:<\/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 class="punctuation token"> </span></span></span> <span class= <SPAN class="punctuation token">:<\/SPAN> Objet<SPAN class="punctuation token">:<\/SPAN> CreateObject ne peut pas créer <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 VIDE <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 VIDE <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> Objet<span class="punctuation token">:<\/span> CreateObject ne peut pas créer <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>[None]<span class="punctuation token">)<\/span><span class="punctuation token">)<\/span> <span class="punctuation token">:<\/span> MULTIPOLYGON VIDE <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 VIDE <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">.<\/span>Array<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> <span class="punctuation token">:<\/span> MULTIPOLYGON VIDE <span class="number token">10<\/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\"><(\/><)arcpy<punc-token>.Array<punc-token>([ ] ) ) )& nbsp; & nbsp; : MULTIPOLYGON VIDE > > <<EMOJI_0 > >< spanclass=\"line-numbers-rows\">< span > <<EMOJI_1 > >< / span >< span > <<EMOJI_2 > >< / span >< span > <<EMOJI_3 > >< / span >< span > <<EMOJI_4 > >< / span >< span > <<EMOJI_5 > >< / span >< span > <<EMOJI_6 > >< / span >< span > <<EMOJI_7 > >< / span >< span > <<EMOJI_8 > >< / span >< span > <<EMOJI_9 > >< / span >< span > <<EMOJI_10 > >< / span >< span > <<EMOJI_11 > >< / span >< span > <<EMOJI_12 > >< / span >< span > <<EMOJI_13 > >< / span >< span > <<EMOJI_14 > >< / span >< span > <<EMOJI_15 > >< / span >< span > <<EMOJI_16 > >< / span >< span > <<EMOJI_17 > >< / span >< span > <<EMOJI_18 > >< / span >< span > <<EMOJI_19 > >< / span >< span > <<EMOJI_20 > >< / span >< span > <<EMOJI_21 > >< / span >< span > <<EMOJI_22 > >< / span >< span > <<EMOJI_23 > >< / span >< span > <<EMOJI_24 > >< / span >< span > <<EMOJI_25 > >< / span >< span > <<EMOJI_26 > >< / span >< span > <<EMOJI_27 > >< / span >< span > <<EMOJI_28 > >< / span >< span > <<EMOJI_29 > >< / span >< span > <<EMOJI_30 > >< / span >< span >> < EM O J I _ 31 >> < \/ s p a n ></ C O D E ></ P R E ></ P> <P>Afin de partager toute réflexion ou commentaire, je pense qu'il est important de nous rafraîchir la mémoire sur ce que la documentation <A href=\"http:\/desktop.arcgis.com/en/arcmap/latest/analyze/arcpy-classes/polygon.htm\" rel=\"nofollow noopener noreferrer\" target=\"_blank\" aria-label=\"ArcPy Polygon (ouvre dans un nouvel onglet)\" data-linktype=\"external\" data-linkurl=\"http:\/desktop.arcgis.com/en/arcmap/latest/analyze/arcpy-classes/polygon.htm\"><u>L'ArcPy Polygon</u></A> indique exactement :< \/ p> <BLOCKQUOTEclass=\"jive_macro_quote jive-quote jive_text_macro\"><H2style=\"margin:0.63em0px0.63158em;font-family:'Avenir LT W01 35 Light',Arial,Helvetica,sans-serif;font-style:normal;font-weight:500;letter-spacing:0.02em;font-size:2rem;line-height:1.2em;-webkit-font-smoothing:antialiased;\"id=\"toc-hId-1824851459\"id=\"toc-hId-1824851459\"> Syntaxe</H2> <DIVclass=\"\"style=\"-webkit-font-smoothing:antialiased;\"><PREclass=\"lia-code-sample line-numbers language-none\"> Polygon (inputs, {spatial_reference}, {has_z}, {has_m})</PRE></DIV> <DIVclass=\"\"style=\"-webkit-font-smoothing:antialiased;\"><TABLEstyle=\"width:767.333px;margin-bottom:1.5em;font-size:0.875em;line-height:1.71429em;font-family:'Lucida Grande','Segoe UI',Arial,sans-serif;background-color:white;border-collapse:collapse;border-spacing:0px;border:1px solid #dddddd;text-align:left;\"> <THEADstyle=\"background-color:#f4f4f4;border-bottom:1px solid #dddddd;font-size:0.9375em;line-height:1.6em;font-weight:bold;\"> <TRstyle=\"border-bottom:medium none;text-align:left;height:39px;\"> <TDclass=\"\"style=\"border-left:1px solid #dddddd;border-right:1px solid #dddddd;padding:12px;height:39px;\"> Paramètre</TD> <TDclass=\"\"style=\"border-left:1px solid #dddddd;border-right:1px solid #dddddd;padding:12px;height:39px;\"> Explication</TD> <TDclass=\"\"style=\"border-left:1px solid #dddddd;border-right:1px solid #dddddd;padding:12px;height:39px;\"> Type de données</TD> </TR> </THEAD> <TBODY> <TRstyle=\"border-bottom:1px solid #dddddd;text-align:left;height:49px;\"> <TDstyle=\"border-left:1px solid #dddddd;border-right:1px solid #dddddd;padding:12px;height:49px;\"> <DIVclass=\"\"style=\"-webkit-font-smoothing:antialiased;\"> inputs</DIV> </TD> <TDstyle=\"border-left:1px solid #dddddd;border-right:1px solid #dddddd;padding:12px;height:49px;\"> <Pstyle=\"font-size:0.875rem;line-height:1.71429em;margin-top:0em;margin-bottom:0px;-webkit-font-smoothing:antialiased;"> Les coordonnées utilisées pour créer l'objet. Le type de données peut être soit <SPAnclass= " " style = " -webkit-font-smoothing : antialiased ; font-family : Consolas , 'Andale Mono' , 'Lucida Console' , Monaco , 'Courier New' , Courier , monospace ; font-weight : bold ; ">Point</SPAn></P> <Pstyle = " font-size : 0.875rem ; line-height : 1.71429em ; margin-top : 0em ; margin-bottom : 0px ; -webkit-font-smoothing : antialiased ; "> ou des objets <SPAnclass = " " style = " -webkit-font-smoothing : antialiased ; font-family : Consolas , 'Andale Mono' , 'Lucida Console' , Monaco , 'Courier New' , Courier , monospace ; font-weight : bold ; ">Array</SPAn>.</P> </TD> <TDstyle = " border-left : 1px solid #dddddd ; border-right : 1px solid #dddddd ; padding : 12px ; height : 49px ; ">Objet</TD> </TR> </TBODY> </TABLE> </DIV> </BLOCKQUOTE> <P></P> <P>Quelques observations avant les commentaires :</P> <UL> <LI>Exemples 01 & 02 : <BR /><UL> <LI>La documentation indique que les inputs doivent être des objets Point ou Array, ce que aucun de ces exemples ne fournit.</LI> </UL></LI> <LI>Exemples 03 & 06 : <UL> <LI>Ces deux exemples sont identiques, par exemple, <SPAn style = " font-family : courier new , courier , monospace ; ">repr(arcpy.Array()) == repr(arcpy.Array([]))</SPAn>.& nbsp;< EM>E tant donné qu’Esri n’implémente pas l’équivalence avec les ArcPy Arrays, j’ai utilisé la méthode <SPAn style = " font-family : courier new , courier , monospace ; ">__repr__</SPAn> des objets pour montrer l’égalité dans ce cas.</ EM></LI> <LI>L’appel à <SPAn style = " font-family : courier new , courier , monospace ; ">arcpy.Array()</SPAn> crée un ArcPy Array vide :& nbsp;<SPAn style = " font-family : courier new , courier , monospace ; "><Array []><\/SPAN>. Les tableaux ArcPy vides sont des objets valides, et la documentation indique que les objets ArcPy Array peuvent être passés au constructeur ArcPy Polygon.<EM><BR \/><\/EM><\/LI><\/UL><\/LI><LI>Exemples 04 & 07 :<UL><LI>Similaires aux exemples 03 & 06, ces deux exemples sont identiques, par exemple, <SPAN style="font-family: courier new,courier,monospace;">repr(arcpy.Array(None)) == repr(arcpy.Array([None])).<\/SPAN><\/LI><LI>L'exemple 04 était la méthode suggérée par <A href="https:\/\/community.esri.com\/migrated-users\/2582" target="_blank">David Wynne<\/A> dans <A href="https:\/\/community.esri.com\/ideas\/10648?sr=search&searchId=d16b084d-001d-4dad-b5a6-7e4ae13606e0&searchIndex=4" target="_blank">Support Empty Geometries with ArcPy Geometry Class Constructors<\/A>.<\/LI><\/UL><\/LI><LI>Exemple 05 :<UL><LI>La documentation indique qu'un objet Point peut être utilisé comme entrée.<\/LI><LI>Appeler <SPAN style="font-family: courier new,courier,monospace;">arcpy.Point()<\/SPAN> ne crée pas un point vide, comme appeler <SPAN style="font-family: courier new,courier,monospace;">arcpy.Array()<\/SPAN>, mais crée plutôt un point 0, 0 :<SPAN style="font-family: courier new,courier,monospace;"> <Point (0.0, 0.0, #, #)><\/SPAN>. Bien que non démontré ci-dessus, des tests supplémentaires montrent que n'importe quel point fonctionne, par exemple, <SPAN style="font-family: courier new,courier,monospace;">arcpy.Polygon(arcpy.Point(10000.5, -4500.3))<\/SPAN> crée également un multi-polygone vide.<\/LI><\/UL><\/LI><LI>Exemples 08 & 10 :<UL><LI>Similaires aux exemples 03 & 06 et aux exemples 04 & 07, ces deux exemples sont identiques.<\/LI><LI>Appeler <SPAN style="font-family: courier new,courier,monospace;">arcpy.Array(arcpy.Array())<\/SPAN> crée un tableau ArcPy vide imbriqué dans un tableau ArcPy. La documentation <A href="http:\/\/desktop.arcgis.com\/en\/arcmap\/latest\/analyze\/arcpy-classes\/array.htm" rel="nofollow noopener noreferrer" target="_blank">ArcPy Array<\/A> indique qu'un ArcPy Array est une entrée valide pour le constructeur ArcPy Array.<\/LI><\/UL><\/LI><\/UL><P><\/P><P>Il y a plusieurs bizarreries avec les résultats du test du constructeur de polygone ci-dessus. Je pense que les exemples 03 & 06 sont ceux qui risquent le plus de dérouter les utilisateurs. La documentation indique clairement que les objets ArcPy Array sont des entrées valides et que les tableaux ArcPy vides sont des objets valides, alors pourquoi passer un tableau ArcPy vide au constructeur ArcPy Polygon génère-t-il une erreur ? Bien que les exemples 04 & 07 fonctionnent, il semble étrange qu'un ArcPy Array contenant un Python <SPAN style="font-family: courier new,courier,monospace;">None<\/SPAN> soit d'une certaine manière substantiellement différent d'un tableau ArcPy vide lors de la construction d'une géométrie vide.<\/P><P><\/P><P>L'exemple 05 est une surprise et a le moins de sens pour moi. La documentation indique clairement qu'un objet Point est une entrée valide pour le constructeur ArcPy Polygon, mais à quoi ressemble un polygone avec un seul point ? Un multi-polygone vide, selon Esri. Ce qui rend cette étrangeté encore plus marquante pour moi est qu'il n'existe pas de Point ArcPy vide et que tout Point ArcPy passé au constructeur ArcPy Polygon crée une géométrie vide.<\/P><P><\/P><P style="padding-left: 30px;"><EM>En utilisant <A class="link-titled" href="https:\/\/docs.python.org\/2\/library\/dis.html" title="https:\/\/docs.python.org\/2\/library\/dis.html" rel="nofollow noopener noreferrer" target="_blank">dis 014 Disassembler for Python bytecode<\/A> pour examiner le bytecode de chacune des instructions du constructeur ci-dessus, il semblait que l'exemple 05 serait l'instruction du constructeur la plus performante. L'exécution de <A class="link-titled" href="https:\/\/docs.python.org\/2\/library\/timeit.html" title="https:\/\/docs.python.org\/2\/library\/timeit.html" rel="nofollow noopener noreferrer" target="_blank">timeit 014 Measure execution time of small code snippets<\/A> sur les instructions du constructeur a montré que l'exemple 05 était le plus rapide à générer des géométries vides, pas de beaucoup, mais quand même le plus rapide. Cela ajoute seulement au mystère du polygone à point unique.<\/EM><\/P><P><\/P><P>Les exemples 08 & 10 seront abordés dans un prochain article de blog, donc je ne développerai pas mes réflexions à leur sujet ici.<\/P><P><\/P><P>Alors comment les résultats de ce test s'intègrent-ils dans l'idée/demande/supplication pour plus de <A href="https:\/\/community.esri.com\/ideas\/10963?sr=search&searchId=97894fbc-b12d-4fd3-85e6-92946ebbb702&searchIndex=2" target="_blank">Pythonic ArcPy Geometries<\/_A>014 ? Pour moi, la réponse est que l'exemple 01 devrait être la principale façon de créer des géométries vides ArcPy, c'est-à-dire que ne passer aucun argument à un constructeur de géométrie ArcPy devrait générer le type de géométrie vide équivalent. Pour les objets qui supportent le concept de vacuité, il est assez courant en Python que ne passer aucun argument au constructeur crée un objet vide. Regardons quelques exemples :<\/_P><PRE class="lia-code-sample line-numbers language-none"><CODE><SPAN class="operator token">>><\/_SPAN><SPAN class="operator token">><\/_SPAN> <SPAN class="comment token"># Structures de données intégrées courantes<\/_SPAN> <SPAN class="operator token">>><\/_SPAN><SPAN class="operator token">><\/_SPAN> list<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> set<Span class="punctuation token">(<\/_Span><Span class="punctuation token">)<\/_Span> set<Span class="punctuation token">(<\/_Span>[<\/_Span>]<Span class="punctuation token">)<\/_Span> <Span class="operator token">>><\/_Span><Span class="operator token">><\/_Span> dict<Span class="punctuation token">(<\/_Span>) {}</span> <span class='operator token'>>></span>> str() '' >>> # Certaines structures de données SciPy maintenant incluses avec ArcGIS >>> import pandas >>> pandas.DataFrame() Empty DataFrame Columns: [] Index: [] >>> import matplotlib.pylab >>> matplotlib.pylab.plot() [] >>> <span class='line-numbers-rows'><span><<EMOJI_1></span><span><<EMOJI_2></span><span><<EMOJI_3></span><span><<EMOJI_4></span><span><<EMOJI_5></span><span><<EMOJI_6></span><span><<EMOJI_7></span><span><<EMOJI_8></span><span><<EMOJI_9></span><span><<EMOJI_10></span><span><<EMOJI_11></span><span><<EMOJI_12></span><span><<EMOJI_13></span><span><<EMOJI_14></span><span><<EMOJI_15></span><span><<EMOJI_16></span><span><<EMOJI_17></span><span><<EMOJI_18></span><span><<EMOJI_19></span><span><<EMOJI_20></span>
<\/P>
Au fil des ans, j'ai trouvé les constructeurs de géométrie ArcPy un peu capricieux, surtout avec des cas limites ou spécifiques comme les géométries vides. En tant qu'utilisateur engagé, qui croit qu'il est important de fournir des retours aux développeurs, j'ai soumis plusieurs bugs et demandes d'amélioration au fil du temps concernant les constructeurs de géométrie. Dès le départ, je ne peux pas dire combien ont été implémentés, peut-être juste un, mais ce n'était pas en haut de ma liste de souhaits.<\/P>
Il y a quelques années, j'ai soumis l'idée
<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 class="punctuation token"> </span></span></span> <span class= <SPAN class="punctuation token">:<\/SPAN> Objet<SPAN class="punctuation token">:<\/SPAN> CreateObject ne peut pas créer <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 VIDE <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 VIDE <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> Objet<span class="punctuation token">:<\/span> CreateObject ne peut pas créer <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>[None]<span class="punctuation token">)<\/span><span class="punctuation token">)<\/span> <span class="punctuation token">:<\/span> MULTIPOLYGON VIDE <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 VIDE <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">.<\/span>Array<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> <span class="punctuation token">:<\/span> MULTIPOLYGON VIDE <span class="number token">10<\/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\"><(\/><)arcpy<punc-token>.Array<punc-token>([ ] ) ) )& nbsp; & nbsp; : MULTIPOLYGON VIDE > > <<EMOJI_0 > >< spanclass=\"line-numbers-rows\">< span > <<EMOJI_1 > >< / span >< span > <<EMOJI_2 > >< / span >< span > <<EMOJI_3 > >< / span >< span > <<EMOJI_4 > >< / span >< span > <<EMOJI_5 > >< / span >< span > <<EMOJI_6 > >< / span >< span > <<EMOJI_7 > >< / span >< span > <<EMOJI_8 > >< / span >< span > <<EMOJI_9 > >< / span >< span > <<EMOJI_10 > >< / span >< span > <<EMOJI_11 > >< / span >< span > <<EMOJI_12 > >< / span >< span > <<EMOJI_13 > >< / span >< span > <<EMOJI_14 > >< / span >< span > <<EMOJI_15 > >< / span >< span > <<EMOJI_16 > >< / span >< span > <<EMOJI_17 > >< / span >< span > <<EMOJI_18 > >< / span >< span > <<EMOJI_19 > >< / span >< span > <<EMOJI_20 > >< / span >< span > <<EMOJI_21 > >< / span >< span > <<EMOJI_22 > >< / span >< span > <<EMOJI_23 > >< / span >< span > <<EMOJI_24 > >< / span >< span > <<EMOJI_25 > >< / span >< span > <<EMOJI_26 > >< / span >< span > <<EMOJI_27 > >< / span >< span > <<EMOJI_28 > >< / span >< span > <<EMOJI_29 > >< / span >< span > <<EMOJI_30 > >< / span >< span >> < EM O J I _ 31 >> < \/ s p a n ></ C O D E ></ P R E ></ P> <P>Afin de partager toute réflexion ou commentaire, je pense qu'il est important de nous rafraîchir la mémoire sur ce que la documentation <A href=\"http:\/desktop.arcgis.com/en/arcmap/latest/analyze/arcpy-classes/polygon.htm\" rel=\"nofollow noopener noreferrer\" target=\"_blank\" aria-label=\"ArcPy Polygon (ouvre dans un nouvel onglet)\" data-linktype=\"external\" data-linkurl=\"http:\/desktop.arcgis.com/en/arcmap/latest/analyze/arcpy-classes/polygon.htm\"><u>L'ArcPy Polygon</u></A> indique exactement :< \/ p> <BLOCKQUOTEclass=\"jive_macro_quote jive-quote jive_text_macro\"><H2style=\"margin:0.63em0px0.63158em;font-family:'Avenir LT W01 35 Light',Arial,Helvetica,sans-serif;font-style:normal;font-weight:500;letter-spacing:0.02em;font-size:2rem;line-height:1.2em;-webkit-font-smoothing:antialiased;\"id=\"toc-hId-1824851459\"id=\"toc-hId-1824851459\"> Syntaxe</H2> <DIVclass=\"\"style=\"-webkit-font-smoothing:antialiased;\"><PREclass=\"lia-code-sample line-numbers language-none\"> Polygon (inputs, {spatial_reference}, {has_z}, {has_m})</PRE></DIV> <DIVclass=\"\"style=\"-webkit-font-smoothing:antialiased;\"><TABLEstyle=\"width:767.333px;margin-bottom:1.5em;font-size:0.875em;line-height:1.71429em;font-family:'Lucida Grande','Segoe UI',Arial,sans-serif;background-color:white;border-collapse:collapse;border-spacing:0px;border:1px solid #dddddd;text-align:left;\"> <THEADstyle=\"background-color:#f4f4f4;border-bottom:1px solid #dddddd;font-size:0.9375em;line-height:1.6em;font-weight:bold;\"> <TRstyle=\"border-bottom:medium none;text-align:left;height:39px;\"> <TDclass=\"\"style=\"border-left:1px solid #dddddd;border-right:1px solid #dddddd;padding:12px;height:39px;\"> Paramètre</TD> <TDclass=\"\"style=\"border-left:1px solid #dddddd;border-right:1px solid #dddddd;padding:12px;height:39px;\"> Explication</TD> <TDclass=\"\"style=\"border-left:1px solid #dddddd;border-right:1px solid #dddddd;padding:12px;height:39px;\"> Type de données</TD> </TR> </THEAD> <TBODY> <TRstyle=\"border-bottom:1px solid #dddddd;text-align:left;height:49px;\"> <TDstyle=\"border-left:1px solid #dddddd;border-right:1px solid #dddddd;padding:12px;height:49px;\"> <DIVclass=\"\"style=\"-webkit-font-smoothing:antialiased;\"> inputs</DIV> </TD> <TDstyle=\"border-left:1px solid #dddddd;border-right:1px solid #dddddd;padding:12px;height:49px;\"> <Pstyle=\"font-size:0.875rem;line-height:1.71429em;margin-top:0em;margin-bottom:0px;-webkit-font-smoothing:antialiased;"> Les coordonnées utilisées pour créer l'objet. Le type de données peut être soit <SPAnclass= " " style = " -webkit-font-smoothing : antialiased ; font-family : Consolas , 'Andale Mono' , 'Lucida Console' , Monaco , 'Courier New' , Courier , monospace ; font-weight : bold ; ">Point</SPAn></P> <Pstyle = " font-size : 0.875rem ; line-height : 1.71429em ; margin-top : 0em ; margin-bottom : 0px ; -webkit-font-smoothing : antialiased ; "> ou des objets <SPAnclass = " " style = " -webkit-font-smoothing : antialiased ; font-family : Consolas , 'Andale Mono' , 'Lucida Console' , Monaco , 'Courier New' , Courier , monospace ; font-weight : bold ; ">Array</SPAn>.</P> </TD> <TDstyle = " border-left : 1px solid #dddddd ; border-right : 1px solid #dddddd ; padding : 12px ; height : 49px ; ">Objet</TD> </TR> </TBODY> </TABLE> </DIV> </BLOCKQUOTE> <P></P> <P>Quelques observations avant les commentaires :</P> <UL> <LI>Exemples 01 & 02 : <BR /><UL> <LI>La documentation indique que les inputs doivent être des objets Point ou Array, ce que aucun de ces exemples ne fournit.</LI> </UL></LI> <LI>Exemples 03 & 06 : <UL> <LI>Ces deux exemples sont identiques, par exemple, <SPAn style = " font-family : courier new , courier , monospace ; ">repr(arcpy.Array()) == repr(arcpy.Array([]))</SPAn>.& nbsp;< EM>E tant donné qu’Esri n’implémente pas l’équivalence avec les ArcPy Arrays, j’ai utilisé la méthode <SPAn style = " font-family : courier new , courier , monospace ; ">__repr__</SPAn> des objets pour montrer l’égalité dans ce cas.</ EM></LI> <LI>L’appel à <SPAn style = " font-family : courier new , courier , monospace ; ">arcpy.Array()</SPAn> crée un ArcPy Array vide :& nbsp;<SPAn style = " font-family : courier new , courier , monospace ; "><Array []><\/SPAN>. Les tableaux ArcPy vides sont des objets valides, et la documentation indique que les objets ArcPy Array peuvent être passés au constructeur ArcPy Polygon.<EM><BR \/><\/EM><\/LI><\/UL><\/LI><LI>Exemples 04 & 07 :<UL><LI>Similaires aux exemples 03 & 06, ces deux exemples sont identiques, par exemple, <SPAN style="font-family: courier new,courier,monospace;">repr(arcpy.Array(None)) == repr(arcpy.Array([None])).<\/SPAN><\/LI><LI>L'exemple 04 était la méthode suggérée par <A href="https:\/\/community.esri.com\/migrated-users\/2582" target="_blank">David Wynne<\/A> dans <A href="https:\/\/community.esri.com\/ideas\/10648?sr=search&searchId=d16b084d-001d-4dad-b5a6-7e4ae13606e0&searchIndex=4" target="_blank">Support Empty Geometries with ArcPy Geometry Class Constructors<\/A>.<\/LI><\/UL><\/LI><LI>Exemple 05 :<UL><LI>La documentation indique qu'un objet Point peut être utilisé comme entrée.<\/LI><LI>Appeler <SPAN style="font-family: courier new,courier,monospace;">arcpy.Point()<\/SPAN> ne crée pas un point vide, comme appeler <SPAN style="font-family: courier new,courier,monospace;">arcpy.Array()<\/SPAN>, mais crée plutôt un point 0, 0 :<SPAN style="font-family: courier new,courier,monospace;"> <Point (0.0, 0.0, #, #)><\/SPAN>. Bien que non démontré ci-dessus, des tests supplémentaires montrent que n'importe quel point fonctionne, par exemple, <SPAN style="font-family: courier new,courier,monospace;">arcpy.Polygon(arcpy.Point(10000.5, -4500.3))<\/SPAN> crée également un multi-polygone vide.<\/LI><\/UL><\/LI><LI>Exemples 08 & 10 :<UL><LI>Similaires aux exemples 03 & 06 et aux exemples 04 & 07, ces deux exemples sont identiques.<\/LI><LI>Appeler <SPAN style="font-family: courier new,courier,monospace;">arcpy.Array(arcpy.Array())<\/SPAN> crée un tableau ArcPy vide imbriqué dans un tableau ArcPy. La documentation <A href="http:\/\/desktop.arcgis.com\/en\/arcmap\/latest\/analyze\/arcpy-classes\/array.htm" rel="nofollow noopener noreferrer" target="_blank">ArcPy Array<\/A> indique qu'un ArcPy Array est une entrée valide pour le constructeur ArcPy Array.<\/LI><\/UL><\/LI><\/UL><P><\/P><P>Il y a plusieurs bizarreries avec les résultats du test du constructeur de polygone ci-dessus. Je pense que les exemples 03 & 06 sont ceux qui risquent le plus de dérouter les utilisateurs. La documentation indique clairement que les objets ArcPy Array sont des entrées valides et que les tableaux ArcPy vides sont des objets valides, alors pourquoi passer un tableau ArcPy vide au constructeur ArcPy Polygon génère-t-il une erreur ? Bien que les exemples 04 & 07 fonctionnent, il semble étrange qu'un ArcPy Array contenant un Python <SPAN style="font-family: courier new,courier,monospace;">None<\/SPAN> soit d'une certaine manière substantiellement différent d'un tableau ArcPy vide lors de la construction d'une géométrie vide.<\/P><P><\/P><P>L'exemple 05 est une surprise et a le moins de sens pour moi. La documentation indique clairement qu'un objet Point est une entrée valide pour le constructeur ArcPy Polygon, mais à quoi ressemble un polygone avec un seul point ? Un multi-polygone vide, selon Esri. Ce qui rend cette étrangeté encore plus marquante pour moi est qu'il n'existe pas de Point ArcPy vide et que tout Point ArcPy passé au constructeur ArcPy Polygon crée une géométrie vide.<\/P><P><\/P><P style="padding-left: 30px;"><EM>En utilisant <A class="link-titled" href="https:\/\/docs.python.org\/2\/library\/dis.html" title="https:\/\/docs.python.org\/2\/library\/dis.html" rel="nofollow noopener noreferrer" target="_blank">dis 014 Disassembler for Python bytecode<\/A> pour examiner le bytecode de chacune des instructions du constructeur ci-dessus, il semblait que l'exemple 05 serait l'instruction du constructeur la plus performante. L'exécution de <A class="link-titled" href="https:\/\/docs.python.org\/2\/library\/timeit.html" title="https:\/\/docs.python.org\/2\/library\/timeit.html" rel="nofollow noopener noreferrer" target="_blank">timeit 014 Measure execution time of small code snippets<\/A> sur les instructions du constructeur a montré que l'exemple 05 était le plus rapide à générer des géométries vides, pas de beaucoup, mais quand même le plus rapide. Cela ajoute seulement au mystère du polygone à point unique.<\/EM><\/P><P><\/P><P>Les exemples 08 & 10 seront abordés dans un prochain article de blog, donc je ne développerai pas mes réflexions à leur sujet ici.<\/P><P><\/P><P>Alors comment les résultats de ce test s'intègrent-ils dans l'idée/demande/supplication pour plus de <A href="https:\/\/community.esri.com\/ideas\/10963?sr=search&searchId=97894fbc-b12d-4fd3-85e6-92946ebbb702&searchIndex=2" target="_blank">Pythonic ArcPy Geometries<\/_A>014 ? Pour moi, la réponse est que l'exemple 01 devrait être la principale façon de créer des géométries vides ArcPy, c'est-à-dire que ne passer aucun argument à un constructeur de géométrie ArcPy devrait générer le type de géométrie vide équivalent. Pour les objets qui supportent le concept de vacuité, il est assez courant en Python que ne passer aucun argument au constructeur crée un objet vide. Regardons quelques exemples :<\/_P><PRE class="lia-code-sample line-numbers language-none"><CODE><SPAN class="operator token">>><\/_SPAN><SPAN class="operator token">><\/_SPAN> <SPAN class="comment token"># Structures de données intégrées courantes<\/_SPAN> <SPAN class="operator token">>><\/_SPAN><SPAN class="operator token">><\/_SPAN> list<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> set<Span class="punctuation token">(<\/_Span><Span class="punctuation token">)<\/_Span> set<Span class="punctuation token">(<\/_Span>[<\/_Span>]<Span class="punctuation token">)<\/_Span> <Span class="operator token">>><\/_Span><Span class="operator token">><\/_Span> dict<Span class="punctuation token">(<\/_Span>) {}</span> <span class='operator token'>>></span>> str() '' >>> # Certaines structures de données SciPy maintenant incluses avec ArcGIS >>> import pandas >>> pandas.DataFrame() Empty DataFrame Columns: [] Index: [] >>> import matplotlib.pylab >>> matplotlib.pylab.plot() [] >>> <span class='line-numbers-rows'><span><<EMOJI_1></span><span><<EMOJI_2></span><span><<EMOJI_3></span><span><<EMOJI_4></span><span><<EMOJI_5></span><span><<EMOJI_6></span><span><<EMOJI_7></span><span><<EMOJI_8></span><span><<EMOJI_9></span><span><<EMOJI_10></span><span><<EMOJI_11></span><span><<EMOJI_12></span><span><<EMOJI_13></span><span><<EMOJI_14></span><span><<EMOJI_15></span><span><<EMOJI_16></span><span><<EMOJI_17></span><span><<EMOJI_18></span><span><<EMOJI_19></span><span><<EMOJI_20></span>
Qu'est-ce qui est plus pythonique pour créer une géométrie vide, arcpy.Polygon(arcpy.Array(None)) ou arcpy.Polygon() ?
arcpy.Polygon(arcpy.Array(None))
arcpy.Polygon()
Mise à jour 06/2018 :
Pour plus d'exhaustivité, je souhaite inclure les résultats des tests du constructeur sur les autres classes Geometry d'ArcPy :
> geometry_classes = ["point", "multipoint", "polyline"]
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...
Les membres connectés peuvent publier, suivre les mises à jour, et plus encore. Nouveau ici ? Inscrivez-vous gratuitement.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.