<\/HEAD>
Jako součást Waze Connected Citizen Program (CCP)<\/A> získávají partneři přístup k aktuálním dopravním zácpám a incidentům hlášeným prostřednictvím aplikace Waze (ve formátech XML a JSON). Již existují techniky a dokumentace<\/A>, jak tato data využít v platformě ArcGIS pomocí GeoEvent.<\/P><\/P>
V tomto blogu popíšu techniku pro využití těchto dat v ArcGIS Online pomocí Pythonu a Plánovače úloh ve Windows.
Počáteční Python skript<\/A> vyvinul Joel Meier<\/A>, který jsem upravil tak, aby vyhovoval navrženému pracovnímu postupu. Zvláštní poděkování patří také mým kolegům Edmund Hall<\/A> a Louis Tian<\/A>, kteří mi pomohli s laděním. A nakonec, ale ne méně důležitě, chci poděkovat Andrew Stauffer<\/A> za pomoc našemu partnerovi a za maximální využití Waze CCP<\/A>.<\/P><\/P>
Vytvoření vrstev prvků ArcGIS Online pro ukládání informací o dopravě<\/H2>Přihlaste se do ArcGIS Online > stránka Můj obsah, klikněte na Vytvořit > Vrstva prvků, vyberte Z URL a zadejte přesnou URL šablony vrstvy bodových prvků. Poté opakujte stejný postup pro vrstvu liniových prvků. Tím se vytvoří nové prázdné vrstvy prvků se schématem požadovaným (názvy polí, typy a prostorová reference)<\/EM>.<\/P>Šablona vrstvy bodových prvků<\/STRONG><\/SPAN><\/P>https:\/\/services1.arcgis.com\/E5n4f1VY84i0xSjy\/arcgis\/rest\/services\/WazeTrafficAlertsEmpty\/FeatureServer<\/A><\/SPAN><\/P>Šablona vrstvy liniových prvků<\/STRONG><\/SPAN><\/P>
https:\/\/services1.arcgis.com\/E5n4f1VY84i0xSjy\/arcgis/rest/services/WazeTrafficJamsEmpty/FeatureServer<\/_a>Alternativně navštivte https://developers.arcgis.com/layers/new pro vytvoření vrstev bodové a liniové geometrie (WKID = 4326) s následujícími poli.<\span>
Bod - Vrstva prvkůOBJECTID (typ: esriFieldTypeOID, alias: OBJECTID, SQL Typ: sqlTypeOther, délka: 0, povoleno null: ne, upravitelné: ne)*DateReported (typ: esriFieldTypeDate, alias: DateReported, SQL Typ: sqlTypeTimestamp2, délka: 0, povoleno null: ano, upravitelné: ano)Title (typ: esriFieldTypeString, alias: Title, SQL Typ: sqlTypeOther, délka: 25, povoleno null: ano, upravitelné: ano)ReportType (typ: esriFieldTypeString, alias: ReportType, SQL Typ: sqlTypeOther, délka: 25, povoleno null: ano, upravitelné: ano)ReportSubtype (typ: esriFieldTypeString, alias: ReportSubtype, SQL Typ: sqlTypeOther, délka: 50, povoleno null: ano, upravitelné: ano)Street (typ: esriFieldTypeString, alias: Street, SQL Typ: sqlTypeOther, délka: 256, povoleno null: ano, upravitelné: ano)City (typ: esriFieldTypeString, alias: City, SQL Typ: sqlTypeOther, délka: 50, povoleno null: ano, upravitelné: ano)Description (typ: esriFieldTypeString, alias: Description, SQL Typ: sqlTypeOther, délka: 1024, povoleno null: ano, upravitelné: ano)Reliability (typ esriFieldTypeInteger, alias Reliability, SQL Typ sqlTypeOther, povoleno null ano upravitelné ano)UUID (typ esriFieldTypeString alias UUID SQL Typ sqlTypeOther délka 100 povoleno null ano upravitelné ano)... Popis, SQL Typ: sqlTypeOther, délka: 1024, může být null: true, upravitelný: true)<\/EM><\/SPAN><\/LI>UUID (typ: esriFieldTypeDouble, alias: UUID, SQL Typ: sqlTypeOther, může být null: true, upravitelný: true)<\/EM><\/SPAN><\/LI><\/UL>Shape__Length (typ: esriFieldTypeDouble, alias: Shape__Length, SQL Typ: sqlTypeDouble, může být null: true, neupravitelný: false)*<\/STRONG><\/EM><\/SPAN><\/LI>CreationDate (typ: esriFieldTypeDate, alias: CreationDate, SQL Typ: sqlTypeOther, délka: 8, může být null: true, neupravitelný: false)*<\/STRONG><\/EM><\/SPAN><\/LI>Creator (typ: esriFieldTypeString, alias: Creator, SQL Typ: sqlTypeOther, délka: 128, může být null: true, neupravitelný: false)*<\/STRONG><\/EM><\/SPAN><\/LI>EditDate (typ: esriFieldTypeDate, alias: EditDate, SQL Typ: sqlTypeOther, délka: 8, může být null: true, neupravitelný: false)*<\/STRONG><\/EM><\/SPAN><\/LI>Editor (typ: esriFieldTypeString, alias: Editor, SQL Typ: sqlTypeOther, délka: 128, může být null: true, neupravitelný: false)*<\/STRONG><\/EM><\/SPAN><\/LI><\/UL>*<\/STRONG>předvyplněná pole<\/EM><\/SPAN><\/P>Prosím ujistěte se, že používáte přesné názvy polí a typy<\/EM><\/STRONG>, (alternativně byste museli upravit skript).<\/SPAN><\/P>Jakmile jsou vrstvy prvků nakonfigurovány, prosím povolte úpravy<\/STRONG> a nastavte je na PRIVATE<\/STRONG>.<\/SPAN><\/P>Prosím odkazujte se na "Waze Feed Technical Specifications [Get Waze Data]"<\/EM><\/STRONG> z Partner's Portal<\/A> pro přesné definice popisů polí.<\/P><\/BLOCKQUOTE><\/P>
Konfigurace Python skriptu<\/H4>Nahraďte sekce komentářů (řádky 6, 9 a 10)<\/SPAN><\/EM> vlastním XML feedem a URL adresami pro vaše bodové a liniové vrstvy prvků.<\/P><SPAN class="keyword token">importujte<\/SPAN> xml<SPAN class="punctuation token">.<\/SPAN>etree<SPAN class="punctuation token">.<\/SPAN>ElementTree <SPAN class="keyword token">jako<\/SPAN> ET
<SPAN class="keyword token">importujte<\/SPAN> urllib<SPAN class="punctuation token">.<\/SPAN>request
<SPAN class="keyword token">importujte<\/SPAN> arcpy
<SPAN class="keyword token">z<\/SPAN> datetime <SPAN class="keyword token">importujte<\/SPAN> datetime
namespaces <SPAN class="operator token">=<\/SPAN> <SPAN class="punctuation token">{</SPAN>'georss'<SPAN class="punctuation token">:<\/SPAN> 'http:\/\/.www.georss.org/georss', 'linqmap'<SPAN class="punctuation token">:<\/SPAN>'http:\/\/.www.linqmap.com'<SPAN class="punctuation token">}</SPAN>
tree <SPAN class="operator token">=<\/SPAN> ET<ElementTree(file=urllib.request.urlopen('<span class= token">.<\/SPAN>najít<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">není<\/SPAN> <SPAN class="operator token">None<\/SPAN><SPAN class="punctuation token">:<\/SPAN>
Podtyp <SPAN class="operator token">=<\/SPAN> member<SPAN class="punctuation token">.<\/SPAN>najít<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">jinak<\/span><span class="punctuation token">:<\/span>
Podtyp <span class="operator token">=<\/span> <span class="string token">''<\/span>
UUID <span class="operator token">=<\/span> member<Span class="punctuation token">.<\/span>najít<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
Spolehlivost <Span class="operator token">=<\/span> member<Span class="punctuation token">.<\/span>najít<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">pokud<\/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>
Popis <Span class="operator token">=<\/span> member<Span class="punctuation token">.<\/span>najít<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">jinak<\/span><Span class="punctuation token">:<\/span>
Popis <Span class="operator token">=<\/span> <Span class="string token">''<\/span>
Typ <Span class="operator token">=<\/span> member<Span class="punctuation token">.<\/span>najít<Span class="punctuation token">(<\/span><Span class="string token">'linqmap:type'<\/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"> 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>
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
<SPAN class="keyword token">jinak<\/SPAN><SPAN class="punctuation token">:<\/SPAN>
EndNode <SPAN class="operator token">=<\/SPAN> <SPAN class="string token">''<\/SPAN>
<SPAN class="keyword token">pokud<\/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>
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">jinak<\/span><span class="punctuation token">:<\/span>
Description <span class="operator token">=<\/span> <span class="string token">''<\/span>
<span class="keyword token">pokud<\/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>
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
<span class="keyword token">jinak<\/span><span class="punctuation token">:<\/span>
Street <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">.<\/</spa... (truncated)}}} token">'stage 2'<\/SPAN><SPAN class="punctuation token">)<\/SPAN>
<SPAN class="keyword token">kromě toho<\/SPAN><SPAN class="punctuation token">:<\/SPAN>
<SPAN class="keyword token">pass<\/SPAN>
<SPAN class="keyword token">print<\/SPAN><SPAN class="punctuation token">(<\/SPAN><SPAN class="string token">'fail Stage 2'<\/SPAN><SPAN class="punctuation token">)<\/SPAN>
<SPAN class="keyword token">jinak<\/SPAN><SPAN class="punctuation token">:<\/SPAN>
<SPAN class="keyword token">zkusit<\/SPAN><SPAN class="punctuation token">:<\/SPAN>
Date <SPAN class="operator token">=<\/SPAN> member<SPAN class="punctuation token">.<\/SPAN>find<SPAN class="punctuation token">(<\/SPAN><SPAN class="string token">'updateDate'<\/SPAN><SPAN class="punctuation token">)<\/SPAN><SPAN class="punctuation token">.<\/SPAN>text
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">pokud<\/SPAN> len<SPAN class="punctuation token">(<\/SPAN>member<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="punctuation token">)<\/Span> <Span class="operator token">><\/Span> <Span class="number token">0<\/Span><Span class="punctuation token">:<\/Span>
City <Span class="operator token">=<\/Span> member<Span class="punctuation token">.<\/Span>find<Span class="punctuation token">(<\/Span><Span class="string token">'linqmap:city'<\/Span>, namespaces<Span class="punctuation token">)<\/Span><Span class="punctuation token">.<\/Span>text
<Span class="keyword token">jinak<\/Span><Span class="punctuation token">:<\/Span>
City <Span class="operator token">=<\/Span> <Span class="string token">''<\/Span>
<Span class="keyword token">pokud<\/Span> len<Span class="punctuation token">(<\/Span>member<Span class="punctuation token">.<\/span>findall<Span class="punctuation token">(<span class="string token">'linqmap:startNode'<span>, namespaces<span class=\"punctuation\"\)\) > 0:<span\
StartNode = member.find('linqmap:startNode', namespaces).text
jinak:
StartNode = ''
pokud len(member.findall('linqmap:endNode', namespaces)) > 0:
EndNode = member.find('linqmap:endNode', namespaces).text
jinak:
EndNode = ''
pokud len(member.findall('linqmap:reportDescription', namespaces)) > 0:
Description = member.find('linqmap:reportDescription', namespaces).text
jinak:
Description = ''
pokud len(member.findall('linqmap:street', namespaces)) > 0:
Street = member.find('linqmap:street', namespaces).text
jinak:
Street = ''
UUID = member.find('linqmap:id', namespaces).text
Type = member.find('linqmap:type', namespaces).text.replace('_', ' ').capitalize()
Length = member.find('linqmap:length', namespaces).text
Level = member.find('linqmap:trend', namespaces).text
line = member.find('georss:line', namespaces).text.replace('\n', '').replace(' ', '],[').replace('],[-', ', -').split(', ')
Speed = member.find('linqmap:speed', namespaces).text
Delay = member.find('linqmap:delaySeconds', namespaces).text
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>Title<span class="punctuation token">,</span>Type<span class="punctuation token">,</span>DateReported<span class="punctuation token">,</span>City<span class="punctuation token">,</span>Street<span class="punctuation token">,</span>Length<span class="punctuation token">,</span>Level<span class="punctuation token">,</span>UUID<span class="punctuation token">,</span>StartNode<span class="punctuation token">,</span>EndNode<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="punctuation token">
del </span>cur
<span class="keyword token">
print(</span>'fáze 3'<span class="punctuation token">
except:</span>
<span class="keyword token">
pass
print(</span>'selhání fáze 3'<span class="punctuation token">
else:
print('Chyba')<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>
Plánování skriptu
Až bude Python skript spuštěn, použijte Windows Task Scheduler k spouštění skriptu v konkrétních časových intervalech, který přidá nové prvky do ArcGIS Online feature layers (tato technika uchová historii všech dopravních informací od prvního spuštění skriptu).

Zobrazování živých dopravních informací
K zobrazení živých dopravních informací - vytvořte feature layer views a definujte jejich prvky, aby zobrazovaly pouze prvky vytvořené v posledních x minutách - x je frekvence, s jakou jste nastavili spuštění Python skriptu.
Nastavil jsem Python skript tak, aby běžel každé 4 minuty - následně feature layer views zobrazují prvky vytvořené za poslední 4 minuty.

Až bude nastaveno, můžete tyto views sdílet veřejně a zobrazit je v aplikacích určených pro veřejnost.
Níže jsou odkazy na naše feature layer views a mapa zobrazující tyto prvky spolu s uzavírkami silnic/chodníků.
*klikněte zde k získání více informací o našem procesu žádostí o práce na silnicích/chodnících

Posílat e-maily konkrétním lidem, když je nahlášena nehoda
Použil jsem následující metodu, alternativně můžete použít podobné Python skripty nebo si vytvořit vlastní Python skript, který spustí e-mail při přidání nových prvků do feature layer.
Spusťte e-mailový skript dle vašeho výběru na novém feature layer view (typ geometrie = point), který zobrazuje pouze nehody (ReportType = "Accident"), kde DateReported bylo v posledních x minutách.

A nakonec nastavte windows task scheduler tak, aby zachytil všechny nové prvky (nehody), které se staly v posledních x minutách.
Doufám, že tyto pracovní postupy můžete využít podle svých obchodních potřeb. A prosím, neváhejte sdílet své názory, komentáře nebo otázky v sekci komentářů níže.
Zdravím! - Gee Fernando