Soms is het nodig om op een bepaalde manier bijlagen te beheren, in dit artikel behandelen we enkele concepten en later op mijn github zullen er verschillende voorbeelden zijn die u naar wens kunt aanpassen.<\/P>
Om te beginnen, om toegang te krijgen tot de diensten van ArcGIS Enterprise (Portal) of ArcGIS Online is de arcgis bibliotheek vereist, dus als u deze niet hebt geïnstalleerd, moet u dat doen (deze wordt meegeleverd wanneer ArcGIS Pro wordt geïnstalleerd of binnen de Python van ArcGIS Enterprise).<\/P>
Deze eerste sectie stelt u in staat om toegang te krijgen tot uw Portal of ArcGIS Online<\/P>
#Verbinden met het Portal
PORTAL = GIS("url", "gebruiker","wachtwoord")<\/P>
Afhankelijk van wat u doet kan het nodig zijn om de token te verkrijgen, dit wordt voornamelijk gebruikt wanneer u de url van de bijlagen wilt zien en de service niet openbaar is.<\/P>
token = PORTAL._con.token<\/P>
Daarna kunnen we toegang krijgen tot de service, de arcgis api maakt het mogelijk om toegang te krijgen tot de objecten die zijn opgeslagen in het Portal of ArcGIS Online, hiervoor gaan we vanaf onze site naar het adres van de service (het is degene met het gele icoon met rood). (Het is een tekst dus moet tussen aanhalingstekens staan)<\/P>
service = PORTAL.content.get('item id')<\/P>
Wanneer we dit gedeelte bereiken kunnen we de verschillende lagen en tabellen zien die de service bevat die we raadplegen, daarom moet het nummer worden opgegeven dat het indexnummer van laag of tabel aangeeft, en hier moet ik verduidelijken dat als we bijvoorbeeld: een geografische entiteit en een tabel hebben, beide index 0 zullen hebben, dit omdat het systeem detecteert als een lijst van lagen en een lijst van tabellen binnen de service, dus in het geval dat er een laag en een tabel zijn, hebben beide index 0. Nu als er twee lagen en een tabel zijn, zal er een laag zijn met index 0, de andere met 1 en de tabel zal 0 zijn. Ik hoop hiermee geen verwarring te veroorzaken haha.<\/P>
Het punt is dat ik voor parametrisatie het volgende heb gedaan:<\/P>
num_capa=int(indice)<\/P>
Opmerking: het is een numerieke waarde dus u typt gewoon de waarde in<\/P>
Zoals eerder aangegeven kunnen er lagen of tabellen bestaan, op deze manier kan het ook zo zijn dat de bijlagen zich bevinden in een laag of een tabel, daarom voelde ik me genoodzaakt iets dergelijks aan het gereedschap toe te voegen:<\/P>
tipo="hier schrijft u laag of tabel"
if tipo=="capa":
capa=(service.layers)[num_capa]
elif tipo=="tabla":
capa =(service.tables)[num_capa]<\/P>
Om de URL op te bouwen geeft dezelfde Esri API aan hoe deze te verkrijgen, alleen doet hij dat niet als tekst maar als object, dus heb ik het volgende gedaan met behulp van de python re bibliotheek:<\/P>
cap_url=str(re.findall('htt.*'+str(num_capa), str(capa)))
cap_url=str(cap_url)[2:-2]<\/P>
Op deze manier wordt het object omgezet in een string (tekst)<\/P>
Nu moeten we de map identificeren waarin we de bijlagen gaan opslaan
carpeta=r"adres van de gewenste map"<\/P>
Een andere parameter die ik gebruik is een leeg tekstveld waar ik het adres zal opslaan waar de bijlagen worden opgeslagen, zodat dit kan worden geparametriseerd met de pandas dataframe en precies wat we hier gaan doen:<\/P>
sdf = capa.query(where="naam van het veld"+" IS NULL").sdf<\/P>
Op deze manier gaat de query alleen naar degenen die dat veld leeg hebben<\/P>
Daarna wordt er een lege lijst gemaakt die de records zal vastleggen die we binnen een bewerking gaan opnemen, dit zal later erg belangrijk zijn omdat het toestaat gegevens in de lege lijst in te voeren en ze naar de bewerkingsmethode te sturen, afhankelijk van wat we doen.<\/P>
elementos_a_actualizar = []<\/P>
Nu moeten we itereren over de laag of tabel die de bijlagen heeft<\/P>
#Itereren door dataframe
for index, row in sdf.iterrows():
objID=str("veld dat objectid bevat")
Attachments = capa.attachments.get_list(oid=objID)<\/P>
Binnen dezelfde iteratie plaatste ik een if, zoals u kunt zien in bovenstaande regels wordt er een lijst gemaakt in Attachments, daarom is een kenmerk van lijsten dat we het aantal elementen kunnen tellen en precies dat doet de if, omdat we alleen zullen vragen waar deze lijst groter is dan 0, zo zijn we dubbel zeker dat we alleen werken met gegevens die bijlagen hebben.<\/P>
if len(Attachments)>0:<\/P>
Binnen deze voorwaarde gaan we itereren over de bijlagen die horen bij elk ObjectId van de hoofdlaag:<\/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>
Zoals u kunt zien wordt het Id van de bijlage en de naam verkregen, hiermee concateneer ik de eerder verkregen url met het objectid van de laag of tabel en het Id van de bijlage. Zo wordt er een unieke URL verkregen voor elke bijlage.<\/P>
Ook hiermee is het mogelijk om het adres van de map die ik eerder had en de bestandsnaam die bijlage heeft samen te voegen.<\/P>
Hiermee kan men wat spelen, in dit geval ga ik iets laten zien zodat het systeem weet of er al een bijlage met dezelfde naam is gedownload in de map die u aangeeft, daarom zou die bijlage niet worden gedownload. Maar het is ook mogelijk om aan te geven dat er voor elk item een map wordt gemaakt en daarin alle bijlagen voor dat record worden gedownload. In dit geval doe ik het zo dat hij het bestand maakt, een andere keer laat ik zien hoe je die map maakt, wat overigens te vinden is in het script van download bijlagen op github.<\/A><\/P>Nou zoals gezegd hier is het gedeelte om te controleren of het bestand bestaat:<\/P>
existe_archiv=os.path.exists(fileName)
if existe_archiv is True:
arcpy.AddMessage("Niet downloaden")
else:
arcpy.AddMessage("Download ShapeFile "+attachmentName)<\/P>
Zoals u kunt zien gebruik ik hier os en arcpy bibliotheken, os wordt gebruikt om te controleren of het bestand bestaat in de map die we aangeven en arcpy wordt hier gebruikt om een bericht terug te geven binnen ArcGIS, wat overigens als u dit niet gebruikt kunt vervangen door print.<\/P>
Nu kunnen we met de URL de bijlagen downloaden<\/p>
try:
brpy.AddMessage("URL van ShapeFile ophalen")
<br /><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
arcpy.AddMessage("ShapeFile " + attachmentName + " succesvol gedownload naar map " + carpeta)
Hier verwijdert hij vervolgens ook nog eens de bijlage uit de laag
&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;&&&&&&&&&&&&&&&&&&&&&&&&&&&
we vroegen om terug te keren waar de lijst meer dan 0 elementen had) zullen we de methode gebruiken die de gegevens vastlegt en deze aan onze lege lijst toevoegt.<\/P>#Update het veld van het mapadres
selectie=capa.query(where="veld van objectid"+"="+objID)
element_bijwerken=(selectie.features[0])
element_bijwerken.attributes["naam van het veld"]=str(fileName)<\/P>
Nu voegen we de records toe die we vastleggen en die bijlagen hebben en het veld dat het lege adres zal bevatten
elementen_te_bijwerken.append(element_bijwerken)<\/P>
Nadat we deze gegevens aan de lege lijst hebben toegevoegd, met deze methode, zullen we de lijst gebruiken om de elementen te bewerken. Dit gebeurt buiten de iteratie van de dataframe, dus het is buiten alles.<\/P>
capa.edit_features(updates=elementen_te_bijwerken)<\/P>
Zoals je kunt zien, geeft updates aan dat het gelijk is aan de eerder aangegeven lege lijst.<\/P>
En dat is alles, ik heb verschillende voorbeelden in mijn
GitHub<\/A>, hierin download ik bijlagen en verwijder ik ze uit de service, of ik download ze gewoon, of in een ander geval download ik bijlagen die shapefiles zijn en voeg ik ze toe aan een andere service als nieuwe entiteiten, ik leg graag later uit hoe ze werken.<\/P>Een andere heel belangrijke zaak die ik moet verduidelijken is dat de toolbox die is bijgevoegd voor versie 3 en hoger is, als je een versie ouder dan 2.9 hebt, moet je de toolbox configureren, daarom voeg ik ook de scripts toe zodat je deze kunt personaliseren. Hier laat ik een
link<\/A> achter die een kleine gids is om tools te configureren met versies lager dan 2.9<\/STRONG><\/P>Ik hoop dat het helpt<\/P>
<\/P>