\/blogs\/tilting\/2017\/06\/10\/a-case-of-missing-prefixes-esris-geometries?sr=search&searchId=c6def5e0-70d7-4799-991e-cfbe7cafee76&searchIndex=0<\/A>, nebyl plánovaný. Začal jsem psát tento blogový příspěvek a ten následující, a uvědomil jsem si, že informace na pozadí, které jsem chtěl zahrnout, se do žádného z nich úplně nevešly, takže jsem tyto informace napsal zvlášť.
<\/EM><\/P><\/P>
Během let jsem zjistil, že konstruktory ArcPy Geometry jsou zvláštní, zejména u okrajových nebo specializovaných případů jako prázdné geometrie. Jako angažovaný uživatel, který věří, že poskytování zpětné vazby vývojářům je důležité, jsem v průběhu času podal několik chybových hlášení a požadavků na vylepšení týkajících se konstruktorů geometrie. Hned na začátku nemohu říct, kolik z nich bylo implementováno, možná jen jeden, ale nebyl to ten nejvýše na mém seznamu přání.<\/P>
<\/P>
Před několika lety jsem podal nápad
ArcPy Array<\/A> uvádí, že ArcPy Array je platný vstup do konstruktoru ArcPy Array.<\/LI><\/UL><\/LI><\/UL><\/P>
Existuje několik zvláštností s výsledky z testu konstruktoru polygonu výše. Myslím si, že příklady 03 & 06 pravděpodobně nejvíce zmátou uživatele. Dokumentace jasně uvádí, že objekty ArcPy Array jsou platné vstupy a prázdná ArcPy pole jsou platné objekty, tak proč předání prázdného ArcPy pole konstruktoru ArcPy Polygon generuje chybu? Ačkoliv příklady 04 & 07 fungují, zdá se zvláštní, že ArcPy pole obsahující Python None<\/SPAN> je nějak podstatně odlišné od prázdného ArcPy pole při vytváření prázdné geometrie.<\/P><\/P>Příklad 05 je překvapení a dává mi nejméně smysl. Dokumentace jasně uvádí, že objekt Point je platný vstup do konstruktoru ArcPy Polygon, ale jak vypadá polygon s jediným bodem? Prázdný multi-polygon podle Esri. Co pro mě zvyšuje zvláštnost na další úroveň je fakt, že neexistuje prázdný ArcPy Point a že jakýkoli ArcPy Point předaný konstruktoru ArcPy Polygon vytvoří prázdnou geometrii.<\/P><\/P>Použitím
timeit 12 Měření doby vykonání malých kódových útržků<\/A> na konstruktorových výrazech ukázalo, že příklad 05 byl nejrychlejší při generování prázdných geometrií, ne o moc, ale přesto nejrychlejší. To jen přidává k záhadě jedno-bodového polygonu.<\/EM><\/P><\/P>
Příklady 08 & 10 budou zmíněny v následujícím blogovém příspěvku, takže zde do nich nebudu zabíhat.<\/P>
<\/P>
Jak tedy výsledky tohoto testu zapadají do myšlenky010101010101010101010101010101010101010101010101010101010101010101010101010101\u003cPythonic ArcPy Geometries\u003e? Pro mě je odpověď taková, že příklad 01 by měl být primárním způsobem vytváření prázdných geometrií ArcPy, tj. nepředávání žádných argumentů konstruktoru ArcPy Geometry by mělo generovat ekvivalentní typ prázdné geometrie. U objektů podporujících koncept prázdnoty je v Pythonu poměrně běžné mít nepředávání argumentů konstruktoru k vytvoření prázdného objektu. Podívejme se na několik příkladů:<\/P>
>><\/>><\/> # Běžné vestavěné datové struktury<\/>\n>><\/>><\/> list(<\/>)<\/>\n[<\/>]<\/>\n>><\/>><\/> set(<\/>)<\/>\nset(<\/>[<\/>]<\/>)<\/>\n>><\/>><\/> dict(<\/>)<\/>\n{<\/>}<\/>\n>><\/>><\/> str(<\/>)<\/>\n''<\/>\n>><\/>><\/> \n,
'arcpy.Array(arcpy.Array(None))',
'arcpy.Array(arcpy.Array([]))'
)
>>> pro geometry v geometry_classes:
... pro i, stmt v enumerate(ctor_stmts):
... stmt = "arcpy.Geometry('{}',{})".format(geometry, stmt)
... zkusit:
... tisknout("{:0>2}. {:<60}: {}".format(i+1 </ SPAN >< SPANTŘÍDA = " interpunkční_token " > , </ SPAN > stmt < SPANTŘÍDA = " interpunkční_token " > , </ SPAN > eval < SPANTŘÍDA = " interpunkční_token " > ( </ SPAN > stmt < SPANTŘÍDA = " interpunkční_token " > ) </ SPAN >. WKT </ SPAN >< SPANTŘÍDA = " interpunkční_token " > ) </ SPAN >)
< SPANTŘÍDA = " interpunkční_token " > . </ SPAN >< SPANTŘÍDA = " interpunkční_token " > . </ SPAN >< SPANTŘÍDA = " interpunkční_token " > . </ SPAN >& nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; výjimka Výjimka jako err < SPANTŘÍDA = 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('point',arcpy.Array(arcpy.Array([]))) : Objekt: CreateObject...
01. arcpy.Geometry('multipoint',)& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp; : Objekt: CreateObject. . . .
02. arcpy.Geometry('multipoint',None)& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp; : Objekt: CreateObject. . . .
03. arcpy.Geometry('multipoint',arcpy.Array()& nbsp;& nbsp;& nbsp;& nbsp;& nbsp; : Objekt: CreateObject. . . .
04. arcpy.Geometry('multipoint',arcpy.Array(None))& nbsp; : MULTIPOINT PRÁZDNÝ
05. arcpy.Geometry(<'multipoint'>,arcpy() : MULTIPOINT (<0 0>)
06. arcpy.Geometry('multipoint',arcpy.Array([])) : Objekt: CreateObject....
07. arcpy.Geometry('multipoint',arcpy.Array([None])) : MULTIPOINT PRÁZDNÝ
08. arcpy.Geometry('multipoint',arcpy.Array(arcpy.Array())) : MULTIPOINT PRÁZDNÝ
09. arcpy.Geometry('multipoint',arcpy.Array(arcpy.Array(None))) : MULTIPOINT PRÁZDNÝ
10. arcpy.Geometry('multipoint',arcpy.Array(arcpy.Array([]))) : MULTIPOINT PRÁZDNÝ
01. arcpy.Geometry('polyline',) : Objekt: CreateObject... token">.<\/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> :<\/span> MULTILINESTRING PRÁZDNÝ
05<\/span>.<\/span> arcpy.<\/span>Geometry(<\/span>'polyline'<\/span>,<\/span>arcpy.<\/span>Point(<\/span>)<\/span>)<\/span> :<\/span> MULTILINESTRING PRÁZDNÝ
06<\/span>.<\/span> arcpy.<\/span>Geometry(<\/span>'polyline'<\/span>,<\/span>arcpy.<\/span>Array(<\/span>[0m[\u00A0][0m[0m)[0m[0m)[0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m:[0m MULTILINESTRING PRÁZDNÝ
[0m07[0m[0m.[0m arcpy[0m.[0marcpy.Geometry('polyline', arcpy.Array([None]))              : MULTILINESTRING PRÁZDNÝ
08. arcpy.Geometry('polyline', arcpy.Array(arcpy.Array()))    : MULTILINESTRING PRÁZDNÝ
09. arcpy.Geometry('polyline', arcpy.Array(arcpy.Array(None)))  : MULTILINESTRING PRÁZDNÝ
10. arcpy.Geometry('polyline', arcpy.Array(arcpy.Array([])))    : MULTILINESTRING PRÁZDNÝ
>>> <<EMOJI_1><<\/span><<EMOJI_2><<\/>... (and so on, emojis unchanged) ...
arcpy.Polyline()<\/> se chová stejně jako arcpy.Polygon()<\/> zatímco arcpy.Multipoint()<\/> má jednu odlišnost při předávání arcpy.Point()<\/>.