{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "1950b8a5-626d-461e-9011-c9f79946c5be",
   "metadata": {},
   "source": [
    "# DOP20-Daten zerlegen"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c63146e7-8952-4b87-8e9e-9dbc61699337",
   "metadata": {},
   "source": [
    "## Hinweise zu den verwendeten Daten"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c41c475b-3d31-4a03-a64c-c7ed3aaaae9c",
   "metadata": {},
   "source": [
    "#### AdV-Kacheln 1km x 1km (k1) für DOP"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "97f2a3f5-09b6-45f8-8fd1-af132c3fd628",
   "metadata": {},
   "source": [
    "Die AdV-Kacheln 1km x 1km (k1) der AdV decken das Bundesgebiet durch quadratische Teilgebiete (Kacheln) der Größe 1km x 1km in verschiedenen Georeferenzierungen ab.\n",
    "Mit Ausnahme der Kacheln an den Bundesgrenzen ist jede Kachel vollständig gefüllt.\n",
    "\n",
    "Die Ecken der Kachelsysteme liegen exakt auf ganzen Vielfachen der Kachelgröße in der jeweiligen Georeferenzierung. Das bedeutet, dass der Rechtswert und der Hochwert jeder Ecke auf ganzzahligen Kilometern liegen und beide Werte ein ganzzahliges Vielfaches der Kachelgröße darstellen. Die Ecken der Kacheln sind identisch mit den äußeren Ecken der Pixel.\n",
    "\n",
    "Die Bezeichnung der einzelnen Kacheln setzt sich aus Produktname, Rechts- und Hochwert (linke untere Ecke) nach Gauß-Krüger und Seitenlänge (in km) zusammen.\n",
    "\n",
    "Beispiele:<br>\n",
    "dop_32_568_5402_1 bezeichnet eine DOP-Kachel mit den Maßen 1x1 km in UTM32<br>\n",
    "dop_33_230_5327_1 bezeichnet eine DOP-Kachel mit den Maßen 1x1 km in UTM33"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "adbc3adc-48a7-4a61-9c6d-de49d8af2e5c",
   "metadata": {},
   "source": [
    "© GeoBasis-DE / [BKG](https://www.bkg.bund.de) 2023 [dl-de/by-2-0](https://www.govdata.de/dl-de/by-2-0)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "489807f2-bde7-413e-b4e7-3985847fd90f",
   "metadata": {},
   "source": [
    "## Analysedaten aufbereiten"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d43a8197-c775-4226-b233-e4edcef4d37d",
   "metadata": {},
   "source": [
    "<div>\n",
    "<img src=\"doc/images/DOP20-VHM.png\" width=\"500\" style=\"display: block; margin: auto;\" />\n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d1e642dc-8e19-4704-b23e-38f584c7e92e",
   "metadata": {},
   "source": [
    "### Kachelbereich festlegen"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4df311c2-0233-4f92-9ccf-76a0b3820f0e",
   "metadata": {},
   "source": [
    "In diesem Kontext werden die Bilddaten auf 11 Kacheln im gelben Teilbereich eingegrenzt (470-5489, 468-5488, ...).<br>\n",
    "Die Kachel haben eine Bildgröße von 5000 x 5000 px. Bei einer Fläche von 1km x 1km entspricht dies 20cm/px.<px>\n",
    "Jede Kachel wird in weitere 10 Teilkacheln untergliedert.<br>\n",
    "Dabei werden die einzelnen Kacheln in Unterverzeichnisse mit dem urspünglichen Kachelname abgelegt."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "7e5865f5-2ddb-4adf-b1cc-1566699295c0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Requirement already satisfied: Pillow in /opt/conda/lib/python3.11/site-packages (10.1.0)\n"
     ]
    }
   ],
   "source": [
    "!pip install Pillow"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "40d62634-dca3-4fb9-b7da-bdb11c763c20",
   "metadata": {},
   "outputs": [],
   "source": [
    "from PIL import Image\n",
    "import os\n",
    "import shutil\n",
    "import zipfile"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "6548fa14-43f6-4c39-962c-2c17e4decee4",
   "metadata": {},
   "outputs": [],
   "source": [
    "def packdir(pathname):\n",
    "    # Überprüfen, ob das Verzeichnis existiert\n",
    "    if os.path.isdir(pathname):\n",
    "        # Erstellen des Zip-Archivs\n",
    "        shutil.make_archive(f\"{pathname}\", 'zip', pathname)\n",
    "        print(f'Das Verzeichnis \"{pathname}\" wurde erfolgreich in \"{pathname}.zip\" gezippt.')\n",
    "    else:\n",
    "        print(f'Das Verzeichnis \"{pathname}\" existiert nicht.')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "8bba0b52-52d3-44a0-9a25-41f78cbeb246",
   "metadata": {},
   "outputs": [],
   "source": [
    "def split_image(image_path, output_dir, tile_size):\n",
    "    print(f\"image_path:{image_path}\")\n",
    "    print(f\"output_dir:{output_dir}\")\n",
    "    print(f\"tile_size:{tile_size}\")\n",
    "    #return\n",
    "    # Bild öffnen\n",
    "    img = Image.open(image_path)\n",
    "    \n",
    "    # Ausgabeordner anlegen, falls er nicht existiert\n",
    "    if not os.path.exists(output_dir):\n",
    "        os.makedirs(output_dir)\n",
    "    \n",
    "    # Berechne die Anzahl der Kacheln in jeder Dimension\n",
    "    num_tiles_x = img.width // tile_size\n",
    "    num_tiles_y = img.height // tile_size\n",
    "    \n",
    "    # Iteriere über alle Kacheln\n",
    "    for i in range(num_tiles_y):\n",
    "        for j in range(num_tiles_x):\n",
    "            # Berechne die Koordinaten für das Zuschneiden\n",
    "            left = j * tile_size\n",
    "            upper = i * tile_size\n",
    "            right = left + tile_size\n",
    "            lower = upper + tile_size\n",
    "            \n",
    "            # Schneide das Teilbild aus\n",
    "            tile = img.crop((left, upper, right, lower))\n",
    "            \n",
    "            # Generiere den Dateinamen basierend auf dem Index\n",
    "            filename = f\"tile_{i}_{j}.jpg\"\n",
    "            \n",
    "            # Speichere das Teilbild\n",
    "            tile.save(os.path.join(output_dir, filename))\n",
    "    \n",
    "    print(f\"Bild wurde in {num_tiles_x * num_tiles_y} Teilbilder aufgeteilt.\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "d8d06ad5-4d71-43e8-acc9-8ee2f426ec0d",
   "metadata": {},
   "outputs": [],
   "source": [
    "def splitDop20():\n",
    "    tiles=[\"470_5489\",\n",
    "           \"468_5488\",\n",
    "           \"469_5488\",\n",
    "           \"470_5488\",\n",
    "           \"471_5488\",\n",
    "           \"468_5487\",\n",
    "           \"469_5487\",\n",
    "           \"470_5487\",\n",
    "           \"471_5487\",\n",
    "           \"468_5486\",\n",
    "           \"469_5486\"\n",
    "          ]\n",
    "    for tile in tiles:\n",
    "      filename=f\"images/dop20_32_{tile}_1_he.jpg\"\n",
    "      output_dir=f\"{os.path.dirname(filename)}/{tile}\"\n",
    "      split_image(image_path=f\"{filename}\", output_dir=output_dir, tile_size=500)\n",
    "      packdir(output_dir)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "63a47e16-af87-4c21-831a-51a0a40c2d22",
   "metadata": {},
   "outputs": [],
   "source": [
    "splitDop20()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
