V júni som prezeral niekoľko webov štátnej správy a všimol som si, že niektoré sa snažia "ísť s dobou" a používajú tzv. AJAX:

Ajax (also AJAX; /ˈæks/; an acronym for Asynchronous JavaScript and XML)[1] is a group of interrelated web development techniques used on the client-side to create asynchronous web applications. With Ajax, web applications can send data to, and retrieve data from, a server asynchronously (in the background) without interfering with the display and behavior of the existing page. Data can be retrieved using the XMLHttpRequest object. Despite the name, the use of XML is not required (JSON is often used instead. See AJAJ), and the requests do not need to be asynchronous.

Tá "vec" medzi klientom a serverom, pomocou ktorej si vymieňajú údaje je vlastne API, zvyčajne "read only" a často dokonca aj REST. A to je presne to, čo zvyčajne OpenData vývojári chcú.

Odvtedy mi to ležalo v šuplíku až do konferencie Inspirujme se, 2013, po ktorej tento drobný objav môžem (resp. musím) zhrnúť takto:

Ak sme už investovali do moderného web portálu, tak OpenData API môžeme mať pri dodržaní pár drobností implementované takmer zadarmo.

Tých pár drobností?

  • Použiť pre odpoveď zo serveru formát JSON.
  • Neprirábať si zbytočne prácu a teda nevyžadovať v požiadavke na server zbytočnosti typu session cookie a pod.

Dva (alebo tri?) príklady na priblíženie:

Príklad prvý, ten horší, ale stále použiteľný: vlada.gov.sk - Objednávky

http://www.vlada.gov.sk/objednavky/ používa AJAX na stránkovanie pri vyhľadávaní v zozname objednávok. Toto síce sťažuje možnosť webové sídlo ľahko indexovať (Google či iným vyhľadávacím službám), na druhú stranu to však aspoň poskytuje možnosť využitia ako API:

 

Požiadavka na server (request)
GET /index.php?callback=jQuery15105559563392955166_1377602640282&art=98&page=4&ID=74&action=1&_=1377602719094 HTTP/1.1
Host    objednavky.vlada.gov.sk
User-Agent    Mozilla/5.0 (X11; Linux x86_64; rv:23.0) Gecko/20100101 Firefox/23.0
Accept    */*
Accept-Language    en-us,en;q=0.3
Accept-Encoding    gzip, deflate
DNT    1
Referer    http://www.vlada.gov.sk/objednavky/
Cookie    __utma=62500331.438932778.1377602534.1377602534.1377602534.1; __utmb=62500331.2.10.1377602534; __utmc=62500331; __utmz=62500331.1377602534.1.1.utmcsr=otvorenavlada.gov.sk|utmccn=(referral)|utmcmd=referral|utmcct=/; PHPSESSID=7ba14c5de5ca7bfec83074acfc5fdd0c
Connection    keep-alive
Odpoveď servera (response)
HTTP/1.1 200 OK
Date    Tue, 27 Aug 2013 11:25:25 GMT
Server    Apache
X-Powered-By    PHP/5.2.6-1+lenny16
Expires    Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control    no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma    no-cache
Vary    Accept-Encoding
Content-Encoding    gzip
Content-Length    2409
Content-Type    text/html
Connection    keep-alive

jQuery15105559563392955166_1377602640282("<p>V\u0161etky sumy v tabu\u013ek\u00e1ch s\u00fa uv\u00e1dzan\u00e9 v eur\u00e1ch s DPH. <\/p>\r\n<table class=\"table_list\" border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\r\n<tr>\r\n  <th class=\"cell1\"><div>D\u00e1tum<div class=\"sort\">\r\n<krátené><\/div>");

 

Nie je to úplne ono, keďže odpoveď je vo formáte HTML, ale na scrapovanie postačí.

Príklad druhý, dobrý: Mapový klient ZBGIS

https://zbgis.skgeodesy.sk/tkgis/default.aspx používa AJAX vrámci vyhľadávania v mape Slovenska s tým, že výsledok volania je vo formáte JSON:

Požiadavka na server (request)
GET /tkgis/GeoSearch.svc/Search?name=*Karlova%20Ves*&count=10&start=0&wkid=102067 HTTP/1.1
Host    zbgis.skgeodesy.sk
User-Agent    Mozilla/5.0 (X11; Linux x86_64; rv:23.0) Gecko/20100101 Firefox/23.0
Accept    text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language    en-US,en;q=0.5
Accept-Encoding    gzip, deflate
DNT    1
Content-Type    application/json; charset=utf-8
X-Requested-With    XMLHttpRequest
Referer    https://zbgis.skgeodesy.sk/tkgis/default.aspx
Cookie    ctl00_plcBody_lvIdentificationRequestForm_fpnlIdentificationRequestForm_identificationRequestForm_treeLayersSaveStateCookie=undefined; ctl00_plcBody_lvThemeSelector_fpnlThemeSelector_themeSelector_TreeSaveStateCookie=undefined; .ZBGISAUTH=E8584BAA89845C481042AA91CBD15B2F8286D359FA7FC9D5E7ECF0BDCBB08AB4BE8A0C8F9A4560AF8CD243DC706AF51717389241FA46883F65E518682060E26EC2E882ABF55AF3258FE047A97E0D8A567B259A32BC584C2FE4F9195924D81ED9457C0DCAE2FFD3971E61FC3405CA8B7F71B2346FB123CEFA879CF1043C34D7BECB3757390A1E9F07F80041D928989711C5BF127AC7E93C7D37C3FC6D508D113B4A1DB2196B6010A2E9E02620342DE162DC5B2468DE410CBF632A2D320C8266853602509F239224D7A6475CE2882237DEE1E9D3DFA35088D07C1FE8DD2B6EBB1380A70BFF02FF42C0E060022C7E4869D03B64BE90017CA2674177B98933A394A81F009DEC606452DD9A2487458F81E2F275B59E67FBD1411309151E1C514B443D0FA6C787E4D0A34AB08E60E2DBAE358856C70CEA5AAFE937E50FDB1B05310F9DB6A29593D76639E95BA6B1E7A44F4C3DEA4BD65A483DBEEA54729501B66AF5ABA40044A74D9B8EAAFDB734FD921E12BF8BFC42D1F7024EE381F748A8EC48A3309AE36541C28F31031483F19696AB0E19E0C1F411EA5617B0C1E97A87808EF4664CF93E8BB1BF025B4106706289C9F4892C341B27056708F78A68A6843D600738BC30211DA58EB003AB81CF684FB2821F15DA6C9D4BEC4EF544FA38386475841CD4E6F46821AF8CA325AB65FD81997AE512691CB2A946F7E53DDDCB0480C41D29; _ga=GA1.2.792845209.1381294320; .ZBGIS_SessionId=dobixe1dst13xfgecwl5lcy2
Connection    keep-alive
Odpoveď servera (response)
{"SearchResult":[{"category":"Mestská časť BA","district":"Bratislava IV","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-577601.95109999925,"y":-1279244.2300999984},"id":97348,"label":"","name":"Bratislava-Karlova Ves","scale":25000,"town":"Bratislava-Karlova Ves"},{"category":"Časť obce","district":"Bratislava IV","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-577601.95120000094,"y":-1279244.2300999984},"id":97347,"label":", okres Bratislava IV","name":"Karlova Ves","scale":10000,"town":"Bratislava-Karlova Ves"},{"category":"Katastrálne územie","district":"Bratislava IV","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-578128.83799999952,"y":-1279162.4158000015},"id":97600,"label":", okres Bratislava IV","name":"Karlova Ves","scale":100000,"town":"Bratislava-Karlova Ves"},{"category":"Mestský, obecný úrad","district":"Bratislava IV","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-577583.18719999865,"y":-1278689.9197999984},"id":97342,"label":", okres Bratislava IV","name":"Karlova Ves","scale":5000,"town":"Bratislava-Karlova Ves"},{"category":"Knižnica","district":"Bratislava IV","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-577187.98710000142,"y":-1279630.3944999985},"id":96821,"label":"","name":"Miestna knižnica Karlova Ves","scale":5000,"town":"Bratislava-Karlova Ves"},{"category":"Polícia","district":"Bratislava IV","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-577980.06940000132,"y":-1279581.9820999987},"id":97350,"label":"","name":"Obvodné oddelenie PZ Bratislava-Karlova Ves","scale":5000,"town":"Bratislava-Karlova Ves"},{"category":"Nemocnica","district":"Bratislava IV","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-577050.30999999866,"y":-1279419.8027999997},"id":96823,"label":"","name":"Poliklinika Karlova Ves","scale":5000,"town":"Bratislava-Karlova Ves"}]} 

Úplná nádhera. Už si len overme, či server náhodou nie je "zabezpečený" a nereguluje prístup vyžadovaním zbytočných údajov (viď napr. http://www.slideshare.net/pavolzbell/open-courts-rubyslava, povedzme slide č. 24: ~2MB premenná VIEWVSTATE - a toť vlastne príklad tretí, zlý):

Prepínam do "command line" a naschvál som zmenil "Karlova Ves" na "Dubravka":

Odoslanie požiadavky na server pomocou nástroja curl
curl -k 'https://zbgis.skgeodesy.sk/tkgis/GeoSearch.svc/Search?name=*Dubravka*&count=10&start=0&wkid=102067'

A funguje to dobre, podľa optimistického očakávania:

Odpoveď servera (response)
{"SearchResult":[{"category":"Mestská časť BA","district":"Bratislava IV","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-578064.17859999835,"y":-1276317.8623999991},"id":97596,"label":"","name":"Bratislava-Dúbravka","scale":25000,"town":"Bratislava-Dúbravka"},{"category":"Obec","district":"Michalovce","fcName":"Obec","fcZbgisId":"{0C72F59C-9421-4FD6-BE09-03ED9F437137}","geometry":{"id":-1,"wkid":102067,"x":-216791.43950000033,"y":-1250797.2016999982},"id":106028,"label":", okres Michalovce","name":"Dúbravka","scale":50000,"town":"Dúbravka"},{"category":"Časť obce","district":"Michalovce","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-216791.43989999965,"y":-1250797.2021000013},"id":16107,"label":", okres Michalovce","name":"Dúbravka","scale":10000,"town":"Dúbravka"},{"category":"Časť obce","district":"Bratislava IV","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-578064.17859999835,"y":-1276317.8623999991},"id":97597,"label":", okres Bratislava IV","name":"Dúbravka","scale":10000,"town":"Bratislava-Dúbravka"},{"category":"Katastrálne územie","district":"Michalovce","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-217545.49300000072,"y":-1251675.8907999992},"id":16815,"label":", okres Michalovce","name":"Dúbravka","scale":100000,"town":"Dúbravka"},{"category":"Katastrálne územie","district":"Bratislava IV","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-578637.98800000176,"y":-1275335.6030000001},"id":97593,"label":", okres Bratislava IV","name":"Dúbravka","scale":100000,"town":"Bratislava-Dúbravka"},{"category":"Vrch","district":"Sobrance","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-185326.64499999955,"y":-1243009.3889999986},"id":1146,"label":", okres Sobrance","name":"Dúbravka","scale":100000,"town":"Husák"},{"category":"Vodný tok","district":"Liptovský Mikuláš","fcName":"Názov vodného toku","fcZbgisId":"{0DAE2CFE-604A-43E3-89DB-C65DA09F575C}","geometry":{"id":-1,"wkid":102067,"x":-389388.73440000042,"y":-1193550.0093999989},"id":98872,"label":", okres Liptovský Mikuláš","name":"Dúbravka","scale":25000,"town":"Ľubeľa"},{"category":"Les","district":"Senica","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-572572.37480000034,"y":-1227068.2650000006},"id":97649,"label":", okres Senica","name":"Dúbravka","scale":50000,"town":"Borský Svätý Jur"},{"category":"Pošta","district":"Bratislava IV","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-578592.55959999934,"y":-1275529.4842999987},"id":97590,"label":", okres Bratislava IV","name":"Dúbravka","scale":5000,"town":"Bratislava-Dúbravka"},{"category":"Mestský, obecný úrad","district":"Bratislava IV","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-579067.1640000008,"y":-1275244.5441999994},"id":97975,"label":", okres Bratislava IV","name":"Dúbravka","scale":5000,"town":"Bratislava-Dúbravka"}]}

Čiže portál ZBGIS poskytuje API a už len k nemu musíme získať dokumentáciu, napr. pomocou reverse engineering.

Niekoľko narýchlo zistených vlastností:

  • Vieme takto vyhľadávať kraje, okresy, katastrálne územia, mestá, mestské časti, mestečká a obce a tiež napríklad aj vodné toky, úrady,  policajné stanice, hasičov, ... a napríklad aj polia.
  • K vyhľadaným objektom získavame aj pár doplňujúcich údajov: k akému "distriktu" patrí mestská čast, a pod.
  • Nevieme žiaľ takto vyhľadávať ulice (to je však obmedzenie portálu ako takého a príčinou je to, že údaje o uliciach "vlastní" iná štátna organizácia - viď poznámky z konferencie Inspirujme se, 2013).
  • "x" a "y" nie sú GPS koordináty, vyzerá to byť formát WPS, konkrétne S-JTSK, viď http://www.sazp.sk/slovak/struktura/ceev/DPZ/EDU/c522.htm .
    • Transformačná služba na https://zbgis.skgeodesy.sk/zbgistransform/ z S-JTSK na LATLON vyzerá funkčne, konkrétne napr. bod
      "category":"Mestský, obecný úrad","district":"Bratislava IV",..."geometry":{"id":-1,"wkid":102067,"x":-579067.1640000008,"y":-1275244.5441999994}
      úspešne transformuje na
      48° 11' 20.84431" 17° 01' 43.66478"
      čo podľa Google maps je MÚ Dúbravka.

Prípadné ďalšie otázky

  1. Čo všetko to vie vyhľadávať?
  2. Čo je zdrojom údajov?
  3. ...
  4. "Nezlepší" alebo "úplne nevypne" toto API niekto niekedy?

 

1 Comment

  1. Ku ZB GIS smutná realita:
    - vektorové dáta a atribúty objektov plánuje úrad PREDÁVAŤ
    - existencia tohto "nezabezpečeného" API rozhrania bola úradu vytknutá v jednom bezpečnostnom audite
    - na Inspirujme se 2013 som sa o tom bavil so šéfkou príslušného odboru (Leitmanová): na téze o predávaní dát trvajú, "problém s API" sa bude riešiť...
    - aktuálna výhovorka je, že musia plniť príjmy štátneho rozpočtu, ktoré majú dohodnuté s MF

    Ináč implementovala to firma http://www.zymestic.sk/ , ak teda máš záujem o dokumentáciu.