del: BasMapPanel entfernt aus rechliche Gründe,
Kurzantwort: Für kommerzielle Nutzung sind OSM‑Community‑Tile‑Server nicht geeignet. Nutze einen bezahlten Anbieter (z. B. Thunderforest, Tracestrack) oder hoste selbst. Attribution ist immer Pflicht. Links und Hinweise je Layer/Provider: OpenStreetMap Standard (osm-standard) Lizenz/Daten: ODbL, Attribution Pflicht Tile-Server-Policy (keine Produktion/hohe Last): https://operations.osmfoundation.org/policies/tiles/ Urheberrecht/Attribution: https://www.openstreetmap.org/copyright HOT Humanitarian (osm-humanitarian) Community-Server (OSM France); keine Produktion/hohe Last Info/Policy OSM France Tiles: https://tile.openstreetmap.fr/ HOT: https://www.hotosm.org/ CyclOSM (cyclosm) Community-Server (OSM France); keine Produktion/hohe Last Projektseite: https://www.cyclosm.org/ Hinweise/Policy (OSM France): https://tile.openstreetmap.fr/ Wiki: https://wiki.openstreetmap.org/wiki/CyclOSM Carto Light (carto-light / Positron) Keylos nutzbar mit Attribution; Fair‑Use, für hohe Last über CARTO‑Pläne Basemaps: https://carto.com/basemaps/ Attribution: https://carto.com/attributions Pricing (Plattform): https://carto.com/pricing/ (bei großem Volumen Sales kontaktieren) Thunderforest (Cycle/Transport u. a.) Kommerziell mit API‑Key; Pläne von Free bis Pro Pricing: https://www.thunderforest.com/pricing/ Terms/Attribution: https://www.thunderforest.com/terms/ Tracestrack Topo API‑Key erforderlich; kostenlose und bezahlte Pläne Übersicht/Pricing: https://www.tracestrack.com/en/maps/ Nutzungsbedingungen: https://www.tracestrack.com/en/terms/
This commit is contained in:
@@ -23,4 +23,4 @@ NEXT_PUBLIC_USE_MOCKS=true
|
|||||||
# z.B. http://10.10.0.13/xyz/index.aspx -> basePath in config.json auf /xyz setzen
|
# z.B. http://10.10.0.13/xyz/index.aspx -> basePath in config.json auf /xyz setzen
|
||||||
# basePath wird jetzt in public/config.json gepflegt
|
# basePath wird jetzt in public/config.json gepflegt
|
||||||
# App-Versionsnummer
|
# App-Versionsnummer
|
||||||
NEXT_PUBLIC_APP_VERSION=1.1.361
|
NEXT_PUBLIC_APP_VERSION=1.1.362
|
||||||
|
|||||||
@@ -24,4 +24,4 @@ NEXT_PUBLIC_USE_MOCKS=false
|
|||||||
# basePath wird jetzt in public/config.json gepflegt
|
# basePath wird jetzt in public/config.json gepflegt
|
||||||
|
|
||||||
# App-Versionsnummer
|
# App-Versionsnummer
|
||||||
NEXT_PUBLIC_APP_VERSION=1.1.361
|
NEXT_PUBLIC_APP_VERSION=1.1.362
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ import { useMapComponentState } from "@/components/hooks/useMapComponentState.js
|
|||||||
import CoordinatePopup from "@/components/contextmenu/CoordinatePopup.js";
|
import CoordinatePopup from "@/components/contextmenu/CoordinatePopup.js";
|
||||||
//----------Ui Widgets----------------
|
//----------Ui Widgets----------------
|
||||||
import MapLayersControlPanel from "@/components/uiWidgets/mapLayersControlPanel/MapLayersControlPanel.js";
|
import MapLayersControlPanel from "@/components/uiWidgets/mapLayersControlPanel/MapLayersControlPanel.js";
|
||||||
import BaseMapPanel from "@/components/uiWidgets/baseMapPanel/BaseMapPanel.js";
|
|
||||||
import CoordinateInput from "@/components/uiWidgets/CoordinateInput.js";
|
import CoordinateInput from "@/components/uiWidgets/CoordinateInput.js";
|
||||||
import VersionInfoModal from "@/components/uiWidgets/VersionInfoModal.js";
|
import VersionInfoModal from "@/components/uiWidgets/VersionInfoModal.js";
|
||||||
//----------Daten aus API--------------------
|
//----------Daten aus API--------------------
|
||||||
@@ -172,15 +171,7 @@ const MapComponent = ({ locations, onLocationUpdate, lineCoordinates }) => {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
// Sichtbarkeit des Base-Map Panels (oben rechts, unter Toolbar)
|
// Base-Map Panel wurde entfernt
|
||||||
const [showBaseMapPanel, setShowBaseMapPanel] = useState(() => {
|
|
||||||
try {
|
|
||||||
const v = localStorage.getItem("showBaseMapPanel");
|
|
||||||
return v === null ? false : v === "true";
|
|
||||||
} catch (_) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
// Sichtbarkeit der Koordinaten-Suche (Lupe)
|
// Sichtbarkeit der Koordinaten-Suche (Lupe)
|
||||||
const [showCoordinateInput, setShowCoordinateInput] = useState(() => {
|
const [showCoordinateInput, setShowCoordinateInput] = useState(() => {
|
||||||
try {
|
try {
|
||||||
@@ -268,12 +259,7 @@ const MapComponent = ({ locations, onLocationUpdate, lineCoordinates }) => {
|
|||||||
localStorage.setItem("showLayersPanel", String(showLayersPanel));
|
localStorage.setItem("showLayersPanel", String(showLayersPanel));
|
||||||
} catch (_) {}
|
} catch (_) {}
|
||||||
}, [showLayersPanel]);
|
}, [showLayersPanel]);
|
||||||
// Persistiere Sichtbarkeit des Base-Map Panels
|
// Persist-Logik für Base-Map Panel entfernt
|
||||||
useEffect(() => {
|
|
||||||
try {
|
|
||||||
localStorage.setItem("showBaseMapPanel", String(showBaseMapPanel));
|
|
||||||
} catch (_) {}
|
|
||||||
}, [showBaseMapPanel]);
|
|
||||||
// Persistiere Sichtbarkeit der Koordinaten-Suche
|
// Persistiere Sichtbarkeit der Koordinaten-Suche
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
try {
|
try {
|
||||||
@@ -1173,16 +1159,7 @@ const MapComponent = ({ locations, onLocationUpdate, lineCoordinates }) => {
|
|||||||
>
|
>
|
||||||
<img src="/img/expand-icon.svg" alt="Expand" className="h-8 w-8" />
|
<img src="/img/expand-icon.svg" alt="Expand" className="h-8 w-8" />
|
||||||
</button>
|
</button>
|
||||||
<button
|
{/* Lupe: Koordinaten-Suche ein-/ausblenden */}
|
||||||
onClick={() => setShowBaseMapPanel(v => !v)}
|
|
||||||
aria-label={
|
|
||||||
showBaseMapPanel ? "Kartenhintergrund ausblenden" : "Kartenhintergrund wählen"
|
|
||||||
}
|
|
||||||
className="rounded-full bg-white/90 hover:bg-white shadow p-1"
|
|
||||||
title={showBaseMapPanel ? "Kartenhintergrund ausblenden" : "Kartenhintergrund wählen"}
|
|
||||||
>
|
|
||||||
<Icon icon="material-symbols:layers-rounded" className="h-8 w-8 text-blue-900" />
|
|
||||||
</button>
|
|
||||||
<button
|
<button
|
||||||
onClick={() => setShowLayersPanel(v => !v)}
|
onClick={() => setShowLayersPanel(v => !v)}
|
||||||
aria-label={showLayersPanel ? "Layer-Panel ausblenden" : "Layer-Panel einblenden"}
|
aria-label={showLayersPanel ? "Layer-Panel ausblenden" : "Layer-Panel einblenden"}
|
||||||
@@ -1191,7 +1168,6 @@ const MapComponent = ({ locations, onLocationUpdate, lineCoordinates }) => {
|
|||||||
>
|
>
|
||||||
<Icon icon="material-symbols:menu-rounded" className="h-8 w-8 text-blue-900" />
|
<Icon icon="material-symbols:menu-rounded" className="h-8 w-8 text-blue-900" />
|
||||||
</button>
|
</button>
|
||||||
{/* Lupe: Koordinaten-Suche ein-/ausblenden */}
|
|
||||||
<button
|
<button
|
||||||
onClick={() => setShowCoordinateInput(v => !v)}
|
onClick={() => setShowCoordinateInput(v => !v)}
|
||||||
aria-label={
|
aria-label={
|
||||||
@@ -1235,9 +1211,7 @@ const MapComponent = ({ locations, onLocationUpdate, lineCoordinates }) => {
|
|||||||
/>
|
/>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
{showBaseMapPanel && map && (
|
{/* BaseMapPanel entfernt */}
|
||||||
<BaseMapPanel map={map} onClose={() => setShowBaseMapPanel(false)} />
|
|
||||||
)}
|
|
||||||
<CoordinatePopup isOpen={isPopupOpen} coordinates={currentCoordinates} onClose={closePopup} />
|
<CoordinatePopup isOpen={isPopupOpen} coordinates={currentCoordinates} onClose={closePopup} />
|
||||||
|
|
||||||
{showAppInfoCard && (
|
{showAppInfoCard && (
|
||||||
|
|||||||
@@ -22,4 +22,73 @@ Verzeichnisstruktur funktioniert.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## OSM‑basierte, „open“ Quellen
|
||||||
|
|
||||||
|
Diese sind datenrechtlich offen (ODbL bzw. Community-Lizenzen), aber das „kostenlos“ gilt nicht im
|
||||||
|
Sinne unbegrenzter Tile‑Nutzung. Die Tile‑Server werden als Community‑Ressource bereitgestellt –
|
||||||
|
bitte Policies respektieren.
|
||||||
|
|
||||||
|
- osm-standard (OpenStreetMap)
|
||||||
|
- - Key: Nein
|
||||||
|
- - Nutzung: Fair‑Use; für produktive/hohe Last eigenen Tile‑Server/Provider verwenden.
|
||||||
|
- - Attribution: „© OpenStreetMap contributors“
|
||||||
|
|
||||||
|
- osm-humanitarian (HOT)
|
||||||
|
- - Key: Nein
|
||||||
|
- - Nutzung: Fair‑Use; für größere Last die Betreiber kontaktieren bzw. andere Infrastruktur nutzen.
|
||||||
|
- - Attribution: „© OpenStreetMap contributors <br>
|
||||||
|
-
|
||||||
|
- Humanitarian OpenStreetMap Team“ cyclosm
|
||||||
|
- - Key: Nein
|
||||||
|
- - Nutzung: Fair‑Use (bereitgestellt u. a. über OSM France). Für höhere Last
|
||||||
|
Unterstützung/Hostingoptionen prüfen.
|
||||||
|
- - Attribution: „CyclOSM“ + „OpenStreetMap contributors“
|
||||||
|
- Praxis‑Tipps Kleine bis mittlere Nutzung: Die oben genannten „keyless“ Quellen sind oft
|
||||||
|
ausreichend, solange du Attribution setzt und Limits respektierst. Produktion/hohe Last: Nutze
|
||||||
|
einen Anbieter mit Vertrag/Key (z. B. Thunderforest, Tracestrack, MapTiler, Mapbox) oder hoste
|
||||||
|
Tiles selbst. Schlüssel im Client: Für Thunderforest/Tracestrack stehen die Keys im Frontend. Das
|
||||||
|
ist üblich, aber der Key ist sichtbar. Wenn du ihn verbergen willst, richte einen kleinen
|
||||||
|
Tile‑Proxy auf deinem Server ein, der den Key serverseitig anhängt und optional cached.
|
||||||
|
Attribution: Dein BaseMapPanel setzt bereits Attributionsstrings aus config.json. Achte darauf,
|
||||||
|
dass sie je Quelle korrekt sind.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Kurzantwort: Für kommerzielle Nutzung sind OSM‑Community‑Tile‑Server nicht geeignet. Nutze einen
|
||||||
|
bezahlten Anbieter (z. B. Thunderforest, Tracestrack) oder hoste selbst. Attribution ist immer
|
||||||
|
Pflicht.
|
||||||
|
|
||||||
|
Links und Hinweise je Layer/Provider:
|
||||||
|
|
||||||
|
OpenStreetMap Standard (osm-standard)
|
||||||
|
|
||||||
|
Lizenz/Daten: ODbL, Attribution Pflicht Tile-Server-Policy (keine Produktion/hohe Last):
|
||||||
|
https://operations.osmfoundation.org/policies/tiles/ Urheberrecht/Attribution:
|
||||||
|
https://www.openstreetmap.org/copyright HOT Humanitarian (osm-humanitarian)
|
||||||
|
|
||||||
|
Community-Server (OSM France); keine Produktion/hohe Last Info/Policy OSM France Tiles:
|
||||||
|
https://tile.openstreetmap.fr/ HOT: https://www.hotosm.org/ CyclOSM (cyclosm)
|
||||||
|
|
||||||
|
Community-Server (OSM France); keine Produktion/hohe Last Projektseite: https://www.cyclosm.org/
|
||||||
|
Hinweise/Policy (OSM France): https://tile.openstreetmap.fr/ Wiki:
|
||||||
|
https://wiki.openstreetmap.org/wiki/CyclOSM Carto Light (carto-light / Positron)
|
||||||
|
|
||||||
|
Keylos nutzbar mit Attribution; Fair‑Use, für hohe Last über CARTO‑Pläne Basemaps:
|
||||||
|
https://carto.com/basemaps/ Attribution: https://carto.com/attributions Pricing (Plattform):
|
||||||
|
https://carto.com/pricing/ (bei großem Volumen Sales kontaktieren) Thunderforest (Cycle/Transport u.
|
||||||
|
a.)
|
||||||
|
|
||||||
|
Kommerziell mit API‑Key; Pläne von Free bis Pro Pricing: https://www.thunderforest.com/pricing/
|
||||||
|
Terms/Attribution: https://www.thunderforest.com/terms/ Tracestrack Topo
|
||||||
|
|
||||||
|
API‑Key erforderlich; kostenlose und bezahlte Pläne Übersicht/Pricing:
|
||||||
|
https://www.tracestrack.com/en/maps/ Nutzungsbedingungen: https://www.tracestrack.com/en/terms/
|
||||||
|
Empfehlung:
|
||||||
|
|
||||||
|
Produktion: Nimm Thunderforest oder Tracestrack (oder MapTiler: https://www.maptiler.com/pricing/)
|
||||||
|
oder hoste Tiles selbst. Attribution in der Karte anzeigen (OSM + jeweiliger Anbieter). Soll ich
|
||||||
|
diese Links samt klarer Hinweise kompakt in eure README.md einpflegen?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
[Zurück zur Übersicht](../README.md)
|
[Zurück zur Übersicht](../README.md)
|
||||||
|
|||||||
4
package-lock.json
generated
4
package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "nodemap",
|
"name": "nodemap",
|
||||||
"version": "1.1.361",
|
"version": "1.1.362",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "nodemap",
|
"name": "nodemap",
|
||||||
"version": "1.1.361",
|
"version": "1.1.362",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@emotion/react": "^11.13.3",
|
"@emotion/react": "^11.13.3",
|
||||||
"@emotion/styled": "^11.13.0",
|
"@emotion/styled": "^11.13.0",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "nodemap",
|
"name": "nodemap",
|
||||||
"version": "1.1.361",
|
"version": "1.1.362",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@emotion/react": "^11.13.3",
|
"@emotion/react": "^11.13.3",
|
||||||
"@emotion/styled": "^11.13.0",
|
"@emotion/styled": "^11.13.0",
|
||||||
|
|||||||
@@ -17,6 +17,61 @@
|
|||||||
"_comment": "OpenStreetMap Online-Kartenquelle über Server-Proxy (relativ)",
|
"_comment": "OpenStreetMap Online-Kartenquelle über Server-Proxy (relativ)",
|
||||||
"minZoom": 0,
|
"minZoom": 0,
|
||||||
"maxZoom": 19
|
"maxZoom": 19
|
||||||
|
},
|
||||||
|
"osm-standard": {
|
||||||
|
"name": "Standard",
|
||||||
|
"url": "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
|
||||||
|
"attribution": "© OpenStreetMap contributors",
|
||||||
|
"subdomains": "abc",
|
||||||
|
"minZoom": 0,
|
||||||
|
"maxZoom": 19
|
||||||
|
},
|
||||||
|
"osm-humanitarian": {
|
||||||
|
"name": "Humanitarian",
|
||||||
|
"url": "https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png",
|
||||||
|
"attribution": "© OpenStreetMap contributors, Humanitarian OpenStreetMap Team",
|
||||||
|
"subdomains": "abc",
|
||||||
|
"minZoom": 0,
|
||||||
|
"maxZoom": 19
|
||||||
|
},
|
||||||
|
"cyclosm": {
|
||||||
|
"name": "CyclOSM",
|
||||||
|
"url": "https://{s}.tile-cyclosm.openstreetmap.fr/cyclosm/{z}/{x}/{y}.png",
|
||||||
|
"attribution": "© OpenStreetMap contributors, CyclOSM",
|
||||||
|
"subdomains": "abc",
|
||||||
|
"minZoom": 0,
|
||||||
|
"maxZoom": 20
|
||||||
|
},
|
||||||
|
"carto-light": {
|
||||||
|
"name": "Carto Light",
|
||||||
|
"url": "https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png",
|
||||||
|
"attribution": "© OpenStreetMap contributors, © CARTO",
|
||||||
|
"subdomains": "abcd",
|
||||||
|
"minZoom": 0,
|
||||||
|
"maxZoom": 20
|
||||||
|
},
|
||||||
|
"thunderforest-cycle": {
|
||||||
|
"name": "Cycle Map (Thunderforest)",
|
||||||
|
"url": "https://{s}.tile.thunderforest.com/cycle/{z}/{x}/{y}.png?apikey=YOUR_THUNDERFOREST_API_KEY",
|
||||||
|
"attribution": "© OpenStreetMap contributors, © Thunderforest",
|
||||||
|
"subdomains": "abc",
|
||||||
|
"minZoom": 0,
|
||||||
|
"maxZoom": 22
|
||||||
|
},
|
||||||
|
"thunderforest-transport": {
|
||||||
|
"name": "Transport Map (Thunderforest)",
|
||||||
|
"url": "https://{s}.tile.thunderforest.com/transport/{z}/{x}/{y}.png?apikey=YOUR_THUNDERFOREST_API_KEY",
|
||||||
|
"attribution": "© OpenStreetMap contributors, © Thunderforest",
|
||||||
|
"subdomains": "abc",
|
||||||
|
"minZoom": 0,
|
||||||
|
"maxZoom": 22
|
||||||
|
},
|
||||||
|
"tracestrack-topo": {
|
||||||
|
"name": "Tracestrack Topo",
|
||||||
|
"url": "https://tile.tracestrack.com/topo__/{z}/{x}/{y}.webp?key=YOUR_TRACESTRACK_KEY",
|
||||||
|
"attribution": "© OpenStreetMap contributors, © Tracestrack",
|
||||||
|
"minZoom": 0,
|
||||||
|
"maxZoom": 19
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"active": "osm",
|
"active": "osm",
|
||||||
|
|||||||
Reference in New Issue
Block a user