A previous `git pull --rebase origin main` dropped 177 local commits,
losing 3400+ files across admin-v2, backend, studio-v2, website,
klausur-service, and many other services. The partial restore attempt
(660295e2) only recovered some files.
This commit restores all missing files from pre-rebase ref 98933f5e
while preserving post-rebase additions (night-scheduler, night-mode UI,
NightModeWidget dashboard integration).
Restored features include:
- AI Module Sidebar (FAB), OCR Labeling, OCR Compare
- GPU Dashboard, RAG Pipeline, Magic Help
- Klausur-Korrektur (8 files), Abitur-Archiv (5+ files)
- Companion, Zeugnisse-Crawler, Screen Flow
- Full backend, studio-v2, website, klausur-service
- All compliance SDKs, agent-core, voice-service
- CI/CD configs, documentation, scripts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
185 lines
5.9 KiB
Bash
Executable File
185 lines
5.9 KiB
Bash
Executable File
#!/bin/bash
|
|
# ============================================
|
|
# PMTiles Generation Script for GeoEdu Service
|
|
# ============================================
|
|
#
|
|
# Generiert PMTiles Vector Tiles aus PostGIS OSM Daten
|
|
# Verwendet tippecanoe fuer die Tile-Generierung
|
|
#
|
|
# Voraussetzungen:
|
|
# - OSM Daten in PostGIS importiert
|
|
# - tippecanoe installiert
|
|
# - ogr2ogr (GDAL) installiert
|
|
#
|
|
# Nutzung:
|
|
# ./generate_tiles.sh [--min-zoom 0] [--max-zoom 14]
|
|
#
|
|
# ============================================
|
|
|
|
set -e
|
|
|
|
# Configuration
|
|
DATA_DIR="${OSM_DATA_DIR:-/app/data/osm}"
|
|
OUTPUT_FILE="${DATA_DIR}/germany.pmtiles"
|
|
DATABASE_URL="${DATABASE_URL:-postgresql://breakpilot:breakpilot123@postgres:5432/breakpilot_db}"
|
|
|
|
MIN_ZOOM="${MIN_ZOOM:-0}"
|
|
MAX_ZOOM="${MAX_ZOOM:-14}"
|
|
|
|
# Parse DATABASE_URL
|
|
DB_USER=$(echo $DATABASE_URL | sed -n 's|.*://\([^:]*\):.*|\1|p')
|
|
DB_PASS=$(echo $DATABASE_URL | sed -n 's|.*://[^:]*:\([^@]*\)@.*|\1|p')
|
|
DB_HOST=$(echo $DATABASE_URL | sed -n 's|.*@\([^:]*\):.*|\1|p')
|
|
DB_PORT=$(echo $DATABASE_URL | sed -n 's|.*:\([0-9]*\)/.*|\1|p')
|
|
DB_NAME=$(echo $DATABASE_URL | sed -n 's|.*/\([^?]*\).*|\1|p')
|
|
|
|
# Colors
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m'
|
|
|
|
echo -e "${YELLOW}============================================${NC}"
|
|
echo -e "${YELLOW}GeoEdu Service - PMTiles Generation${NC}"
|
|
echo -e "${YELLOW}============================================${NC}"
|
|
echo ""
|
|
|
|
# Parse arguments
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
--min-zoom)
|
|
MIN_ZOOM="$2"
|
|
shift 2
|
|
;;
|
|
--max-zoom)
|
|
MAX_ZOOM="$2"
|
|
shift 2
|
|
;;
|
|
*)
|
|
echo "Unbekannte Option: $1"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
echo "Zoom Level: $MIN_ZOOM - $MAX_ZOOM"
|
|
echo "Output: $OUTPUT_FILE"
|
|
echo ""
|
|
|
|
# Estimate output size
|
|
if [ "$MAX_ZOOM" -le 14 ]; then
|
|
ESTIMATED_SIZE="200-500 GB"
|
|
elif [ "$MAX_ZOOM" -le 16 ]; then
|
|
ESTIMATED_SIZE="500-800 GB"
|
|
else
|
|
ESTIMATED_SIZE="2-4 TB"
|
|
fi
|
|
|
|
echo -e "${YELLOW}Geschaetzte Groesse: $ESTIMATED_SIZE${NC}"
|
|
echo -e "${YELLOW}Geschaetzte Dauer: 12-24 Stunden (Zoom 0-14)${NC}"
|
|
echo ""
|
|
|
|
# Check for required tools
|
|
for tool in tippecanoe ogr2ogr; do
|
|
if ! command -v $tool &> /dev/null; then
|
|
echo -e "${RED}Fehler: $tool nicht installiert!${NC}"
|
|
echo ""
|
|
if [ "$tool" == "tippecanoe" ]; then
|
|
echo "Installation:"
|
|
echo " git clone https://github.com/felt/tippecanoe.git"
|
|
echo " cd tippecanoe && make -j && sudo make install"
|
|
else
|
|
echo "Installation:"
|
|
echo " apt-get install gdal-bin # Debian/Ubuntu"
|
|
echo " brew install gdal # macOS"
|
|
fi
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
echo "tippecanoe: $(tippecanoe --version 2>&1 | head -1)"
|
|
echo "ogr2ogr: $(ogr2ogr --version | head -1)"
|
|
echo ""
|
|
|
|
read -p "Tile-Generierung starten? (j/N) " -n 1 -r
|
|
echo ""
|
|
|
|
if [[ ! $REPLY =~ ^[JjYy]$ ]]; then
|
|
echo "Abgebrochen."
|
|
exit 1
|
|
fi
|
|
|
|
# Create temporary directory for GeoJSON
|
|
TEMP_DIR=$(mktemp -d)
|
|
trap "rm -rf $TEMP_DIR" EXIT
|
|
|
|
echo ""
|
|
echo -e "${GREEN}[1/5] Exportiere Landuse/Landcover...${NC}"
|
|
|
|
PGPASSWORD="$DB_PASS" ogr2ogr -f GeoJSONSeq \
|
|
"$TEMP_DIR/landuse.geojsonseq" \
|
|
"PG:host=$DB_HOST port=$DB_PORT user=$DB_USER dbname=$DB_NAME password=$DB_PASS" \
|
|
-sql "SELECT way AS geometry, landuse, natural, name FROM planet_osm_polygon WHERE landuse IS NOT NULL OR natural IS NOT NULL"
|
|
|
|
echo -e "${GREEN}[2/5] Exportiere Gebaude...${NC}"
|
|
|
|
PGPASSWORD="$DB_PASS" ogr2ogr -f GeoJSONSeq \
|
|
"$TEMP_DIR/building.geojsonseq" \
|
|
"PG:host=$DB_HOST port=$DB_PORT user=$DB_USER dbname=$DB_NAME password=$DB_PASS" \
|
|
-sql "SELECT way AS geometry, building, name, addr_housenumber FROM planet_osm_polygon WHERE building IS NOT NULL"
|
|
|
|
echo -e "${GREEN}[3/5] Exportiere Strassen...${NC}"
|
|
|
|
PGPASSWORD="$DB_PASS" ogr2ogr -f GeoJSONSeq \
|
|
"$TEMP_DIR/transportation.geojsonseq" \
|
|
"PG:host=$DB_HOST port=$DB_PORT user=$DB_USER dbname=$DB_NAME password=$DB_PASS" \
|
|
-sql "SELECT way AS geometry, highway, railway, name, ref FROM planet_osm_line WHERE highway IS NOT NULL OR railway IS NOT NULL"
|
|
|
|
echo -e "${GREEN}[4/5] Exportiere Gewaesser...${NC}"
|
|
|
|
PGPASSWORD="$DB_PASS" ogr2ogr -f GeoJSONSeq \
|
|
"$TEMP_DIR/water.geojsonseq" \
|
|
"PG:host=$DB_HOST port=$DB_PORT user=$DB_USER dbname=$DB_NAME password=$DB_PASS" \
|
|
-sql "SELECT way AS geometry, waterway, water, name FROM planet_osm_polygon WHERE water IS NOT NULL OR waterway IS NOT NULL
|
|
UNION ALL
|
|
SELECT way AS geometry, waterway, NULL as water, name FROM planet_osm_line WHERE waterway IS NOT NULL"
|
|
|
|
echo -e "${GREEN}[5/5] Exportiere Orte (POIs)...${NC}"
|
|
|
|
PGPASSWORD="$DB_PASS" ogr2ogr -f GeoJSONSeq \
|
|
"$TEMP_DIR/place.geojsonseq" \
|
|
"PG:host=$DB_HOST port=$DB_PORT user=$DB_USER dbname=$DB_NAME password=$DB_PASS" \
|
|
-sql "SELECT way AS geometry, place, name, population FROM planet_osm_point WHERE place IS NOT NULL"
|
|
|
|
echo ""
|
|
echo -e "${GREEN}Generiere PMTiles...${NC}"
|
|
echo "Dies kann mehrere Stunden dauern!"
|
|
echo ""
|
|
|
|
# Run tippecanoe
|
|
tippecanoe \
|
|
--output="$OUTPUT_FILE" \
|
|
--force \
|
|
--name="GeoEdu Germany" \
|
|
--description="Self-hosted OSM tiles for DSGVO-compliant education" \
|
|
--attribution="© OpenStreetMap contributors" \
|
|
--minimum-zoom="$MIN_ZOOM" \
|
|
--maximum-zoom="$MAX_ZOOM" \
|
|
--drop-densest-as-needed \
|
|
--extend-zooms-if-still-dropping \
|
|
--layer=landuse:"$TEMP_DIR/landuse.geojsonseq" \
|
|
--layer=building:"$TEMP_DIR/building.geojsonseq" \
|
|
--layer=transportation:"$TEMP_DIR/transportation.geojsonseq" \
|
|
--layer=water:"$TEMP_DIR/water.geojsonseq" \
|
|
--layer=place:"$TEMP_DIR/place.geojsonseq"
|
|
|
|
echo ""
|
|
echo -e "${GREEN}============================================${NC}"
|
|
echo -e "${GREEN}PMTiles Generierung abgeschlossen!${NC}"
|
|
echo -e "${GREEN}============================================${NC}"
|
|
echo ""
|
|
echo "Ausgabe: $OUTPUT_FILE"
|
|
echo "Groesse: $(du -h "$OUTPUT_FILE" | cut -f1)"
|
|
echo ""
|
|
echo "Die Tiles sind jetzt bereit fuer den geo-service."
|