<\/HEAD>
Dans le cadre du Programme Waze Connected Citizen (CCP)<\/A>, les partenaires ont accès aux congestions de trafic en temps réel et aux incidents signalés via l'application Waze (aux formats XML et JSON). Il existe déjà des techniques et une documentation<\/A> sur la manière de consommer ces données dans une plateforme ArcGIS en utilisant GeoEvent.<\/P><\/P>
Dans ce blog, je décrirai une technique pour consommer ces données dans ArcGIS Online via Python et le Planificateur de tâches Windows. Le
script Python initial<\/A> a été développé par Joel Meier<\/A> que j'ai modifié pour correspondre au flux de travail proposé. Une mention spéciale va également à mes collègues Edmund Hall<\/A> et Louis Tian<\/A> qui m'ont aidé à déboguer. Et enfin, je tiens à remercier Andrew Stauffer<\/A> pour nous avoir aidés à collaborer et à tirer le meilleur parti du Waze CCP<\/A>.<\/P><\/P>
Point - Couche d'entités<\ /SPAN ><\ /H4 >OBJECTID (type : esriFieldTypeOID, alias : OBJECTID, type SQL : sqlTypeOther, longueur : 0, nullable : false, modifiable : false)*<\ /STRONG ><\ /EM ><\ /SPAN ><\ /LI >DateReported (type : esriFieldTypeDate, alias : DateReported, type SQL : sqlTypeTimestamp2, longueur : 0, nullable : true, modifiable : true)<\ /EM ><\ /SPAN ><\ /LI >Title (type : esriFieldTypeString, alias : Title, type SQL : sqlTypeOther, longueur : 25, nullable : true, modifiable : true)<\ /EM ><\ /SPAN ><\ /LI >ReportType (type : esriFieldTypeString, alias : ReportType, type SQL : sqlTypeOther, longueur : 25, nullable : true, modifiable : true)<\ /EM ><\ /SPAN ><\ /LI >ReportSubtype (type : esriFieldTypeString, alias : ReportSubtype, type SQL : sqlTypeOther, longueur : 50, nullable : true, modifiable : true)<\ /EM ><\ /SPAN ><\ /LI >Street (type : esriFieldTypeString, alias : Street, type SQL : sqlTypeOther, longueur : 256, nullable : true, modifiable : true)<\ /EM ><\ /SPAN ><\ /LI >City (type : esriFieldTypeString, alias : City, type SQL : sqlTypeOther, longueur : 50, nullable : true, modifiable : true)<\ /EM ><\ /SPAN ><\ /LI >Description (type : esriFieldTypeString, alias : Description, type SQL : sqlTypeOther, longueur : 1024, nullable : true, modifiable : true)<\ /EM ><\ /SPAN ><\ /LI >Reliability (type : esriFieldTypeInteger, alias : Reliability, type SQL : sqlTypeOther, nullable : true, modifiable : true)<\ /EM ><\ /SPAN ><\ /LI >UUID (type : esriFieldTypeString, alias : UUID, type SQL : sqlTypeOther, longueur : 100, nullable : true, modifiable : true)<\ /EM ><\ /SPAN ><\ /LI ><\ /UL >CreationDate (type : esriFieldTypeDate , alias : CreationDate , type SQL : sqlTypeOther , longueur : 8 , nullable : true , non modifiable : false )*< \ /STRONG > < \ / EM > < \ / SPAN > < \ LI > < LI style = Description, Type SQL : sqlTypeOther, longueur : 1024, nullable : true, modifiable : true)<\/EM><\/SPAN><\/LI>UUID (type : esriFieldTypeDouble, alias : UUID, Type SQL : sqlTypeOther, nullable : true, modifiable : true)<\/EM><\/SPAN><\/LI><\/UL>Shape__Length (type : esriFieldTypeDouble, alias : Shape__Length, Type SQL : sqlTypeDouble, nullable : true, non modifiable)*<\/STRONG><\/EM><\/SPAN><\/LI>CreationDate (type : esriFieldTypeDate, alias : CreationDate, Type SQL : sqlTypeOther, longueur : 8, nullable : true, non modifiable)*<\/STRONG><\/EM><\/SPAN><\/LI>Creator (type : esriFieldTypeString, alias : Creator, Type SQL : sqlTypeOther, longueur : 128, nullable : true, non modifiable)*<\/STRONG><\/EM><\/SPAN><\/LI>EditDate (type : esriFieldTypeDate, alias : EditDate, Type SQL : sqlTypeOther, longueur : 8, nullable : true, non modifiable)*<\/STRONG><\/EM><\/SPAN><\/LI>Editor (type : esriFieldTypeString, alias : Editor, Type SQL : sqlTypeOther, longueur : 128, nullable : true, non modifiable)*<\/STRONG><\/EM><\/SPAN><\/LI><\/UL>*<\/STRONG>champs pré-remplis<\/EM><\/SPAN><\/P>Veuillez vous assurer d'utiliser les noms de champs exacts et les types<\/EM><\/STRONG>, (sinon vous devrez ajuster le script).<\/SPAN><\/P>Une fois les couches d'entités configurées, veuillez activer l'édition<\/STRONG> et les définir en PRIVÉ<\/STRONG>.<\/SPAN><\/P>Veuillez vous référer aux "Waze Feed Technical Specifications [Get Waze Data]"<\/EM><\/STRONG> du Portail Partenaire<\/A> pour les définitions exactes des descriptions de champs.<\/P><\/BLOCKQUOTE><\/P>
Configuration du script Python<\/H4>Remplacez les sections de commentaires (lignes 6, 9 et 10)<\/SPAN><\/EM> par votre propre flux XML et les URL de vos couches d'entités points et lignes.<\/P><SPAN class="keyword token">import<\/SPAN> xml<SPAN class="punctuation token">.<\/SPAN>etree<SPAN class="punctuation token">.<\/SPAN>ElementTree <SPAN class="keyword token">as<\/SPAN> ET
<SPAN class="keyword token">import<\/SPAN> urllib<SPAN class="punctuation token">.<\/SPAN>request
<SPAN class="keyword token">import<\/SPAN> arcpy
<SPAN class="keyword token">from<\/SPAN> datetime <SPAN class="keyword token">import<\/SPAN> datetime
namespaces <SPAN class="operator token">=<\/SPAN> <SPAN class="punctuation token">{<\/SPAN><SPAN class="string token">'georss'<\/SPAN> <SPAN class="punctuation token">:<\/SPAN> <SPAN class="string token"><SPAN>'<\/'></SPAN><A class="jive-link-external-small" href="https:\/\/community.esri.com\/external-link.jspa?url=http%3A%2F%2Fwww.georss.org%2Fgeorss" target="_blank">http:\/\/.georss.org/georss</A><SPAN>'<\/'></SPAN></SPAN><SPAN class="punctuation token">,<\/'></span> <span class='string token'>'linqmap'<\/'></span>: <span class='string token'><span>'</span><a class='jive-link-external-small' href='https://community.esri.com/external-link.jspa?url=http%3A%2F%2Fwww.linqmap.com' target='_blank'>http://www.linqmap.com</a><span>'</span></span> <span class='punctuation token'>}</span>
tree <span class='operator token'>=</span> ET<ElementTree>(file=urllib.request.urlopen('<span class='comment token'>##URL for XML waze connection##'))
root = tree.getroot()
channel_head = []
fcp = "<span class='comment token'>##URL to Point - Feature Layer##"</span>
fcl = "<span class='comment token'>##URL to Line - Feature Layer##"</span>
for member in root.findall('channel/item'):
channel = []
Title = member.find('title').text.upper()
try:
point = member.find('georss:point', namespaces)
line = member.find('georss:line', namespaces)
except:
pass
print('Fail Stage 0')
if point != None:
try:
Date = member.find('pubDate').text
DateReported = datetime.strptime(Date, '%a %b %d %H:%M:%S %z %Y')
if len(member.findall('linqmap:city', namespaces)) > 0:
City = member.find('linqmap:city', namespaces).text
else:
City = ''
if len(member.findall('linqmap:street', namespaces)) > 0:
Street = member.find('linqmap:street', namespaces).text
else:
Street = ''
if len(member.findall('linqmap:subtype', namespaces)) > 0 and member<punctuation token">.<\/SPAN>find<SPAN class="punctuation token">(<\/SPAN><SPAN class="string token">'linqmap:subtype'<\/SPAN><SPAN class="punctuation token">,<\/SPAN> namespaces<SPAN class="punctuation token">)<\/SPAN><SPAN class="punctuation token">.<\/SPAN>text <SPAN class="keyword token">n'est pas<\/SPAN> None<SPAN class="punctuation token">:<\/SPAN>
Sous-type <SPAN class="operator token">=<\/SPAN> member<SPAN class="punctuation token">.<\/SPAN>find<SPAN class="punctuation token">(<\/SPAN><SPAN class="string token">'linqmap:subtype'<\/SPAN><SPAN class="punctuation token">,<\/SPAN> namespaces<SPAN class="punctuation token">)<\/SPAN><SPAN class="punctuation token">.<\/SPAN>text<SPAN class="punctuation token">.<\/SPAN>replace<SPAN class="punctuation token">(<\/SPAN><SPAN class="string token">'_'<\/SPAN><SPAN class="punctuation token">,<\/SPAN> <SPAN class="string token">' '<\/SPAN><SPAN class="punctuation token">)<\/SPAN><SPAN class="punctuation token">.<\/SPAN>capitalize<SPAN class="punctuation token">(<\/SPAN><SPAN class="punctuation token">)<\/SPAN>
<SPAN class="keyword token">sinon<\/SPAN><SPAN class="punctuation token">:<\/SPAN>
Sous-type <SPAN class="operator token">=<\/SPAN> <SPAN class="string token">''<\/Span>
UUID <span class="operator token">=<\/span> member<span class="punctuation token">.<\/span>find<span class="punctuation token">(<\/span><span class="string token">'linqmap:uuid'<\/span><span class="punctuation token">,<\/span> namespaces<span class="punctuation token">)<\/span><span class="punctuation token">.<\/span>text
Fiabilité <span class="operator token">=<\/span> member<span class="punctuation token">.<\/span>find<span class="punctuation token">(<\/span><span class="string token">'linqmap:reliability'<\/span><span class="punctuation token">,<\/span> namespaces<span class="punctuation token">)<\/span><span class="punctuation token">.<\/span>text
<span class="keyword token">si<\/span> len<span class="punctuation token">(<\/span>member<span class="punctuation token">.<\/span>findall<span class="punctuation token">(<\/span><span class="string token">'linqmap:reportDescription'<\/span><span class="punctuation token">,<\/span> namespaces<span class="punctuation token">)<\/span><span class="punctuation token">)<\/span> <span class="operator token">3E<\/span> <span class="number token">0<\/span><span class="punctuation token">:<\/span>
Description <span class="operator token">=<\/span> member<span class="punctuation token">.<\/span>find<span class="punctuation token">(<\/span><span class="string token">'linqmap:reportDescription'<\/span><span class="punctuation token">,<\/span> namespaces<span class="punctuation token">)<\/span><span class="punctuation token">.<\/span>text
<span class="keyword token">sinon<\/span><span class="punctuation token">:<\/span>
Description <span class="operator token">=<\/span> <span class="string token">''<\/Span>
Type <Span Class= "operator Token" > = < \/ Span > Member < Span Class = "Punctuation Token" > . < \/ Span > Find < Span Class = "Punctuation Token" > ( < \/ Span > < Span Class = "String Token" > 'linqmap:type' < \/ Span > < Span Class = "Punctuation Token" > , < \/ Span > Namespaces < Span Class = "Punctuation Token" > ) < \/ Span > . Text < Span Class = "Punctuation Token" > . Replace < \/ Span > ( < Span Class = "String Token" > '_' < \/ Span > , < Span Class = "String Token" > ' ' < \/ Span > ) . Capitalize ( )
point <Span Class= "Operator Token" >=< \/Span > member<Span Class= "Punctuation Token" > . < \/Span > find<Span Class= "Punctuation Token" >(<'georss:point'><\ /Span>, namespaces<Span Class= "Punctuation Token" ><\ /Span>).text.replace(' -',',-').split(' ')
ligne <Span Class= "Operator Token" >=< \/Span > Sous-type, Type, Titre, DateSignalée, Ville, Rue, UUID, Fiabilité, Description, float(point[1]), float(point[0])
curseur <Span Class= "Operator Token" >= arcpy.da.InsertCursor(fcp, ["ReportSubtype", "ReportType", "Title", "DateReported", "City", "Street", "UUID", "Reliability", "Description", "SHAPE@X", "SHAPE@Y"])
curseur.insertRow(ligne)
del curseur
print('étape 1')
except:
pass
print('échec Étape 1')
elif ligne != None:
if Titre != 'IRREGULARITY':
try:
Date = member.find('pubDate').text
DateSignalée = datetime.strptime(Date, '%a %b %d %H:%M:%S %z %Y')
if len(member.findall('linqmap:city', namespaces)) > 0:
Ville = member.find('linqmap:city', namespaces).text
else:
Ville = ''
if len(member.findall('linqmap:startNode', namespaces)) > 0:
StartNode = member.find('linqmap:startNode', namespaces).text
else:
StartNode = ''
if len<SPAN class="punctuation token">(<\/SPAN>member<SPAN class="punctuation token">.<\/SPAN>findall<SPAN class="punctuation token">(<\/SPAN><SPAN class="string token">'linqmap:endNode'<\/SPAN><SPAN class="punctuation token">,<\/SPAN> namespaces<SPAN class="punctuation token">)<\/SPAN><SPAN class="punctuation token">)<\/SPAN> <SPAN class="operator token">><\/SPAN> <SPAN class="number token">0<\/SPAN><SPAN class="punctuation token">:<\/SPAN>\n EndNode <SPAN class="operator token">=<\/SPAN> member<SPAN class="punctuation token">.<\/SPAN>find<SPAN class="punctuation token">(<\/SPAN><SPAN class="string token">'linqmap:endNode'<\/SPAN><SPAN class="punctuation token">,<\/SPAN> namespaces<SPAN class="punctuation token">)<\/SPAN><SPAN class="punctuation token">.<\/SPAN>text\n <SPAN class="keyword token">else<\/SPAN><SPAN class="punctuation token">:<\/SPAN>\n EndNode <SPAN class="operator token">=<\/SPAN> <SPAN class="string token">''<\/SPAN>\n\n <SPAN class="keyword token">if<\/SPAN> len<SPAN class="punctuation token">(<\/SPAN>member<SPAN class="punctuation token">.<\/SPAN>findall<SPAN class="punctuation token">(<\/span><span class="string token">'linqmap:reportDescription'<\/span><span class="punctuation token">,<\/span> namespaces<span class="punctuation token">)<\/span><span class="punctuation token">)<\/span> <span class="operator token">><\/span> <span class="number token">0<\/span><span class="punctuation token">:<\/span>\n Description <span class="operator token">=<\/span> member<span class="punctuation token">.<\/span>find<span class="punctuation token">(<\/span><span class="string token">'linqmap:reportDescription'<\/span><span class="punctuation token">,<\/span> namespaces<span class="punctuation token">)<\/span><span class="punctuation token">.<\/span>text\n <span class="keyword token">else<\/span><span class="punctuation token">:<\/span>\n Description <span class="operator token">=<\/span> <span class="string token">''<\/span>\n\n <span class="keyword token">if<\/span> len<span class="punctuation token">(<\/span>member<span class="punctuation token">.<\/span>findall<span class="punctuation token">(<\/span><span class="string token">'linqmap:street'<\/span><span class="punctuation token">,<\/span> namespaces<span class="punctuation token">)<\/span><span class="punctuation token">)<\/span> <span class="operator token">><\/span> <span class="number token">0<\/span><span class="punctuation token">:<\/span>\n Street <span class="operator token">=<\/span> member<span class="punctuation token">.<\/span>find<span class="punctuation token">(<\/span><span class="string token">'linqmap:street'<\/span><span class="punctuation token">,<\/span> namespaces<span class="punctuation token">)<\/span><span class="punctuation token">.<\/span>text\n <span class="keyword token">else<\/span><span class="punctuation token">:<\/span>\n Street <span class="operator token">=<\/span> <span class="string token">''<\/span>\n\n UUID <span class="operator token">=<\/span> member<span class="punctuation token">.<\/span>find<span class="punctuation token">(<\/span><span class="string token">'linqmap:uuid'<\/span><span class="punctuation token">,<\/span> namespaces<span class="punctuation token">)<\/span><span class="punctuation token">.<\/span>text\n Type <span class="operator token">=<\/span> member<span class="punctuation token">.<\/span>find<span class="punctuation token"><(</pan><panclass=stringtoken>'linqmap:type'</pan>,namespaces).text.replace('_',' ').capitalize()\n Length <panclass=operatortoken>=</pan> member.find('linqmap:length',namespaces).text\n Level <panclass=operatortoken>=</pan> member.find('linqmap:level',namespaces).text\n line <panclass=operatortoken>=</pan> member.find('georss:line',namespaces).text.replace('\n','').replace(' ','],[').replace'],[-',' , -').split(', ')\n Speed <panclass=operatortoken>=</pan> member.find('linqmap:speed',namespaces).text\n Delay <panclass=operatortoken>=</pan> member.find('linqmap:delay',namespaces).text\n cur <panclass=operatortoken>=</pan> arcpy.da.InsertCursor(fcl, ["Speed","Delay","Title","ReportType","DateReported","City","Street","Length","ReportLevel","UUID","StartNode","EndNode","Description","SHAPE@"] )\n array <panclass=operatortoken>=</pan> arcpy.Array()\n for coords in line:\n xy = coords.split('],[')\n array.add(arcpy.Point(xy[1], xy[0]))\n cur.insertRow([Speed, Delay, Title, Type, DateReported, City, Street, Length, Level, UUID, StartNode, EndNode, Description, arcpy.Polyline(array)])\n del cur\n print( token">'étape 2'<\/SPAN><SPAN class="punctuation token">)<\/SPAN>
<SPAN class="keyword token">sauf<\/SPAN><SPAN class="punctuation token">:<\/SPAN>
<SPAN class="keyword token">passer<\/SPAN>
<SPAN class="keyword token">imprimer<\/SPAN><SPAN class="punctuation token">(<\/SPAN><SPAN class="string token">'échec Étape 2'<\/SPAN><SPAN class="punctuation token">)<\/SPAN>
<SPAN class="keyword token">sinon<\/SPAN><SPAN class="punctuation token">:<\/SPAN>
<SPAN class="keyword token">essayer<\/SPAN><SPAN class="punctuation token">:<\/SPAN>
Date <SPAN class="operator token">=<\/SPAN> membre<SPAN class="punctuation token">.<\/SPAN>trouver<SPAN class="punctuation token">(<\/SPAN><SPAN class="string token">'updateDate'<\/SPAN><SPAN class="punctuation token">)<\/SPAN><SPAN class="punctuation token">.<\/SPAN>texte
DateReported <SPAN class="operator token">=<\/SPAN> datetime<SPAN class="punctuation token">.<\/SPAN>strptime<SPAN class="punctuation token">(<\/SPAN>Date<SPAN class="punctuation token">, <\/SPAN> <SPAN class="string token">'%a %b %d %H:%M:%S %z %Y'<\/SPAN><SPAN class="punctuation token">)<\/SPAN>
<SPAN class="keyword token">si<\/SPAN> len<SPAN class="punctuation token">(<\/SPAN>membre<SPAN class="punctuation token">.<\/SPAN>findall<SPAN class="punctuation token">(<\/SPAN><SPAN class="string token">'linqmap:city'<\/Span><span class=\"punctuation token\">,</span> namespaces<span class=\"punctuation token\">)<\/span><span class=\"punctuation token\">)<\/span> <span class=\"operator token\">><\/span> <span class=\"number token\">0<\/span><span class=\"punctuation token\">:<\/span>
Ville <span class=\"operator token\">=<\/span> membre<span class=\"punctuation token\">.<\/span>trouver<span class=\"punctuation token\">(<\/span><span class=\"string token\">'linqmap:city'<\/span>, namespaces<span class=\"punctuation token\">)<\/span><span class=\"punctuation token\">.<\/span>texte
<span class=\"keyword token\">sinon<\/span><span class=\"punctuation token\">:<\/span>
Ville <span class=\"operator token\">=<\/span> <span class=\"string token\">''<\/span>
<span class=\"keyword token\">si<\/span> len<span class=\"punctuation token\">(<\/span>membre<span class=\"punctuation token\">.<\/span>findall<span class=\"punctuation token\">(<\/span><span class=\"string token\">'linqmap:startNode'<\/span>, namespaces<span class=\"punctuation token\">)<\/span><span class=\"punctuation token\">)<\/span> <span class=\"operator token\">><\/span> <span class=\"number token\">0<\/span><span class=\"punctuation token\">:<\/span>
NoeudDépart <span class=\"operator token\">=<\/span> membre<span class=\"punctuation token\">.<\/span>trouver<span class=\"punctuation token\">(<\/span><span class=\"string token\">'linqmap:startNode'<\/span>, namespaces<span class=\"punctuation token\">)<\/span><span class=\"punctuation token\">.<\/span>texte
<span class=\"keyword token\">sinon<\/span><span class=\"punctuation token\">:<\/span>
NoeudDépart <span class=\"operator token\">=<\/span> <span class=\"string token\">''<\/span>
<span class=\"keyword token\">si<\/span> len<span class=\"punctuation token\">(<\/span>membre<span class=\"punctuation token\">.<\/span>findall<span class=\"punctuation token\">(<\/span><span class=\"string token\">'linqmap:endNode'<\/span>, namespaces<span class=\"punctuation token\">)<\/span><span class=\"punctuation token\">)<\/span> <span class=\"operator token\">><\/span> <span class=\"number token\">0<\/span><span class=\"punctuation token\">:<\/span>
NoeudFin < spanclass = \ "operatortoken \ "> = </ span > membre<spanclass = \ " punctuationtoken \ ">. </ span > trouver<spanclass = \ " punctuationtoken \ "> ( </ span > < spanclass = \ " stringtoken \ ">'linqmap:endNode' </ span > ,namespaces<spanclass = \ " punctuationtoken \ ">) </ span > .texte
< spanclass = \ " keywordtoken \ "> sinon </ span >< spanclass = \ " punctuationtoken \ "> : </ span >
NoeudFin < spanclass = \ " operatortoken \ "> = </ span > < spanclass = \ " stringtoken \ ">' ' </ span >
< spanclass = \ " keywordtoken \ "> si </ span > len<spanclass = \ " punctuationtoken \ ">(</ span > membre<spanclass = \ " punctuationtoken \ ">. </ span > findall<spanclass = \ " punctuationtoken \ ">(</ span > < spanclass = \ " stringtoken \ ">'linqmap:reportDescription' </ span > ,namespaces<spanclass = \ " punctuationtoken \ ">) </ span > ) > 0 :
Description < spanclass = \ " operatortoken \ "> = </ span > membre<spanclass = \ " punctuationtoken \ ">. </ span > trouver<spanclass = \ " punctuationtoken \ ">(</ span > < spanclass = \ " stringtoken \ ">'linqmap:reportDescription' </ span > ,namespaces<spanclass = \ " punctuationtoken \ ">) </ span > .texte
< spanclass = \ " keywordtoken \ "> sinon </ span >< spanclass = \ " punctuationtoken \ "> : </ span >
Description < spanclass = \ " operatortoken \ "> = </ span > ''
< spanclass = \ " keywordtoken \ "> si </ span > len<spanclass = \ " punctuationtoken \ ">(</ span > membre<spanclass = \ " punctuationtoken \ ">. </ span > findall<spanclass = \ " punctuationtoken \ ">(</ span > 'linqmap:street', namespaces) ) > 0 :
Rue < spanclass = \ " operatortoken \ "> = </ span > membre.find('linqmap:street', namespaces).texte
sinon :
Rue = ''
UUID = membre.find('linqmap:id', namespaces).texte
Type = membre.find('linqmap:type', namespaces).texte.replace('_', ' ').capitalize()
Longueur = membre.find('linqmap:length', namespaces).texte
Niveau = membre.find('linqmap:trend', namespaces).texte
ligne = membre.find('georss:line', namespaces).texte.replace('\n', '').replace(' ', '],[').replace('],[-', ', -').split(', ')
Vitesse = membre.find('linqmap:speed', namespaces).texte
Délai = membre.find('linqmap:delaySeconds', namespaces).texte
cur = arcpy.da.InsertCursor(fcl, ["Speed", "Delay", "Title", "ReportType"] token">,</SPAN><SPAN class="string token">"DateReported"</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="string token">"City"</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="string token">"Street"</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="string token">"Length"</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="string token">"ReportLevel"</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="string token">"UUID"</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="string token">"StartNode"</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="string token">"EndNode"</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="string token">"Description"</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="string token">"SHAPE@"</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN>
array <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>Array<SPAN class="punctuation token">()</SPAN>
<SPAN class="keyword token">for</SPAN> coords <SPAN class="keyword token">in</SPAN> line<SPAN class="punctuation token">:</SPAN>
xy <SPAN class="operator token">=</SPAN> coords<SPAN class="punctuation token">.</SPAN>split<SPAN class="punctuation token">('],[')</SPAN>
array<SPAN class="punctuation token">.</SPAN>add<SPAN class="punctuation token">(</SPAN>arcpy<SPAN class="punctuation token">.</SPAN>Point<SPAN class="punctuation token">(</SPAN>xy<SPAN class="punctuation token">[1]</SPAN>, xy<SPAN class="punctuation token">[0]</Span>)</span>)
cur<span class="punctuation token">.</span>insertRow<span class="punctuation token">([</span>Speed<span class="punctuation token">,</span>Delay<span class="punctuation token">,</span>Titre<span class="punctuation token">,</span>Type<span class="punctuation token">,</span>DateReported<span class="punctuation token">,</span>Ville<span class="punctuation token">,</span>Rue<span class="punctuation token">,</span>Longueur<span class="punctuation token">,</span>Niveau<span class="punctuation token">,</span>UUID<span class="punctuation token">,</span>NoeudDépart<span class="punctuation token">,</span>NoeudFin<span class="punctuation token">,</span>Description<span class="punctuation token">,</span>arcpy<span class="punctuation token">.</span>Polyline<span class="punctuation token">(</span>array<span class="punctuation token">)</span>]</span>)
<span class="keyword token">del</span> cur
<span class="keyword token">print(</span>'étape 3'<span class="punctuation token">
</span>)
<span class="keyword token">except:</span>
<span class="keyword token">pass
</span>
<span class="keyword token ">print(</span>'échec Étape 3'<spanclass= " punctuationtoken ">)
</ span >
< spanclass = " keywordtoken ">else:</ span >
< spanclass = " keywordtoken ">print( </ span >'Erreur'< spanclass = " punctuationtoken ">)< / span >< < EMOJI_0 > >< span class="line-numbers-rows"><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
Planification du script
Une fois le script Python en cours d'exécution, utilisez le Planificateur de tâches Windows pour exécuter le script à des intervalles spécifiques, ce qui ajoutera de nouvelles entités aux couches d'entités ArcGIS Online (cette technique conservera un historique de toutes les informations sur le trafic depuis la première exécution du script).

Affichage des informations de trafic en direct
Pour afficher les informations de trafic en direct - créez des vues de couches d'entités et définissez ses entités pour n'afficher que les entités créées dans les x dernières minutes - x étant la fréquence à laquelle vous avez configuré l'exécution du script Python..
J'ai configuré le script Python pour s'exécuter toutes les 4 minutes - par conséquent, les vues de couches d'entités affichent les entités créées dans les 4 dernières minutes.

Une fois configuré, vous pouvez partager ces vues publiquement et les afficher sur des applications destinées au public.
Voici des liens vers nos vues de couches d'entités, et une carte affichant ces entités ainsi que les fermetures de routes/trottoirs.
*Cliquez ici pour en savoir plus sur notre processus de demande de travaux sur route/trottoir

Envoyer un e-mail à des personnes spécifiques lorsqu'un accident est signalé
J'ai utilisé la méthode suivante, alternativement vous pouvez utiliser des scripts Python similaires ou créer votre propre script Python pour déclencher un e-mail lorsqu'une nouvelle entité est ajoutée à une couche d'entités.
Exécutez le script e-mail de votre choix sur une nouvelle vue de couche d'entités hébergée (type de géométrie = point) qui n'affiche que les accidents (ReportType = "Accident"), où DateReported était dans les x dernières minutes.

Et enfin, configurez le planificateur de tâches Windows pour capturer toutes nouvelles entités (accidents) qui se produisent dans les x dernières minutes.
J'espère que vous pourrez tirer parti de ces flux de travail pour répondre à vos propres besoins professionnels. Et n'hésitez pas à partager vos réflexions, commentaires ou questions dans la section commentaires ci-dessous.
Cordialement ! - Gee Fernando