Někdy je nutné nějakým způsobem spravovat přílohy, v tomto článku pokryjeme určité koncepty a později na mém githubu budou různé příklady, které si můžete upravit podle svého gusta.<\/P>
Pro začátek, abyste mohli přistupovat ke službám ArcGIS Enterprise (Portal) nebo ArcGIS Online, je potřeba knihovna arcgis, takže pokud ji nemáte nainstalovanou, musíte tak učinit (je součástí instalace ArcGIS Pro nebo Pythonu v ArcGIS Enterprise).<\/P>
Tato první sekce vám umožní přístup k vašemu Portalu nebo ArcGIS Online<\/P>
#Připojení k Portalu
PORTAL = GIS("url", "usuario","contraseña")<\/P>
V závislosti na tom, co děláte, může být nutné získat token, to se používá hlavně když chcete vidět url příloh a služba není veřejná.<\/P>
token = PORTAL._con.token<\/P>
Poté už můžeme přistoupit ke službě, API arcgis umožňuje přístup k objektům uloženým v Portalu nebo ArcGIS Online, pro to z našeho webu přistoupíme na adresu služby (je to ta s ikonou žlutou s červenou). (Je to text, takže musí být v uvozovkách)<\/P>
servicio = PORTAL.content.get('item id')<\/P>
Když pak přistoupíme k této části, můžeme vidět různé vrstvy a tabulky, které služba obsahuje, proto je potřeba zadat číslo označující index vrstvy nebo tabulky, a tady musím upřesnit, že pokud máme například: geografickou entitu a tabulku, obě budou mít index 0, protože systém detekuje jako seznam vrstev a seznam tabulek uvnitř služby, proto v případě existence jedné vrstvy a jedné tabulky mají obě index 0. Pokud jsou dvě vrstvy a jedna tabulka, bude jedna vrstva s indexem 0, druhá s 1 a tabulka bude 0. Doufám, že tím nezpůsobím zmatek hehe.<\/P>
Podstata je v tom, že pro parametrizaci jsem udělal toto:<\/P>
num_capa=int(indice)<\/P>
Poznámka: je to číselná hodnota, takže jednoduše napíšete hodnotu<\/P>
Jak jsem uvedl dříve, mohou existovat vrstvy nebo tabulky, také může být, že přílohy jsou ve vrstvě nebo v tabulce, proto jsem musel do nástroje přidat něco takového:<\/P>
tipo="tady se napíše capa nebo tabla"
if tipo=="capa":
capa=(servicio.layers)[num_capa]
elif tipo=="tabla":
capa =(servicio.tables)[num_capa]<\/P>
Pro sestavení URL nám samotné API Esri ukazuje jak ji získat, jenže to nedělá jako text ale jako objekt, tak jsem udělal toto pomocí python knihovny re:<\/P>
cap_url=str(re.findall('htt.*'+str(num_capa), str(capa)))
cap_url=str(cap_url)[2:-2]<\/P>
Tímto způsobem se objekt převede na string (text)<\/P>
Teď musíme identifikovat složku, do které budeme ukládat přílohy
carpeta=r"adresa požadované složky"<\/P>
Další parametr který používám je prázdné textové pole kam budu ukládat adresu kde jsou uloženy přílohy, tímto způsobem lze parametrizovat s pandas dataframe a právě to uděláme zde:<\/P>
sdf = capa.query(where="název pole"+" IS NULL").sdf<\/P>
Tímto způsobem dotaz půjde pouze na ty co mají toto pole prázdné<\/P>
Poté se vytvoří prázdný seznam který zachytí záznamy které budeme zahrnovat do editace, to bude velmi důležité později protože umožňuje vložit data do prázdného seznamu a odeslat je editační metodě podle toho co děláme.<\/P>
elementos_a_actualizar = []<\/P>
Teď už musíme iterovat ve vrstvě nebo tabulce která má přílohy<\/P>
#Iterovat přes dataframe
for index, row in sdf.iterrows():
objID=str("pole obsahující objectid")
Attachments = capa.attachments.get_list(oid=objID)<\/P>
Uvnitř téže iterace jsem dal if, jak vidíte v předchozích řádcích se vytvoří seznam v Attachments, charakteristika seznamů je ta že můžeme spočítat počet prvků a přesně to if dělá protože budeme dotazovat pouze tam kde je délka tohoto seznamu větší než 0, tím budeme mít jistotu že budeme pracovat pouze s daty která mají přílohy.<\/P>
if len(Attachments)>0:<\/P>
Uvnitř této podmínky budeme iterovat přílohy odpovídající každému ObjectId hlavní vrstvy:<\/P>
for k in range(len(Attachments)):
attachmentId = Attachments[k]['id']
attachmentName = Attachments[k]['name']
img_url = cap_url+"\/{0}\/attachments\/{1}".format(objID,attachmentId)+"?token="+token
fileName = os.path.join(carpeta, attachmentName)<\/P>
Jak vidíte získáme Id přílohy a jméno, tímto spojím url získanou dříve s objectid vrstvy nebo tabulky a Id přílohy. Takto vznikne unikátní URL pro každou přílohu.<\/P>
Také tímto lze spojit adresu složky kterou jsme měli dříve a název souboru který má příloha.<\/P>
S tímto lze trochu experimentovat, v tomto případě vám ukážu něco aby systém věděl jestli už byl stažený příloha se stejným názvem ve složce kterou mu zadáváte, proto by tu přílohu nestahoval. Ale také je možné říct aby vytvořil složku pro každý prvek a do ní stáhl všechny přílohy odpovídající tomuto záznamu. V tomto případě to udělám tak aby vytvořil soubor, jindy vám ukážu jak vytvořit složku což mimochodem najdete ve skriptu descarga adjuntos del github.<\/A><\/P>No dobře jak jsem říkal tady část pro kontrolu jestli příloha existuje:<\/P>
existe_archiv=os.path.exists(fileName)
if existe_archiv is True:
arcpy.AddMessage("Ne stahovat")
else:
arcpy.AddMessage("Stahování ShapeFile " + attachmentName)<\/P>
Jak vidíte používám knihovny os a arcpy v této části, os slouží k ověření existence souboru ve složce kterou jsme zadali a arcpy zde slouží k vrácení zprávy uvnitř ArcGISu což mimochodem pokud nepoužíváte můžete nahradit arcpy.AddMessage za print.<\/P>
Teď už s URL můžeme stahovat přílohy<\/P>
try:
"Čiám URL ShapeFile"
 request=urllib.request.urlretrieve(img_url)
 req = requests.get(img_url)
 pfile = open(fileName, 'wb')
 pfor chunk in req.iter_content(100000):
 pfile.write(chunk)
 pfile.close()
 arcpy.AddMessage("ShapeFile " + attachmentName + " úspěšně stažen do složky " + carpeta)<\/P>
Tady smaže přílohu z vrstvy
 pcapa.attachments.delete(objID , attachmentId ) < / P > < P cl ass=22 lia - align - justi fy22 styl e=22 text - align: justi fy;22 >Tady zachytíme chybu pro zobrazení v systému (v mém případě jsem stahoval shapefiles proto zpráva říká toto.< / P > < P cl ass=22 lia - align - justi fy22 styl e=22 text - align: justi fy;22 >< BR / >except urllib.error.HTTPError as err:< BR / > arcpy.AddMessage("Chyba " + str(err.code) + " neexistuje ShapeFile ke stažení nebo je problém s připojením") < / P > < P cl ass=22 lia - align - justi fy22 styl e=22 text - align: justi fy;22 >V tuto chvíli a uvnitř odsazení if (kde žádali jsme, aby nám vrátil, kde seznam měl více než 0 prvků) použijeme metodu, která zachytí data a připojí je k našemu prázdnému seznamu.<\/P>
#Aktualizovat pole adresy složky
seleccion=capa.query(where="campo del objectid"+"="+objID)
elem_actualizar=(seleccion.features[0])
elem_actualizar.attributes["nombre del campo"]=str(fileName)<\/P>
Nyní připojíme záznamy, které zachytáváme a které mají přílohy a pole, které bude obsahovat prázdnou adresu
elementos_a_actualizar.append(elem_actualizar)<\/P>
Poté, co tyto údaje připojíme do prázdného seznamu touto metodou, přistoupíme k použití seznamu pro úpravu prvků. To se provádí mimo iteraci dataframe, tedy je to mimo vše.<\/P>
capa.edit_features(updates=elementos_a_actualizar)<\/P>
Jak můžete vidět, updates označuje, že je rovno dříve uvedenému prázdnému seznamu.<\/P>
A to je vše, mám několik příkladů na mém
GitHubu<\/A>, kde stahuji přílohy a mažu je ze služby, nebo je jednoduše stahuji, nebo v jiném případě stahuji přílohy, které jsou shapefiles a připojuji je k jiné službě jako nové entity, rád vám mohu později vysvětlit, jak fungují.<\/P>Další velmi důležitá věc, kterou musím objasnit, je, že toolbox, který je přiložený, je pro verzi 3 a novější, pokud máte verzi starší než 2.9, je třeba toolbox nakonfigurovat, proto také přikládám skripty, abyste si jej mohli přizpůsobit. Zde nechávám
odkaz<\/A>, což je malý průvodce konfigurací nástrojů s verzemi nižšími než 2.9<\/STRONG><\/P>Doufám, že vám to pomůže<\/P>
<\/P>