Problém
Zkusím zde nové zkratkové slovo - B2G - Business To GIS - znamenající dodání externě spravovaných dat do ArcGIS. Je velmi běžné, že externí ("business") systémy nabízejí REST API, které můžete volat pro získání dat ve společném formátu jako JSON, ale také je velmi běžné, že server dodává dataset ve více částech (tj. "stránkách"), a že JSON není v dobře definovaném dialektu jako GeoJSON - musíte jej parsovat do sloupců, potenciálně ze struktur nebo pole objektů.
Tento příspěvek je o překonání dvou výzev stránkování a parsování, bez kódování, pomocí ArcGIS Data Interoperability.
Můj předmět dat je Federal Communications Commission data stížností zákazníků na nevyžádané hovory, filtrované pro rok 2024. Pokud chcete vidět, jak to vypadá jako příchozí JSON klikněte zde pro 1000 náhodných záznamů, ale zde je konečný výsledek jako služba prvků:
FCC Customer Complaints - unwanted calls
Nějaký výzkum odhaluje několik běžných přístupů ke stránkování:
- Parametry offset a limit definující počáteční pozici řádku a počet řádků, čtení seřazených dat.
- Tento přístup může zahrnovat další parametr určující vlastnost nastavující pořadí třídění
- Číslo stránky a (volitelně) velikost stránky parametry.
- Stránkování založené na dotazu, kde je počáteční řádek definován logickým dotazem, implikujícím jakýkoli další dotaz.
- Časově založený dotaz, speciální případ stránkování založeného na dotazu.
- Stránkování založené na kurzoru, kde API poskytuje názvy stránek, včetně jakékoli další stránky, ve výsledku.
- Kombinace výše uvedených.
První dva přístupy jsou nejjednodušší (a jediné, které jsem použil), server provádí výpočty sestavení stránek a klient musí pouze sledovat jednoduchý čítač, posílající požadavky dokud nejsou data vyčerpána.
Zde je příklad API založeného na offsetu a limitu a zde je příklad API založeného na stránkách.
Pro příklad #6, kombinující #3 & #4, si můžete přečíst o dotazování hostovaných vrstev prvků. ArcGIS se postará o sestavení dotazů vrstev za vás.
A co takhle i jednoduché parsování? Musíme převést záznamy jako tento do typovaných sloupců a geometrie!
{
"issue_type" : "Telefon",
"caller_id_number" : "830-210-2001",
"state" : "IL",
"method" : "Drátový",
"advertiser_business_phone_number" : "Žádný",
"issue_time" : "8:41 am",
"issue" : "Nevyžádané hovory",
"zip" : "60629",
"type_of_call_or_messge" : "Živý hlas",
"issue_date" : "2024-01-04T00:00:00.000",
"id" : "3739134",
"location_1" : {
"latitude" : "41.781382",
"human_address" : "{\"address\": \"\", \"city\": \"IL\", \"state\": \"\", \"zip\": \"60629-5219\"}",
"needs_recoding" : false,
"longitude" : "-87.732853"
}
}
Žádný problém! Pojďme začít.
Stránkování
Voláme zde REST API, které nabízí stránkovanou odpověď. V ArcGIS Data Interoperability to znamená volat HTTPCaller transformátor v cyklu, v tomto případě s parametry offset, limit a order, inkrementujíc hodnotu offset při každém volání, dokud nejsou přijata všechna data a odpověď není prázdné pole. Možná jste nevěděli, že můžete smyčkovat ve vizuálním programovacím prostředí, ale můžete a je to snadné. Světle zelený vlastní transformátor „UnwantedCallsLooper“ poblíž levého horního rohu mé pracovní plochy dělá tuto práci. Je to vlastní transformátor s cyklem.
Nadřazená ETL pracovní plocha
Vlastní transformátor je vložený (začleněný) v hlavním plátně, žije ve své vlastní stejnojmenné záložce. Vlastní transformátory vytváříte výběrem jednoho nebo více obyčejných transformátorů v hlavním plátně a poté kontextová nabídka dostupná pravým kliknutím nabízí možnost vytvoření vlastního transformátoru. V mém případě jsem vybral pouze jeden HTTPCaller transformátor.
Po vytvoření vlastního transformátoru bylo potřeba provést další kroky pro nastavení smyčky:
- Přidat smyčkové návratové spojení pomocí volby kontextové nabídky v plátně
- Přidat test dokončení před smyčkovým návratem
- Zvýšit hodnotu parametru offset
Níže je zobrazen můj vlastní transformátor. Při běhu má každý prvek přicházející z hlavního plátna atribut offset používaný HTTPCaller transformátorem. Parametry limit a order se nemění, takže jsou „tvrdě zakódované“ v HTTPCaller. Spodní proud je podmínka smyčky - pokud odpověď není prázdné pole, data nejsou vyčerpaná, takže zvýšíme offset a opakujeme!
Vlastní transformátor s cyklem
Parsování
Každá odpověď API je pole JSON struktur a je obsažena v atributu pojmenovaném „_response_body“. Pole je rozloženo do samostatných prvků pomocí JSONFragmenter. Parametr JSON Query znamená jen to, že fragmentujeme pole nejvyšší úrovně a ostatní nastavení jen zajišťují doručení fragmentů vypadajících jako blok kódu výše.
JSONFragmenter
Nyní parsujeme každý fragment prvku pomocí JSONExtractor.
JSONExtractor
Mřížka Extract Queries definuje názvy výstupních atributů a odkud data pochází ve fragmentu. Parametr JSON dotazy následují jednoduchou syntaxi kterou můžete zadat, ale existuje jednoduchý trik, jak získat picker, který vám umožní procházet strukturu JSON a automatizovat generování dotazů. Před JSONExtractorem dočasně vzorkujte jeden prvek a zapište ho do souboru, poté dočasně nastavte vstupní zdroj JSONExtractoru na tento soubor a získáte užitečný picker pro vaše dotazy! Když vyplníte své extrakční dotazy, odstraňte Sampler a resetujte vstupní zdroj JSONFragmenteru na dokument v _response_body.<\/P>
Takže to je stránkování a parsování odhaleno!<\/STRONG> V blogovém downloadu jsou dva workspace zdrojové fmw soubory. CreateFC vytváří výstup file geodatabase a je místem, kde jsem přišel na zpracování dat, jako je oprava chyb dat, které znemožnily vytvoření datetime pole. Chtěl jsem mít počáteční feature class pro symbolizaci a sdílení jako svůj cílový hosted feature service. UpdateFS přebírá kroky zpracování dat z CreateFC, ale obsahuje smyčkový custom transformer a nějakou logiku k detekci a aplikaci změn dat kdykoli je ETL nástroj spuštěn, což je pravděpodobně to, co budete potřebovat v produkci.<\/P>
Prosím komentujte tento příspěvek s jakýmikoli otázkami a pozorováními. Stránkujte dál!<\/P>
<\/P>