Script som automatiserer oppdateringen av en ArcGIS Online Hosted Feature Service. 1) Bytt ut: stien til MXDen = path2MXD tjenestenavnet = serviceName brukernavn passord til din organisasjonskonto så vil skriptet kjøre. Script og mxd i samme mappe! CD DOS til samme mappe som script og mxd
OBS! Hvis ikke ArcGISConnection.exe kjører kan du få en feilmelding om at 'My Hosted Services' ikke fins. Dette kan løses ved å ha ArcMap kjørende (se NIM091175 for bug angaænde dette).
Videre oppfølging skrive loggfil for status
Logg: 2013.07.04 - Første utgave Trøbbel med norske tegn: Skript feilet: 'ascii' codec can't decode byte 0xe5 in position 6: ordinal not in range(128). Workaround remove all norwegian characters Valgt # -*- coding: iso-8859-15 -*- se http://no.wikipedia.org/wiki/ISO_8859 Foruten Unicode finnes de nordiske bokstavene �?�?�?�?�? og äåæöø (i den rekkefølgen) i følgende tegnsett: ISO-8859-1, ISO-8859-4, ISO-8859-9, ISO-8859-10, ISO-8859-14, ISO-8859-15 og ISO-8859-16. Bare de to siste av denne tegnsettfamilien inneholder eurotegnet �?�..encode('iso8859_10')u foran teksstrenger setter den til unicode literal bnyttes på overskrifter 2013.07.08 Lang runde med testing på write f se step X Feil ble løst ved å legge Layer inn i nytt tomt mxd Dokument, se nærmere på hvordan denne type feil kan identifiseres. '''
import arcpy, os , sys import geodatamail import xml.dom.minidom as DOM import codecs
# Step 1 Hovedvariabler # PubAGOLTEST arcpy.env.overwriteOutput = True serviceName = 'TestVeglogg' tempPath= os.path.dirname(sys.argv[0]) # Henter mappen som scriptet ligger i ##tempPath = geodatamail.temp_dir() # Henter mappen som scriptet ligger i ##path2MXD = os.path.join(tempPath, 'PubAGOLTEST.mxd') # Denne peker på en mxd som ligger i samme mappe som scriptet path2MXD = os.path.join(tempPath, 'AGOLPUBLISH10.2.mxd') # Denne peker på en mxd som ligger i samme mappe som scriptet #Bytt ut med real input agol_brukernavn = 'xxx' agol_passord = 'xxx' arcpy.env.workspace = tempPath
try: # Step 2 Logg på ArcGIS Online og lag en SDdraft (utkast til karttjeneste) arcpy.SignInToPortal_server(agol_brukernavn, agol_passord, 'http://www.arcgis.com/') mxd = arcpy.mapping.MapDocument(path2MXD) arcpy.mapping.CreateMapSDDraft(mxd, SDdraft, serviceName, inServer) del mxd arcpy.AddMessage(' Signed in on Arcgis Online with user: ' + agol_brukernavn) arcpy.AddMessage(' Path: ' + tempPath) arcpy.AddMessage(' Prosjekt: ' + str(path2MXD)) arcpy.AddMessage(' Draft: ' + str(SDdraft)) arcpy.AddMessage(' Servicename: ' + str(serviceName))
# Les karttjenesedokumentet inn i en XML-parser # add capabilities doc = DOM.parse(SDdraft) ## arcpy.AddMessage(doc.toprettyxml())
#Step 3a Gå igjennom dokumentet arcpy.AddMessage(' Går igjennom MXD: ' + str(path2MXD)) tagsType = doc.getElementsByTagName('Type') for tagType in tagsType: if tagType.parentNode.tagName == 'SVCManifest': if tagType.hasChildNodes(): tagType.firstChild.data = 'esriServiceDefinitionType_Replacement'
tagsState = doc.getElementsByTagName('State') for tagState in tagsState: if tagState.parentNode.tagName == 'SVCManifest': if tagState.hasChildNodes(): tagState.firstChild.data = 'esriSDState_Published'
#Step 3b Bytt fra vanlig karttjeneste til en som støtter redigering arcpy.AddMessage(' Bytter fra vanlig karttjeneste til en som støtter redigering') typeNames = doc.getElementsByTagName('TypeName') for typeName in typeNames: if typeName.firstChild.data == 'MapServer': typeName.firstChild.data = 'FeatureServer'
#Step 3c Skru på redigeringsmuligheter arcpy.AddMessage(' Skru på redigeringsmuligheter') configProps = doc.getElementsByTagName('Info')[0] propArray = configProps.firstChild propSets = propArray.childNodes for propSet in propSets: keyValues = propSet.childNodes for keyValue in keyValues: if keyValue.tagName == 'Key': if keyValue.firstChild.data == 'WebCapabilities': keyValue.nextSibling.firstChild.data = 'Query,Create,Update,Delete,Uploads,Editing'
#Step 3d Skru av caching arcpy.AddMessage(' Skrur av caching')
configProps = doc.getElementsByTagName('ConfigurationProperties')[0] propArray = configProps.firstChild propSets = propArray.childNodes for propSet in propSets: keyValues = propSet.childNodes for keyValue in keyValues: if keyValue.tagName == 'Key': if keyValue.firstChild.data == 'isCached': keyValue.nextSibling.firstChild.data = 'false'
#Step 4 Lagre den modifiserte karttjenesten arcpy.AddMessage(' Lagrer den modifiserte karttjenesten: ' + newSDdraft) # Write the new draft to disk # output to a new sddraft try: if os.path.exists(newSDdraft): os.remove(newSDdraft) f = open(newSDdraft, 'w+') doc.writexml(f) f.close() arcpy.AddMessage( ' TEST Step3 OK')
#Step 5 Analyser kartdokumentet før det publiseres (påkrevd) try: arcpy.AddMessage(' Analyserer kartdokumentet før det publiseres (påkrevd)') analysis = arcpy.mapping.AnalyzeForSD(newSDdraft) arcpy.AddMessage(' Test step 4 OK')
if analysis['errors'] == {}: # Lager karttjenestedokument ut fra draften arcpy.AddMessage(' Test step 5 Stage before') # Feiler her 20140130 arcpy.StageService_server(newSDdraft, SD) arcpy.AddMessage(' Test step 6 Stage after')
# Laster opp tjenesten. Her settes det om tjenesten skal være offentlig # tilgjengelig eller om den skal bare være synlig for organisasjonen. arcpy.AddMessage(' Starter å laste opp tjenesten') arcpy.UploadServiceDefinition_server(SD, inServer, serviceName, '', '', '', '', 'OVERRIDE_DEFINITION', 'SHARE_ONLINE', 'PRIVATE', 'SHARE_ORGANIZATION', '') ##geodatamail.sendEmail('minmail@minorganisasjon.no','Oppdaterte karttjeneste: {0}'.format(serviceName), '') arcpy.AddMessage('Tjeneste - ferdig lastet opp') else: arcpy.AddMessage(analysis['errors']) ##geodatamail.sendEmail('minmail@minorganisasjon.no','Feil i kartdokumentet', 'Feilmelding:\n{0}'.format(analysis['errors'])) except: arcpy.AddMessage( ' Feil Lagring doc') except: arcpy.AddMessage(' Error on DocWrite')
except Exception as feil: arcpy.AddMessage('Skript feilet: {0}'.format(feil)) ##geodatamail.sendEmail('minmail@minorganisasjon.no', 'Skript for oppdatering av {0} feilet'.format(serviceName), 'FEILMELDING: \n{0}'.format(feil))