Skip to content

Commit 247a926

Browse files
Merge pull request #27 from geo-engine/retro-2025
retro 2025
2 parents 302e0d6 + 3a4483f commit 247a926

27 files changed

+1137
-267
lines changed

package-lock.json

Lines changed: 574 additions & 234 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,24 +14,26 @@
1414
"@fontsource/poppins": "^5.2.7",
1515
"@jop-software/astro-cookieconsent": "^3.0.1",
1616
"@tailwindcss/vite": "^4.1.17",
17-
"astro": "^5.15.5",
17+
"astro": "^5.16.4",
1818
"astro-icon": "^1.1.5",
1919
"astro-pagefind": "^1.8.5",
20+
"maplibre-gl": "^5.14.0",
2021
"preline": "^3.2.3",
21-
"sass": "^1.94.0",
22+
"sass": "^1.95.0",
23+
"scrollama": "^3.2.0",
2224
"tailwindcss": "^4.1.17",
2325
"vanilla-cookieconsent": "^3.1.0"
2426
},
2527
"devDependencies": {
2628
"@iconify-json/gis": "^1.2.5",
2729
"@iconify-json/mdi": "^1.2.3",
28-
"@typescript-eslint/eslint-plugin": "^8.46.4",
29-
"@typescript-eslint/parser": "^8.46.4",
30+
"@typescript-eslint/eslint-plugin": "^8.49.0",
31+
"@typescript-eslint/parser": "^8.49.0",
3032
"eslint": "^9.39.1",
3133
"eslint-config-prettier": "^10.1.8",
3234
"eslint-plugin-astro": "^1.5.0",
33-
"prettier": "^3.6.2",
35+
"prettier": "^3.7.4",
3436
"prettier-plugin-astro": "^0.14.1",
35-
"prettier-plugin-tailwindcss": "^0.7.1"
37+
"prettier-plugin-tailwindcss": "^0.7.2"
3638
}
3739
}

src/components/Data.astro

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import Layout from '../layouts/Layout.astro';
44
import Section from '../components/Section.astro';
55
import {useLocalePages, useTranslations, type LocaleString} from '../i18n/utils';
66
import type {DataEntryMap} from 'astro:content';
7-
import {mdExcerpt} from './utils';
7+
import {mdExcerpt, pictureWidths} from './utils';
88
99
interface Props {
1010
datum: DataEntryMap['data'];
@@ -43,7 +43,7 @@ const t = useTranslations(lang);
4343

4444
<Layout title={datum.title} description={mdExcerpt(pageBody, 200)}>
4545
<Section>
46-
<Picture class="w-full rounded-xl object-cover" src={datum.exampleImage} alt={datum.title} />
46+
<Picture class="w-full rounded-xl object-cover" src={datum.exampleImage} alt={datum.title} widths={pictureWidths()} />
4747
<div class="text-lg"><slot /></div>
4848
</Section>
4949
<Section bg="green" box>
@@ -68,7 +68,7 @@ const t = useTranslations(lang);
6868
<p>{datum.method}</p>
6969
<h4 class="mt-4 text-lg font-semibold">{t('data.quality')}</h4>
7070
<p>{datum.quality}</p>
71-
{datum.qualityImage && <Picture src={datum.qualityImage} alt={t('data.quality')} />}
71+
{datum.qualityImage && <Picture src={datum.qualityImage} alt={t('data.quality')} widths={pictureWidths()} />}
7272
<div class="mt-4">
7373
<h4 class="text-lg font-semibold">{t('data.properties')}</h4>
7474
<table class="border-main-lightgreen mt-4 w-full border-2">

src/components/Logos.astro

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
---
22
import type {ImageMetadata} from 'astro';
33
import {Picture} from 'astro:assets';
4+
import {pictureWidths} from './utils';
45
56
const _logos = import.meta.glob<{default: ImageMetadata}>('/src/images/logos/*.{jpeg,jpg,png,gif}');
67
const logos: Array<{src: ImageMetadata; alt: string}> = await Promise.all(
@@ -35,7 +36,7 @@ const logos: Array<{src: ImageMetadata; alt: string}> = await Promise.all(
3536
{
3637
logos.map((logo) => (
3738
<div class="flex w-full items-center justify-center">
38-
<Picture src={logo.src} alt={logo.alt} class="h-auto w-full object-contain" />
39+
<Picture src={logo.src} alt={logo.alt} class="h-auto w-full object-contain" widths={pictureWidths()} />
3940
</div>
4041
))
4142
}

src/components/News.astro

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import {getCollection} from 'astro:content';
33
import {asLocale, slugToPostLink, useTranslations} from '../i18n/utils';
44
import {Image} from 'astro:assets';
5-
import {mdExcerpt} from './utils';
5+
import {mdExcerpt, pictureWidths} from './utils';
66
77
const pageLang = Astro.currentLocale;
88
const t = useTranslations(pageLang);
@@ -68,7 +68,7 @@ const newsItems: Array<{
6868
class="group flex h-full flex-col rounded-xl border border-gray-200 p-5 transition duration-300 hover:border-transparent hover:shadow-lg focus:border-transparent focus:shadow-lg focus:outline-hidden dark:border-neutral-700 dark:hover:border-transparent dark:hover:shadow-black/40 dark:focus:border-transparent dark:focus:shadow-black/40"
6969
href={news.link}
7070
>
71-
<Image class="aspect-video w-full rounded-xl object-cover" src={news.image} alt={news.title} />
71+
<Image class="aspect-video w-full rounded-xl object-cover" src={news.image} alt={news.title} widths={pictureWidths()} />
7272
<div class="my-6">
7373
<h3 class="text-xl font-semibold text-gray-800 dark:text-neutral-300 dark:group-hover:text-white">{news.title}</h3>
7474
<p class="mt-5 text-gray-600 dark:text-neutral-400">{news.abstract}</p>

src/components/team/person.astro

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
---
22
import {Icon} from 'astro-icon/components';
33
import {Image} from 'astro:assets';
4+
import {pictureWidths} from '../utils';
45
56
interface Props {
67
name: string;
@@ -15,7 +16,7 @@ const {name, title, image, linkedin, twitter, website} = Astro.props;
1516
---
1617

1718
<div class="flex flex-col gap-3 sm:flex-row sm:items-center sm:gap-4">
18-
<Image class="size-20 rounded-lg" src={image} alt={name} />
19+
<Image class="size-20 rounded-lg" src={image} alt={name} widths={pictureWidths()} />
1920

2021
<div class="grow">
2122
<div>

src/components/utils.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,10 @@ export function mdExcerpt(text: string, length: number) {
1616

1717
return trimmedText.substring(0, length) + '…';
1818
}
19+
20+
/**
21+
* @returns an array of picture widths used for responsive and optimized images in <Image /> and <Picture /> components.
22+
*
23+
* Note: This is a function because Astro requires sizes to be mutable.
24+
*/
25+
export const pictureWidths = (): number[] => [768, 1024, 1280, 1536] as const;

src/content.config.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,12 +83,34 @@ const data = defineCollection({
8383
}),
8484
});
8585

86+
const scroller = defineCollection({
87+
type: 'data',
88+
schema: ({image}) =>
89+
z.array(
90+
z.object({
91+
id: z.string().nonempty().max(100),
92+
title: z.string().nonempty().max(100),
93+
image: image(),
94+
description: z.object({
95+
de: z.string().nonempty(),
96+
en: z.string().nonempty(),
97+
}),
98+
location: z.object({
99+
center: z.array(z.number().finite()).length(2),
100+
zoom: z.number().finite().positive(),
101+
pitch: z.number().int().positive(),
102+
bearing: z.number().int(),
103+
}),
104+
}),
105+
),
106+
});
86107
// 4. Export a single `collections` object to register your collection(s)
87108
export const collections = {
88109
data,
89110
cookies,
90111
posts,
91112
publications,
92113
references,
114+
scroller,
93115
services,
94116
};

src/content/scroller/2025.json

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
[
2+
{
3+
"id": "ai4wildlive",
4+
"title": "AI4WildLIVE Phase II",
5+
"image": "../../images/retrospective/2025/AI4WildLIVE.png",
6+
"description": {
7+
"de": "Wir haben mit der Entwicklung des WildLIVE-GIS in Phase II von AI4WildLIVE begonnen. Ein zentrales Ziel ist die Etablierung eines Analyse-Tools, das das WildLIVE-Portal von Senckenberg mit der Geo Engine verbindet.",
8+
"en": "We started developing the WildLIVE-GIS in Phase II of AI4WildLIVE. A central goal is establishing an analysis tool that connects the Senckenberg WildLIVE portal with the Geo Engine."
9+
},
10+
"location": {
11+
"center": [8.6821, 50.1109],
12+
"zoom": 10,
13+
"pitch": 30,
14+
"bearing": 15
15+
},
16+
"date": "Januar 2025"
17+
},
18+
{
19+
"id": "circular-valley",
20+
"title": "Circular Valley Convention 2025",
21+
"image": "../../images/posts/circular-valley-2025.jpg",
22+
"description": {
23+
"de": "Bei der Circular Valley Convention 2025 haben wir unsere Lösungen für datengetriebene Entscheidungen vorgestellt und diskutiert, wie man Nachhaltigkeit und Effizienz vereinen kann.",
24+
"en": "At the Circular Valley Convention 2025, we presented our solutions for data-driven decisions and discussed how to combine sustainability and efficiency."
25+
},
26+
"location": {
27+
"center": [6.7735, 51.2277],
28+
"zoom": 11,
29+
"pitch": 50,
30+
"bearing": 45
31+
},
32+
"date": "März 2025"
33+
},
34+
{
35+
"id": "ad-astra",
36+
"title": "Ad Astra Summit",
37+
"image": "../../images/retrospective/2025/Ad Astra Summit.jpg",
38+
"description": {
39+
"de": "Beim Ad Astra Summit haben wir gezeigt, wie sich Geodaten effizient für ESG-Reporting und automatisierte Analyseprozesse nutzen lassen. ",
40+
"en": "At the Ad Astra Summit, we demonstrated how geodata can be used efficiently for ESG reporting and automated analysis processes."
41+
},
42+
"location": {
43+
"center": [8.6512, 49.8728],
44+
"zoom": 13,
45+
"pitch": 20,
46+
"bearing": 90
47+
},
48+
"date": "April 2025"
49+
},
50+
{
51+
"id": "living-planet",
52+
"title": "Living Planet Symposium (LPS)",
53+
"image": "../../images/retrospective/2025/Living Planet Symposium.jpg",
54+
"description": {
55+
"de": "Beim Living Planet Symposium (LPS) haben wir unsere neuesten Arbeiten in zwei Vorträgen vorgestellt: zum einen über die deutsche EnMap-Mission und das CropHype-Projekt zur Feldfruchterkennung, zum anderen darüber, wie wir Machine-Learning-Modelle mit der Geo Engine operationalisieren. ",
56+
"en": "At the Living Planet Symposium (LPS), we presented our latest work in two talks: one on the German EnMap mission and the CropHype project for crop detection, and the other on how we operationalize machine learning models with the Geo Engine."
57+
},
58+
"location": {
59+
"center": [16.4138, 48.2163],
60+
"zoom": 14,
61+
"pitch": 60,
62+
"bearing": 120
63+
},
64+
"date": "Juni 2025"
65+
},
66+
{
67+
"id": "baumarten",
68+
"title": "Dominant Tree Types in Germany",
69+
"image": "../../images/posts/dominant-tree-types/image0.png",
70+
"description": {
71+
"de": "Mit der Baumarten-Klassifikation haben wir ein neues Datenprodukt veröffentlicht, das präzise Einblicke in die Waldzusammensetzung in Deutschland bietet.<br><br><a href=\"/posts/dominant-tree-types/\" target=\"_blank\">Zum Artikel</a>",
72+
"en": "With the tree species classification, we released a new data product offering precise insights into forest composition in Germany.<br><br><a href=\"/en/posts/dominant-tree-types/\" target=\"_blank\">Read the article</a>"
73+
},
74+
"location": {
75+
"center": [8.7562, 50.809],
76+
"zoom": 12,
77+
"pitch": 35,
78+
"bearing": 75
79+
},
80+
"date": "13. Juni 2025"
81+
},
82+
{
83+
"id": "gfoe-wuerzburg",
84+
"title": "GfÖ-Jahrestagung 2025",
85+
"image": "../../images/retrospective/2025/GfÖ.png",
86+
"description": {
87+
"de": "Bei der GfÖ-Jahrestagung 2025 in Würzburg veranstalteten wir einen Hands-on-Workshop (\"VAT & Geo Engine 4 ML\") zur Kombination von Biodiversitätsdaten mit Fernerkundung und maschinellem Lernen, bei dem wir Machine-Learning-Workflows im Rahmen von NFDI4Biodiversity gezeigt haben.",
88+
"en": "At the GfÖ Annual Meeting 2025 in Würzburg, we hosted a hands-on workshop (\"VAT & Geo Engine 4 ML\") on combining biodiversity data with remote sensing and machine learning, showcasing machine learning workflows within the NFDI4Biodiversity framework."
89+
},
90+
"location": {
91+
"center": [9.9534, 49.7913],
92+
"zoom": 10,
93+
"pitch": 45,
94+
"bearing": 30
95+
},
96+
"date": "September 2025"
97+
},
98+
{
99+
"id": "push-hessen",
100+
"title": "push! Hessen",
101+
"image": "../../images/retrospective/2025/push.png",
102+
"description": {
103+
"de": "Wir haben eine Förderung im push!-Hessen-Programm gewonnen und freuen uns, unsere Lösungen voranzubringen und Unternehmen bei ihren Nachhaltigkeitsberichtspflichten im Bereich Biodiversität zu unterstützen.",
104+
"en": "We won funding in the push! Hessen program and look forward to advancing our solutions and supporting companies with their sustainability reporting obligations in the field of biodiversity."
105+
},
106+
"location": {
107+
"center": [8.2398, 50.0782],
108+
"zoom": 11,
109+
"pitch": 25,
110+
"bearing": 60
111+
},
112+
"date": "September 2025"
113+
},
114+
{
115+
"id": "esa-bic",
116+
"title": "ESA BIC Incubation",
117+
"image": "../../images/posts/esa-bic-2025.png",
118+
"description": {
119+
"de": "Bei ESA BIC haben wir unsere Inkubationszeit erfolgreich abgeschlossen und dadurch neue Bausteine in unserer Infrastruktur geschaffen: eine Random-Forest-Pipeline, einen flexiblen ML-Operator und Modell-Blaupausen.<br><br><a href=\"https://youtu.be/1186CBUKm8Y\" target=\"_blank\" rel=\"noopener noreferrer\">Zum Video</a>",
120+
"en": "We successfully completed our incubation period at ESA BIC, creating new building blocks in our infrastructure: a Random Forest pipeline, a flexible ML operator, and model blueprints.<br><br><a href=\"https://youtu.be/1186CBUKm8Y\" target=\"_blank\" rel=\"noopener noreferrer\">Watch the video</a>"
121+
},
122+
"video": "https://youtu.be/1186CBUKm8Y",
123+
"location": {
124+
"center": [8.6209, 49.8722],
125+
"zoom": 14,
126+
"pitch": 50,
127+
"bearing": 150
128+
},
129+
"date": "15. Oktober 2025"
130+
}
131+
]

src/i18n/translations.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ export const translations = {
8888
'data.time': 'Zeit',
8989
'data.spatialResolution': 'Räumliche Auflösung',
9090
'data.spatialValidity': 'Räumliche Gültigkeit',
91+
retrospective: 'Retrospektive',
9192
},
9293
en: {
9394
'nav.contact': 'Contact',
@@ -169,6 +170,7 @@ export const translations = {
169170
'data.time': 'Time',
170171
'data.spatialResolution': 'Spatial Resolution',
171172
'data.spatialValidity': 'Spatial Validity',
173+
retrospective: 'Retrospective',
172174
},
173175
} as const;
174176

0 commit comments

Comments
 (0)