DatovaMapa.sk

Strojovo čitateľná verzia: /dokumentacia/pre-ai-agentov.md

Návod pre AI agentov: pripojenie dát do DátovejMapy

Tento dokument je určený AI agentom, ktorí pripravujú dáta pre portál DátováMapa. Poskytovateľom môže byť ktokoľvek, kto má dáta s polohou. Popisuje cieľ, postup, pravidlá a kritériá hotovej práce. Človek, ktorý agenta riadi, nájde zrozumiteľnejšiu verziu v sprievodcovi pre poskytovateľov.

Cieľ

Zverejniť na HTTPS:

  1. manifest – JSON podľa schémy manifestu,
  2. pre každú dátovú sadu zdroj dát – GeoJSON súbor alebo endpoint podľa schémy dát a OpenAPI kontraktu poskytovateľa, prípadne existujúce rastrové dlaždice / WMS,

tak, aby validátor vrátil "valid": true a čo najmenej varovaní.

Čo si načítať

Zdroj Prečo
llms.txt rozcestník celej dokumentácie
Protokol 0.1 normatívna špecifikácia – pri nejasnosti platí tá
JSON Schema manifestu, dát presné typy, limity a popisy polí
OpenAPI poskytovateľa kontrakt endpointu, dá sa z neho generovať server
manifest-complete.json, manifest-minimal.json platné vzory
data-points.json, data-polygons.json platné vzory odpovedí
Katalóg čo už v portáli je – nevytvárajte duplicity, inšpirujte sa kľúčovými slovami

Ak viete používať MCP, pripojte sa k serveru https://datovamapa.sk/mcp (Streamable HTTP, bez autentifikácie). Nástroje documentation, schema, example, validate_manifest, validate_data a catalog pokrývajú všetko v tomto návode. Pozri MCP server.

Postup

1. Inventúra dát

Zistite, aké priestorové dáta poskytovateľ má: databázy (PostGIS, MS SQL), GIS súbory (SHP, GPKG, KML, CSV so súradnicami), existujúce API, služby WMS/WMTS. Pri každom zdroji zistite:

2. Návrh dátových sád

Situácia source
do ~2 000 objektov, menia sa najviac denne statický súbor, "type": "geojson", "mode": "full"
viac objektov alebo živé dáta endpoint, "mode": "bbox", nastavte coverage.bbox a pri veľkých sadách coverage.minZoom
už existuje WMS / XYZ dlaždice "type": "raster" so šablónou {bbox-epsg-3857} alebo {z}/{x}/{y}; doplňte presentation.legend (farby a popisky z legendy služby, napr. ArcGIS …/MapServer/legend?f=json alebo WMS GetLegendGraphic)

3. Prevod dát

Prevod GIS súboru do GeoJSON:

ogr2ogr -f GeoJSON -t_srs EPSG:4326 -lco RFC7946=YES -lco COORDINATE_PRECISION=6 lavicky.geojson vstup.shp

Prevod súradníc v Pythone:

from pyproj import Transformer

to_wgs84 = Transformer.from_crs("EPSG:5514", "EPSG:4326", always_xy=True)
lon, lat = to_wgs84.transform(x_sjtsk, y_sjtsk)  # always_xy=True vracia [lon, lat]

4. Manifest

Vyplňte nielen povinné polia, ale aj tie, ktoré rozhodujú o tom, či dáta niekto nájde:

5. Vizualizácia

Geometria Vhodný typ Poznámka
body, desiatky až stovky circle farba podľa kategórie (categorical), popisok cez label
body, tisíce circle s cluster alebo heatmap heatmapa len pre hustotu, neukazuje jednotlivé objekty
línie line šírka môže závisieť od hodnoty
plochy s hodnotou fill + interpolate alebo step kartogram; opacity 0.4–0.6, aby bol vidieť podklad
body alebo plochy, ktorých hodnota sa mení v čase circle / fill + color: { "type": "trend" } ak ide o zmenu (rastie / klesá); rad hodnôt v dm.chart pri každom objekte, trend dopočíta portál
plochy bez hodnoty fill s jednou farbou

Pravidlá: farby hex; kategórie max. ~8 farieb; pre hodnoty použite postupnú škálu od svetlej po tmavú; field v prezentácii musí zodpovedať vlastnosti v dátach (a vo fields, s číselným typom pri interpolate/step). Ak má hodnota objektu históriu, pošlite ju v dm.chart pri akejkoľvek prezentácii – aj pri kartograme s výberom roka (zvolený rok v highlight).

6. Endpoint (len pri mode: "bbox" alebo živých dátach)

Implementujte GET podľa OpenAPI kontraktu:

CORS nie je potrebný – portál sa pýta zo servera.

Python (FastAPI + PostGIS):

from fastapi import FastAPI

app = FastAPI()

@app.get("/datovamapa/kontejnery")
def kontejnery(bbox: str | None = None, zoom: int | None = None, limit: int = 5000, druh: str | None = None):
    west, south, east, north = map(float, bbox.split(",")) if bbox else (-180, -90, 180, 90)
    druhy = druh.split(",") if druh else None
    rows = db.fetch_all(
        """
        SELECT id, druh, objem, vyvoz::text, ST_AsGeoJSON(geom, 6)::json AS geometry
        FROM kontejnery
        WHERE geom && ST_MakeEnvelope(%s, %s, %s, %s, 4326)
          AND (%s::text[] IS NULL OR druh = ANY(%s))
        LIMIT %s
        """,
        (west, south, east, north, druhy, druhy, limit + 1),
    )
    features = [
        {"type": "Feature", "id": r["id"], "geometry": r["geometry"],
         "properties": {"druh": r["druh"], "objem": r["objem"], "vyvoz": r["vyvoz"]}}
        for r in rows[:limit]
    ]
    return {"type": "FeatureCollection", "features": features, "dm": {"truncated": len(rows) > limit, "ttl": 3600}}

TypeScript (Cloudflare Worker / Node, dáta v pamäti):

// KONTEJNERY: pole GeoJSON Feature s bodmi, načítané pri štarte (z databázy alebo súboru).
declare const KONTEJNERY: { type: "Feature"; id: number; geometry: { type: "Point"; coordinates: [number, number] }; properties: Record<string, unknown> }[];

export default {
  async fetch(request: Request): Promise<Response> {
    const url = new URL(request.url);
    const [west, south, east, north] = (url.searchParams.get("bbox") ?? "-180,-90,180,90").split(",").map(Number);
    const limit = Math.min(Number(url.searchParams.get("limit")) || 5000, 5000);
    const inside = KONTEJNERY.filter(({ geometry: { coordinates: [lon, lat] } }) =>
      lon >= west && lon <= east && lat >= south && lat <= north);
    return Response.json(
      { type: "FeatureCollection", features: inside.slice(0, limit), dm: { total: inside.length, truncated: inside.length > limit } },
      { headers: { "Content-Type": "application/geo+json", "Cache-Control": "public, max-age=300" } },
    );
  },
};

7. Validácia

Opakujte, kým nie sú chyby, a prejdite každé varovanie (opravte, alebo vedome ponechajte a zdôvodnite):

# manifest (bez zverejnenia)
curl -sX POST https://datovamapa.sk/api/validate -H 'Content-Type: application/json' --data @manifest.json
# dáta proti konkrétnej sade
curl -sX POST https://datovamapa.sk/api/validate -H 'Content-Type: application/json' \
  --data "{\"data\": $(cat lavicky.geojson), \"dataset\": $(jq '.datasets[0]' manifest.json)}"
# živý test zverejneného manifestu a všetkých zdrojov
curl -s 'https://datovamapa.sk/api/validate?manifestUrl=https://www.obec-priklad.sk/datovamapa/manifest.json'

Odpoveď: { valid, summary, errors: [{ path, code, message, hint? }], warnings: [...] }, pri živom teste navyše datasets[] s dopytom, dobou odozvy a počtom objektov. Význam kódov je v API portálu.

8. Odovzdanie človeku

Na záver zhrňte:

Keď človek potvrdí licenciu a obsah, zaregistrujte manifest: POST https://datovamapa.sk/api/registration s { "manifestUrl": "…" } alebo MCP nástroj register_provider. Dáta budú dostupné ako neschválené (s varovaním, mimo katalógu), kým ich prevádzkovateľ neschváli. Po každej zmene manifestu čakajú na nové schválenie. Podrobnosti: registrácia.

Pravidlá

Kritériá hotovej práce

Zadanie pre agenta (na skopírovanie)

Človek môže svojmu agentovi dať tento text:

Priprav naše priestorové dáta pre portál DátováMapa (https://datovamapa.sk).
Postupuj podľa návodu https://datovamapa.sk/dokumentacia/pre-ai-agentov.md
(rozcestník dokumentácie: https://datovamapa.sk/llms.txt, MCP server: https://datovamapa.sk/mcp).
Zdroje dát: <popíš databázy, súbory, služby>.
Kam zverejniť: <web / server / repozitár>.
Licencia: <napr. CC BY 4.0, atribúcia „© Obec Príklad“> – inú si nevymýšľaj.
Hotovo je, keď živý test validátora vracia valid: true a prejdeš kritériá hotovej práce.
Na konci mi odovzdaj zhrnutie podľa kroku 8.