API ČÚZK

Ukázka použití API českého katastrálního úřadu

Vyhledání adresního místa z katastru nemovitostí

Hledání adresního místa

Ukázka použití CUZK API

API ČÚZK nabízí několik možností, na co se dotazovat. Na databázové tabulky, či relační vazby, v tomto případě ale používáme dotaz "findAddressCandidates", který je optimalizovaný na velmi rychlé vyhledání místa odpovídající zadanému textu.

Nás zajímá adresní místo a proto využijeme dotaz "findAddressCandidates" (viz Cuzk findAddressCandidates )

Na adresní místo se můžeme doptat i přímo nad tabulkou adresních míst. Bohužel vzhledem k tomu že nevíme jak uživatel název zadal musíme se ptát dotazem like a to oboustraně '%abc%' a ještě navíc s funkcí UPPER() na sloupečku adresa. Čas návratu je pak mezi 1-6 vteřinami.

Kdežto findAddressCandidates se vrací do 500ms.

Třída pro vytvoření url dotazu v TypeScript

Nejprve je nutné sestavit url dotazu na server cuzk, pro to jsem napsal jednoduchou třídu.


class RuianFindAddressCandidates {
    get ApiUrl(): string { return "https://ags.cuzk.cz/arcgis/rest/services/RUIAN/Vyhledavaci_sluzba_nad_daty_RUIAN/MapServer/exts/GeocodeSOE"; }
    get ApiQuery(): string { return "findAddressCandidates?"; }
    f = RuianFormat.Json;
    singleLine = "";
    magicKey = "";
    outSR = "";
    maxLocations = 100;
    outFields = "Type%2CMatch_addr%2CXmin%2CXmax%2CYmin%2CYmax";
    searchExtent = "";


    constructor(singleLine: string, maxLocations: number = 100, format: RuianFormat = RuianFormat.Json) {
        this.singleLine = singleLine;
        this.maxLocations = maxLocations;
        this.f = format;
    }

    BuildUrl() {
        var str: string = "";
        str = str.concat(
            this.ApiUrl,
            "/",
            this.ApiQuery,
            "SingleLine=" + encodeURI(this.singleLine), "&",
            "magicKey=" + this.magicKey, "&",
            "outSR=" + this.outSR, "&",
            "maxLocations=" + this.maxLocations, "&",
            "outFields=" + this.outFields, "&",
            "searchExtent=" + this.searchExtent, "&",
            "f=" + this.f
        );
        return str;
    }
}
const enum RuianFormat {
    Html = "html",
    Json = "json",
    PJson = "pJson",
}
    

Ajaxový požadavek na url

Funkci předáme callback, který má být vykonán až objekt dorazí.


/**
 * Ajax Get request
 * @param url get url
 * @param callback with one parameter (received object)
 */
function GetAnyObjectWithAjax(url: string, callback: Function) {
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function () {
        if (this.readyState == 4 && this.status == 200) {
            var obj = JSON.parse(this.responseText);
            callback(obj);
        }
    };
    xhttp.open("GET", url, true);
    xhttp.send();
}

Použití

Sestavíme url požadavku pomocí třídy RuianFindAddressCandidates A zavoláme GetAnyObjectWithAjax kterému předáme url a funkci která má být vykonána


//build url
var r = new RuianFindAddressCandidates(searString, 100, RuianFormat.Json);
var url = r.BuildUrl();
//get json
GetAnyObjectWithAjax(url, function (obj) {
    try {
        for (let index = 0; index < obj.candidates.length; index++) {
            //přijatý objekt address candidate
            const candidate = obj.candidates[index];
            address = candidate.address;
            loc = candidate.location;
            att = candidate.attributes;
            if (att.Type != RuianTableNames.AdresniMisto) {
                continue;
            }
            /*
            Zde máme naší adresu a můžeme s ní dále pracovat!
            */
        }
    } catch { }
});

Dále

S adresami co nám přišly můžeme dále pracovat, nabízí se vyzvořit "autocomplete" viz například návod na W3School: How TO - Autocomplete, který jsem využil v tomto příkladu.

Souřadnice adresního místa

Cuzk nám vrátilo kromě jména adresního místa také souřadnice v J-TSK, a extents(od-do) v WGS-84 (známé GPS), nicméně z pokusů jsem zjistil že souřadnice nejsou vždy v pořádku, v městech asi dobré, ale na některých obcích ukazují do přilehlého rybníka, či pole namísto správného místa. Proto pro zobrazení na mapě využívám hledání od Mapy.cz

Mapy API

Mapy.cz nabízejí pěkné srozmitelné API a s ním se dá také dále pracovat. viz MapyAPI.

Moje použití API od mapy.cz je celkem primitivní a spočívá v funkci SMap.Geocoder(address, odpovedMap) Která hledá adresu a vrátí její pozici, tu následně zobrazím pomocí mapa.setCenterZoom(stred, 14, true); před použítím v JavaScriptu je nutné načíst script: <type="text/javascript" src="https://api.mapy.cz/loader.js"></script>


//@ts-ignore
Loader.load();
var mapa;
var layer;
/**
 * Zobrazí adresu na mapě
 * @param address
 */
function ShowMap(address: string) {
    //@ts-ignore
    mapa = new SMap(JAK.gel("map"));
    //@ts-ignore
    mapa.addDefaultLayer(SMap.DEF_BASE).enable();
    mapa.addDefaultControls();
    //@ts-ignore
    new SMap.Geocoder(address, odpovedMap);
}
/**
 * callback funkce pro vyhledání adresy v mapy.cz
 * @param geocoder
 */
function odpovedMap(geocoder: any) { /* Odpověď */
    if (!geocoder.getResults()[0].results.length) {
        return;
    }
    var vysledky = geocoder.getResults()[0].results;
    var item = vysledky[0];
    var stred = item.coords;
    if (layer) layer.removeAll();
    //@ts-ignore
    layer = new SMap.Layer.Marker();
    mapa.addLayer(layer);
    layer.enable();
    var options = {};
    //@ts-ignore
    var marker = new SMap.Marker(stred, "myMarker", options);
    layer.addMarker(marker);
    mapa.setCenterZoom(stred, 14, true);
}

Použití API ČÚZK a Mapy.cz

Použito:

  • TypeScript/JS
  • API CUZK
  • API MAPY.CZ
  • AutoComplete input