<\/HEAD>
Como parte do Waze Connected Citizen Program (CCP)<\/A>, os parceiros têm acesso a congestionamentos de trânsito em tempo real e incidentes reportados através do aplicativo Waze (nos formatos XML e JSON). Já existem técnicas e documentação<\/A> sobre como consumir esses dados em uma plataforma ArcGIS usando GeoEvent.<\/P><\/P>
Neste blog, vou descrever uma técnica para consumir esses dados no ArcGIS Online através de Python e do Agendador de Tarefas do Windows. O
script Python inicial<\/A> foi desenvolvido por Joel Meier<\/A> que eu modifiquei para se adequar ao fluxo de trabalho proposto. Também uma menção especial aos meus colegas Edmund Hall<\/A> e Louis Tian<\/A> que me ajudaram a depurar. E por último, mas não menos importante, quero agradecer a Andrew Stauffer<\/A> por nos ajudar a fazer parceria e aproveitar ao máximo o Waze CCP<\/A>.<\/P><\/P>
Pontual - Camada de Feição<\ /SPAN>
- OBJECTID (tipo: esriFieldTypeOID, alias: OBJECTID, Tipo SQL: sqlTypeOther, comprimento: 0, anulável: falso, editável: falso)*<\ /STRONG>
- DateReported (tipo: esriFieldTypeDate, alias: DateReported, Tipo SQL: sqlTypeTimestamp2, comprimento: 0, anulável: verdadeiro, editável: verdadeiro)<\ /EM>
- Title (tipo: esriFieldTypeString, alias: Title, Tipo SQL: sqlTypeOther, comprimento: 25, anulável: verdadeiro, editável: verdadeiro)<\ /EM>
- ReportType (tipo: esriFieldTypeString, alias: ReportType, Tipo SQL: sqlTypeOther, comprimento: 25, anulável: verdadeiro, editável: verdadeiro)<\ /EM>
- ReportSubtype (tipo: esriFieldTypeString, alias: ReportSubtype, Tipo SQL: sqlTypeOther, comprimento: 50, anulável: verdadeiro, editável: verdadeiro)<\ /EM>
- Street (tipo: esriFieldTypeString, alias: Street, Tipo SQL: sqlTypeOther, comprimento: 256, anulável: verdadeiro, editável: verdadeiro)<\ /EM>
- City (tipo: esriFieldTypeString, alias: City, Tipo SQL: sqlTypeOther, comprimento: 50, anulável: verdadeiro, editável: verdadeiro)<\ /EM>
- Description (tipo: esriFieldTypeString, alias: Description, Tipo SQL: sqlTypeOther, comprimento: 1024, anulável: verdadeiro, editável: verdadeiro)<\ /EM>
- Reliability (tipo: esriFieldTypeInteger, alias: Reliability, Tipo SQL : sqlTypeOther , anulável : verdadeiro , editável : verdadeiro )< \ / EM > < \ / SPAN > < \ / LI > < LI > < SPAN style = \ " text-decoration : line-through ; font-size : 13px ; \ " > UUID < EM > ( tipo : esriFieldTypeString , alias : UUID , Tipo SQL : sqlTypeOther , comprimento : 100 , anulável : verdadeiro , editável : verdadeiro ) < \ / EM > < \ / SPAN > < \ / LI > < \ / UL > < UL style = \ " padding : 0px 0px 0px 30px ; \ " > < LI style = \ " margin : 0.2em 0px ; \ " > < SPAN style = \ " text-decoration : line-through ; font-size : 13px ; \ " > CreationDate   ; < EM > ( tipo : esriFieldTypeDate , alias : CreationDate , Tipo SQL : sqlTypeOther , comprimento : 8 , anulável : verdadeiro , editável : falso ) < STRONG > * < \ / STRONG > < \ / EM > < \ / SPAN > < \ / LI > < LI style = \ " margin : 0.2em 0px ; \ " > < SPAN style = \ " text-decoration : line-through ; font-size : 13px ; \ " > Creator   ; < EM > ( tipo : esriFieldTypeString , alias : Creator , Tipo SQL : sqlTypeOther , comprimento : 128 , anulável : verdadeiro , editável : falso ) < STRONG > * < \ / STRONG > < \ / EM > < \ / SPAN > < \ / LI > < LI style = \ " margin : 0.2em 0px ; \ " > < SPAN style = \ " text-decoration : line-through ; font-size : 13px ; \ " > EditDate   ; < EM > ( tipo : esriFieldTypeDate , alias : EditDate , Tipo SQL : sqlTypeOther , comprimento : 8 , anulável : verdadeiro , editável : falso ) < STRONG > * < \ / STRONG > < \ / EM > < \ / SPAN > < \ / LI > < LI style = \ " margin : 0.2em 0px ; \ " > < SPAN style = \ " text-decoration : line-through ; font-size : 13px ; \ " > Editor   ; < EM > ( tipo : esriFieldTypeString , alias : Editor , Tipo SQL : sqlTypeOther , comprimento : 128 , anulável : verdadeiro , editável : falso ) < STRONG > * < \ / STRONG > < \ / EM >
Descrição, Tipo SQL: sqlTypeOther, comprimento: 1024, anulável: true, editável: true)<\/EM><\/SPAN><\/LI>
UUID (type: esriFieldTypeDouble, alias: UUID, SQL Type: sqlTypeOther, anulável: true, editável: true)<\/EM><\/SPAN><\/LI><\/UL>Shape__Length (type: esriFieldTypeDouble, alias: Shape__Length, SQL Type: sqlTypeDouble, anulável: true, editável: false)*<\/STRONG><\/EM><\/SPAN><\/LI>CreationDate (type: esriFieldTypeDate, alias: CreationDate, SQL Type: sqlTypeOther, comprimento: 8, anulável: true, editável: false)*<\/STRONG><\/EM><\/SPAN><\/LI>Creator (type: esriFieldTypeString, alias: Creator, SQL Type: sqlTypeOther, comprimento: 128, anulável: true, editável: false)*<\/STRONG><\/EM><\/SPAN><\/LI>EditDate (type: esriFieldTypeDate, alias: EditDate, SQL Type: sqlTypeOther, comprimento: 8, anulável: true, editável: false)*<\/STRONG><\/EM><\/SPAN><\/LI>Editor (type: esriFieldTypeString, alias: Editor, SQL Type: sqlTypeOther, comprimento: 128, anulável: true, editável: false)*<\/STRONG><\/EM><\/SPAN><\/LI><\/UL>*<\/STRONG>campos pré-preenchidos<\/EM><\/SPAN><\/P>Por favor certifique-se de usar os nomes exatos dos campos e tipos<\/EM><\/STRONG>, (alternativamente você teria que ajustar o script).<\/SPAN><\/P>Uma vez que as camadas de feição estejam configuradas, por favor habilite a edição<\/STRONG> e defina-as como PRIVATE<\/STRONG>.<\/SPAN><\/P>Por favor consulte as "Waze Feed Technical Specifications [Get Waze Data]"<\/EM><\/STRONG> no Portal do Partner<\/A> para definições exatas sobre descrições dos campos.<\/P><\/BLOCKQUOTE><\/P>
Configurando o script Python<\/H4>Substitua as seções de comentário (linhas 6, 9 e 10)<\/SPAN><\/EM> com seu próprio feed XML e URLs para suas camadas de feição de ponto e linha.<\/P><SPAN class="keyword token">importar<\/SPAN> xml<SPAN class="punctuation token">.<\/SPAN>etree<SPAN class="punctuation token">.<\/SPAN>ElementTree <SPAN class="keyword token">como<\/SPAN> ET
<SPAN class="keyword token">importar<\/SPAN> urllib<SPAN class="punctuation token">.<\/SPAN>request
<SPAN class="keyword token">importar<\/SPAN> arcpy
<SPAN class="keyword token">de<\/SPAN> datetime <SPAN class="keyword token">importar<\/SPAN> datetime
namespaces <SPAN class="operator token">=<\/SPAN> <SPAN class="punctuation token">{<\/ 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ão é<\/SPAN> None<SPAN class="punctuation token">:<\/SPAN>
Subtipo <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">senão<\/SPAN><SPAN class="punctuation token">:<\/SPAN>
Subtipo <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
Confiabilidade <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">se<\/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>
Descrie7e3o <span class="operator token">=<\/</span> member<span class=\"punctuation token\"><\/</span>find<span class=\"punctuation token\"><\/</span>(<\/</span><span class=\"string token\"><\/'linqmap:reportDescription'<\/</span><span class=\"punctuation token\"><\/</span>, namespaces<span class=\"punctuation token\"><\/</span>)<\/</span><span class=\"punctuation token\"><\/</span>text
<spa... 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 class="string token">'linqmap:reportDescription'</span><span class="punctuation token">,<span>/</span></span> namespaces<span class="punctuation token">9</span>.text
<span class="keyword token">else</span><span class=punctuation></span>
Description <span class=operator>=</span> <span class=string>''</span>
<span class=keyword>if</span> len<span class=punctuation>(</span>member<span class=punctuation>.</span>findall<span class=punctuation>(</span><span class=string>'linqmap:street'</span><span class=punctuation>,</span> namespaces<span class=punctuation>)</span><span class=punctuation>)</span> <span class=operator>></span> <span class=number>0</span><span class=punctuation>:</span>
Street <span class=operator>=</span> member<span class=punctuation>.</span>find<span class=punctuation>(</span><span class=string>'linqmap:street'</span><span class=punctuation>,</span> namespaces<span class=punctuation>)</span><span class=punctuation>.</span>text
<span class=keyword>else</span><span class=punctuation>: </span>
Street <span class=operator>= </span><span class=string>''</span>
UUID <span class=operator>= </span>member<span class=punctuation>.</span>find<span class=punctuation>(</span><span class=string>'linqmap:uuid'</span><span class=punctuation>, </span>namespaces<span class=punctuation>)</span>.text
Type <span class=operator>= </span>member<span class=punctuation>.</span>find<span class=punctuation>(</span><span class=string>'linqmap:type'</span><span class=punctuation>, </span>namespaces<span class=punctuation>)</span>.text.replace<span class=punctuation>(</span><span class=string>'_'</span>, <spanclass= string >' '</ span>).capitalize()
Length < spanclass= operator >= </ span > member . find ( 'linqmap:length' , namespaces ) . text
Level < spanclass= operator >= </ span > member . find ( 'linqmap:level' , namespaces ) . text
line < spanclass= operator >= </ span > member . find ( 'georss:line' , namespaces ) . text.replace ( '\n' , '' ).replace ( ' ' , '],[' ).replace ( '],[-' , ', -' ).split ( ', ' )
Speed < spanclass= operator >= </ span > member . find ( 'linqmap:speed' , namespaces ) . text
Delay < spanclass= operator >= </ span > member . find ( 'linqmap:delay' , namespaces ) . text
cur < spanclass= operator >= </ span > arcpy.da.InsertCursor ( fcl , [ "Speed" , "Delay" , "Title" , "ReportType" , "DateReported" , "City" , "Street" , "Length" , "ReportLevel" , "UUID" , "StartNode" , "EndNode" , "Description" , "SHAPE@" ] )
array < spanclass= operator >= </ span > arcpy.Array ()
for coords in line :
xy = coords.split ( '],[' )
array.add ( arcpy.Point ( xy [ 1 ] , xy [ 0 ] ) )
cur.insertRow ( [ Speed , Delay , Title , Type , DateReported , City , Street , Length , Level , UUID , StartNode , EndNode , Description , arcpy.Polyline ( array ) ] )
del cur
print ( token">'etapa 2'<\/SPAN><SPAN class="punctuation token">)<\/SPAN>
<SPAN class="keyword token">exceto<\/SPAN><SPAN class="punctuation token">:<\/SPAN>
<SPAN class="keyword token">passar<\/SPAN>
<SPAN class="keyword token">imprimir<\/SPAN><SPAN class="punctuation token">(<\/SPAN><SPAN class="string token">'falha na Etapa 2'<\/SPAN><SPAN class="punctuation token">)<\/SPAN>
<SPAN class="keyword token">senão<\/SPAN><SPAN class="punctuation token">:<\/SPAN>
<SPAN class="keyword token">tentar<\/SPAN><SPAN class="punctuation token">:<\/SPAN>
Data <SPAN class="operator token">=<\/SPAN> membro<SPAN class="punctuation token">.<\/SPAN>encontrar<SPAN class="punctuation token">(<\/SPAN><SPAN class="string token">'updateDate'<\/SPAN><SPAN class="punctuation token">)<\/SPAN><SPAN class="punctuation token">.<\/SPAN>texto
DataReportada <SPAN class="operator token">=<\/SPAN> datetime<SPAN class="punctuation token">.<\/SPAN>strptime<SPAN class="punctuation token">(<\/SPAN>Data<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">se<\/SPAN> len<SPAN class="punctuation token">(<\/SPAN>membro<SPAN class="punctuation token">.<\/SPAN>findall<SPAN class="punctuation token">(<\/Span><span class="string token">'linqmap:city'<\/span>, namespaces)<span class="punctuation token">)<\/span> <span class="operator token">><\/span> <span class="number token">0<\/span><span class="punctuation token">:<\/span>
Cidade <span class="operator token">=<\/span> membro<span class="punctuation token">.<\/span>encontrar<span class="punctuation token">(<\/span><span class="string token">'linqmap:city'<\/span>, namespaces)<span class="punctuation token">.<\/span>texto
<span class="keyword token">senão<\/span><span class="punctuation token">:<\/span>
Cidade <span class="operator token">=<\/span> <span class="string token">''<\/span>
<span class="keyword token">se<\/span> len<span class="punctuation token">(<\/span>membro<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="operator token">><\/span> <span class="number token">0<\/span><span class="punctuation token">:<\/span>
NóInicial <span class="operator token">=<\/span> membro<span class="punctuation token">.<\/span>encontrar<span class="punctuation token">(<\/span><span class="string token">'linqmap:startNode'<\/span>, namespaces)<span class="punctuation token">.<\/span>texto
<span class="keyword token">senão<\/span><span class="punctuation token">:<\/span>
NóInicial <span class="operator token">=<\/span> <span class="string token">''<\/span>
<span class="keyword token">se<\/span> len<span class="punctuation token">(<\/span>membro<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="operator token">><\/span> <span class="number token">0<\/span><span class="punctuation token">:<\/span>
NóFinal <span class="operator token">=<\/span> membro<span class="punctuation token">.<\/span>encontrar<span class="punctuation token">(<\/spaN><spaN clasS=\"string toKen\"\>'linqmap:endNode'<\//spaN>, namespaces)<spaN clasS=\"puncTuation toKen\"\>.text
<spaN clasS=\"keyWord toKen\"\>senão<\//spaN><spaN clasS=\"puncTuation toKen\"\>:<\//spaN>
NóFinal <spaN clasS=\"operaTor toKen\"\>=<\//spaN> <spaN clasS=\"string toKen\"\>''<\//spaN>
<spaN clasS=\"keyWord toKen\"\>se<\//spaN> len<spaN clasS=\"puncTuation toKen\"\>(<\//spaN>membro<spaN clasS=\"puncTuation toKen\"\>.findall(<spaN clasS=\"string toKen\"\>'linqmap:reportDescription'<\//spaN>, namespaces)<spaN clasS=\"puncTuation toKen\"\>)<\//spaN> <spaN clasS=\"operaTor toKen\"\>><\//spaN> <spaN clasS=\"number toKen\"\>0<\//spaN><spaN clasS=\"puncTuation toKen\"\>:<\//spaN>
Descrição <spaN clasS=\"operaTor toKen\"\>=<\//spaN> membro<spaN clasS=\"puncTuation toKen\"\>.encontrar(<spaN clasS=\"string toKen\"\>'linqmap:reportDescription'<\//spaN>, namespaces)<spaN clasS=\"puncTuation toKen\"\>.texto
<spaN clasS=\"keyWord toKen\"\>senão<\//spaN><spaN clasS=\"puncTuation toKen\"\>:<\//spaN>
Descrição <spaN clasS=\"operaTor toKen\"\>=<\//spaN> <spaN clasS=\"string toKen">' '</span>
<SPA N claSS=keyWordto Kenselen(membro.findall('linqmap:street', namespaces)) > 0:
Rua = membro.encontrar('linqmap:street', namespaces).texto
senão:
Rua = ''
UUID = membro.encontrar('linqmap:id', namespaces).texto
Tipo = membro.encontrar('linqmap:type', namespaces).texto.replace('_', ' ').capitalize()
Comprimento = membro.encontrar('linqmap:length', namespaces).texto
Nível = membro.encontrar('linqmap:trend', namespaces).texto
linha = membro.encontrar('georss:line', namespaces).texto.replace('\n', '').replace(' ', '],[').replace('],[-', ', -').split(', ')
Velocidade = membro.encontrar('linqmap:speed', namespaces).texto
Atraso = membro.encontrar('linqmap:delaySeconds', namespaces).texto
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>Título<span class="punctuation token">,</span>Tipo<span class="punctuation token">,</span>DateReported<span class="punctuation token">,</span>Cidade<span class="punctuation token">,</span>Rua<span class="punctuation token">,</span>Comprimento<span class="punctuation token">,</span>Nível<span class="punctuation token">,</span>UUID<span class="punctuation token">,</span>NóInicial<span class="punctuation token">,</span>NóFinal<span class="punctuation token">,</span>Descrição<span class="punctuation token">,</span>arcpy<span class="punctuation token">.</span>Polyline<span class="punctuation token">(</span>array<span class="punctuation token"> )</span><span class="punctuation token"> ]</span><span class="punctuation token"> )</span>
<span class="keyword token"> del cur
print ('este1gio 3')
<span class= keyword token "> except :</span>
pass
print ('falha Este1gio 3')
else
print ('Erro')<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>
Agendando o script
Uma vez que o script Python esteja em execução, use Windows Task Scheduler para executar o script em intervalos de tempo específicos, o que irá adicionar novas feições às camadas de feição do ArcGIS Online (esta técnica manterá um histórico de todas as informações de tráfego desde a primeira vez que você executou o script).

Exibindo Informações de Tráfego ao Vivo
Para exibir informações de tráfego ao vivo - crie visualizações de camada de feição e defina suas feições para mostrar apenas feições criadas nos últimos x minutos, sendo x a frequência com que você configurou o script Python para ser executado.
Configurei o script Python para ser executado a cada 4 minutos - subsequentemente as visualizações da camada de feição para exibir feições criadas nos últimos 4 minutos.

Uma vez configurado, você pode compartilhar essas visualizações publicamente e exibí-las em aplicações públicas.
Abaixo estão links para nossas visualizações da camada de feição, e um mapa exibindo essas feições junto com fechamentos de estradas/passeios.
*Clique aqui para saber mais sobre nosso processo de solicitação para trabalhos em estradas/passeios

Enviar email para pessoas específicas quando um Acidente for reportado
Usei o método a seguir, alternativamente você pode usar scripts Python similares ou criar seu próprio script Python para disparar um email quando novas feições forem adicionadas a uma camada de feição.
Execute o script de email da sua escolha em uma nova visualização da camada de feição, (tipo de geometria = ponto), que exiba apenas Acidentes (ReportType = "Accident"), onde DateReported foi nos últimos x minutos.

E finalmente, configure o windows task scheduler para capturar quaisquer novas feições (acidentes) que ocorram nos últimos x minutos.
Espero que você possa aproveitar esses fluxos de trabalho para atender às suas próprias necessidades comerciais. E por favor, sinta-se à vontade para compartilhar seus pensamentos, comentários ou perguntas na seção de comentários abaixo.
Saudações! - Gee Fernando