Byl jsem nerozhodný, zda napsat blogový příspěvek, nebo jen otevřít diskusi na Python fóru. Už je to nějaký čas, co jsem přispěl na svůj blog, takže volím první možnost.<\/EM><\/P>
<\/P>
Funkce ArcPy Data Access Walk (arcpy.da.Walk<\/SPAN>) je skutečný pracant a hodně na ni spoléhám. Funkce ArcPy Walk je příkladem, kde Esri udělalo správně svou Python implementaci. Nemohu říct, jaký byl jejich designový cíl, ale zdá se zřejmé, že cílem bylo vytvořit geoprostorově uvědomělou verzi Python funkce os.walk . Jména jsou stejná, mnoho parametrů je stejných, výsledky jsou podobné atd.... Myslím, že napodobení této dlouhodobé nativní Python funkčnosti v ArcPy bylo vítězství, protože to nebylo znovuobjevování kola, tj. uživatelé obeznámení s os.walk mohou snadno přejít na používání arcpy.da.Walk.<\/P>
<\/P>
Ačkoliv mám funkci ArcPy Walk rád, mám k ní pár drobných výhrad. První je problém s dokumentací, nebo spíše její nedostatek. Jeden z parametrů funkce Walk je datatype. Dokumentace obsahuje tabulku se všemi přijatelnými argumenty pro datatype, ale neexistuje žádná skutečná dokumentace samotných datových typů. Při pohledu na názvy datových typů se zdá většina z nich být zřejmá, takže možná Esri rozhodlo, že není potřeba je dokumentovat.<\/P>
<\/P>
Ačkoliv může název být na první pohled popisný, nedostatek dokumentace obvykle vede k nejasnostem a zmatení. Například co zahrnuje "FeatureClass"? Očividně by se předpokládalo, že feature class v geodatabázi je zahrnutá, ale co shapefile? Jsou shapefily feature classes? V Esri světě je odpověď obvykle "Ano", ale ne vždy. Skutečnou záhadou je datový typ "Geo", protože zahrnuje shapefily, ale ne feature classes v geodatabázi. Feature classes nejsou "geo?" Ačkoliv je dokumentace pro knihovny/API důležitá, není hlavním důvodem dnešního psaní.<\/P>
<\/P>
Jedním z mých oblíbených vzorů použití ArcPy Walk je zavolat vestavěnou Python funkci next()<\/SPAN> jednou pro získání seznamu shapefilů ve složce nebo feature classes v geodatabázi či feature datasetu.<\/P>
>>> workspace = #cesta ke složce nebo geodatabázi nebo feature datasetu
>>>
>>> _, _, filenames = next(arcpy.da.Walk(workspace, datatype="FeatureClass"))
>>> filenames
[u'canadwshed_p.shp', u'plots.shp']
>>>
>>> #nebo cyklus přes feature classes nebo shapefily
>>> for file in next(arcpy.da.Walk(workspace, datatype="FeatureClass"))[2]:
... print file
canadwshed_p.shp
plots.shp
>>>
<\/code><\/pre>
<\/P>
V prvním příkladu vytvářím jednorázový Workspace Walker objekt, který nemusím uchovávat ani rozebírat. Ve druhém příkladu volání next() v cyklu umožňuje vynechat další smyčku, když mě zajímá pouze jedna úroveň geoprostorových dat.<\/P>
<\/P>
Stejně jako u většiny věcí v životě není jen jeden způsob, jak vypsat feature classes v geodatabázi nebo shapefily ve složce. Ve skutečnosti je funkce ArcPy Walk nováček na scéně zavedený v ArcGIS 10.1 SP1. Před ArcPy Walk mohl uživatel použít jednu z mnoha ArcPy funkcí pro výpis (ListDatasets, ListFeatureClasses, ListFiles, ListRasters, ListTables a ListWorkspaces) nebo ArcPy Describe funkci. Osobně dávám přednost ArcPy Walk před ostatními kvůli jeho snadnosti použití a podobnosti s vestavěnou Python funkcionalitou.<\/P>
<\/P>
Hlavním důvodem tohoto blogového příspěvku je sdílet oblast, kde funkce ArcPy Walk selhává, tj. datové zdroje v paměti. Zatímco starší metody výpisu datových zdrojů fungují s in-memory workspace, to neplatí pro ArcPy Walk.<\/P>
>>> arcpy.CreateFeatureclass_management('in_memory', 'test_fc')
<Result 'in_memory\\test_fc'>
>>> arcpy.CreateTable_management('in_memory', 'test_tbl')
<Result 'in_memory\\test_tbl'>
>>> arcpy.CreateRasterDataset_management('in_memory','test_rd')
<Result 'in_memory\\test_rd'>
>>>
>>> #použití ArcPy Walk
>>> next(arcpy.da.Walk('in_memory'))[2]
[]
>>>
>>> #použití ArcPy funkcí pro výpis
>>> arcpy.env.workspace = 'in_memory'
>>> arcpy.ListFeatureClasses()
[u'test_fc']
>>> arcpy.ListTables()
[u'test_tbl']
>>> arcpy.ListRasters()
[u'test_rd']
>>> arcpy.ListDatasets()
[u'test_rd']
>>>
>>> #použití ArcPy Describe funkce
>>> [child.name for child in arcpy.Describe('in_memory').children]
[u'test_tbl', u'test_fc', u'test_rd']
>>>
<\/code><\/pre>
<\/P>
Nepodpora in-memory workspace není víc než zakolísání, ale přesto zakolísání. Koneckonců dokumentace uvádí první parametr jako "top-level workspace", a přesto není zmínka o tom, že in-memory workspace nejsou podporovány. Naštěstí pro uživatele existují alespoň dva další způsoby jak vypsat datové zdroje v paměti.<\/P>
<\/P>
AKTUALIZACE 06\/2017:<\/STRONG><\/P>
<\/P>
Od napsání tohoto blogového příspěvku před téměř 18 měsíci (vím, "čas letí", ale už 18 měsíců?) jsem zjistil, že problém s ArcPy Walk a in-memory workspace je složitější než jsem původně myslel. Dovolte mi to ukázat:<\/P>
>>> arcpy.CreateFeatureclass_management('in_memory', 'test_fc')
<Result 'in_memory\\test_fc'>
>>> arcpy.CreateTable_management('in_memory', 'test_tbl')
<Result 'in_memory\\test_tbl'>
>>> arcpy.CreateRasterDataset_management('in_memory','test_rd')
<Result 'in_memory\\test_rd'>
>>>
>>> # použití ArcPy Walk s "GPInMemoryWorkspace" místo běžného "in_memory"
>>> next(arcpy.da.Walk('GPInMemoryWorkspace'))[2]
[u'test_tbl', u'test_fc', u'test_rd']
>>> <\/code><\/pre>
<\/P>
Z toho vyplývá, že ArcPy Walk funguje dobře s in-memory workspace, pokud skutečně ví, že ukazujete na in-memory workspace. Opravdu frustrující část a dokonce trochu lítostivá je ta, že jde čistě o terminologii a Esri stále nedokáže tento problém opravit. Funkčně již ArcPy Walk pracuje s in-memory workspace, jen funkce neví, že všichni ostatní a všechny ostatní nástroje označují tyto prostory jako "in_memory" místo "GPInMemoryWorkspace".<\/P>