Server Proxy GeoServer (Python)
Bibliotecile web-based pentru hărți (Leaflet, OpenLayers, Mapbox GL) nu pot seta anteturi HTTP personalizate pe cererile de plăci WMS sau de obiecte WFS - aceasta este o restricție de securitate a browserului. Aceasta înseamnă că nu poți transmite direct antetul Authorization din JavaScript pe partea de client.
Soluția este un proxy de backend: un mic server care se află între frontend-ul tău și Qarta. Browserul tău trimite cereri neautentificate către proxy; proxy-ul adaugă cheia API pe partea de server și redirecționează cererea la Qarta.
Browser → /wms/GetMap?... → Proxy (adaugă Authorization header) → Qarta
Proxy-ul din acest ghid este o aplicație Python/Flask minimă. Doar atașează cheia API - nu modifică, nu inspectează și nu stochează în cache cererile.
Descărcare
Descarcă geoserver-proxy.zipFișierul zip conține proxy.py, pyproject.toml și o suită completă de teste.
Rularea Proxy-ului
Instalare dependențe:
unzip geoserver-proxy.zip
cd geoserver-proxy
pip install -e ".[dev]"
Pornire server:
export QARTA_API_KEY=your_api_key_here
python proxy.py
# Listening on http://0.0.0.0:8080
Variabile de mediu opționale:
| Variabilă | Implicit | Descriere |
|---|---|---|
QARTA_API_KEY | (obligatoriu) | Cheia API Qarta |
QARTA_BASE_URL | https://graph.quarticle.ro | URL-ul de bază Qarta aval |
PROXY_TIMEOUT | 30 | Timeout cere aval în secunde |
Conectarea hărții web
Direcționează stratul WMS Leaflet către proxy în loc de a-l direcționa direct la Qarta:
import L from 'leaflet';
const map = L.map('map').setView([40.7128, -74.0060], 10);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap contributors'
}).addTo(map);
// Direcționează către proxy - fără cheie API în cod pe partea de client
const wmsLayer = L.tileLayer.wms('http://localhost:8080/wms/GetMap', {
layers: 'GRAPHRASTER:light_pollution',
styles: '',
format: 'image/png',
transparent: true,
srs: 'EPSG:3857',
version: '1.3.0',
}).addTo(map);
Alte operații WMS (GetCapabilities, GetFeatureInfo, GetLegendGraphic, DescribeLayer) și operații WFS (GetFeature) sunt redirecționate în același mod - doar schimbă calea:
http://localhost:8080/wms/GetCapabilities
http://localhost:8080/wms/GetFeatureInfo
http://localhost:8080/wms/GetLegendGraphic
http://localhost:8080/wfs/GetFeature
Codul sursă al proxy-ului
import os
import requests
from flask import Flask, Response, request
QARTA_BASE_URL = os.getenv("QARTA_BASE_URL", "https://graph.quarticle.ro")
QARTA_API_KEY = os.getenv("QARTA_API_KEY")
PROXY_TIMEOUT = int(os.getenv("PROXY_TIMEOUT", "30"))
app = Flask(__name__)
def _forward(service: str, operation: str) -> Response:
"""Forward a WMS or WFS request to Qarta, injecting the API key."""
upstream_url = f"{QARTA_BASE_URL}/graph/layers/{service}/{operation}"
resp = requests.get(
upstream_url,
params=request.args,
headers={"Authorization": QARTA_API_KEY},
timeout=PROXY_TIMEOUT,
stream=True,
)
return Response(
resp.iter_content(chunk_size=8192),
status=resp.status_code,
content_type=resp.headers.get("Content-Type", "application/octet-stream"),
)
@app.get("/wms/<operation>")
def wms_proxy(operation: str) -> Response:
return _forward("wms", operation)
@app.get("/wfs/<operation>")
def wfs_proxy(operation: str) -> Response:
return _forward("wfs", operation)
if __name__ == "__main__":
if not QARTA_API_KEY:
raise RuntimeError("QARTA_API_KEY environment variable is required")
app.run(host="0.0.0.0", port=8080)
Rularea testelor
cd geoserver-proxy
pytest tests/ -v
Testele folosesc responses pentru a simula toate apelurile Qarta aval - nu se fac cereri de rețea reale.
Pași următori
- Ghid WMS - lista completă a operațiilor și parametrilor WMS
- Ghid WFS - interogarea caracteristicilor brute cu WFS
- Proxy API complet - proxy pentru toate alte punctele finale API Qarta
- Caz de utilizare vizualizare hartă - încorporează WMS în hărți web