Multi-país, idiomas, seguridad, instaladores y documentación
Seguridad - Escapado de todo lo que viene de datos de terceros antes de ir al HTML, incluidos los tooltips de Leaflet. Los nombres de municipio salen de OpenStreetMap, que cualquiera puede editar: sin escapar, era una vía de inyección de código en el navegador de quien abriera el visor. Multi-país - El país pasa a ser un parámetro (REGION). Catálogo de 27 regiones entre Europa y el norte de África, declarando por país qué datos existen de verdad. - Una malla por país y no una continental: Europa entera a 100 m son mil millones de celdas y unos 73 GB solo en capas ráster. - Proyección equiárea propia para las regiones de fuera de Europa, donde EPSG:3035 deforma. Interfaz - Idiomas: castellano, inglés, francés y portugués, con selector persistente. - Modo Mapa: el país entero sobre satélite, topográfico u OSM. - Enlaces a mapas externos en la barra inferior, siempre visibles. - Botón de ver de cerca también en la cabecera de la ficha. - Fuera la distancia desde Madrid, que centralizaba algo de uso general. Portabilidad - install.sh e install.ps1 para Linux/macOS y Windows; requirements.txt. - Sin rutas absolutas en el código. Documentación - Ocho páginas en docs/ para la wiki: instalación, uso, añadir un país, metodología, seguridad, fuentes y publicación.
This commit is contained in:
parent
d4b3b803e0
commit
f890dd9448
22 changed files with 1288 additions and 280 deletions
56
docs/Anadir-un-pais.md
Normal file
56
docs/Anadir-un-pais.md
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
# Añadir un país
|
||||
|
||||
El país es un parámetro. Se elige con la variable `REGION`.
|
||||
|
||||
```bash
|
||||
./.venv/bin/python src/regions.py # ver el catálogo
|
||||
REGION=pt make all # procesar Portugal entero
|
||||
```
|
||||
|
||||
Los resultados van a `out/pt/` y los intermedios a `data/interim/pt/`. España,
|
||||
que es la región por defecto, publica en `out/` para no romper rutas.
|
||||
|
||||
## Por qué una malla por país y no un mapa continental
|
||||
|
||||
Europa entera a 100 m son mil millones de celdas: **4 GB por capa** y unos
|
||||
**73 GB** para las dieciocho capas del modelo, más de lo que cabe en memoria de
|
||||
una vez. El norte de África añade otros 61 GB. Por país el problema es tratable
|
||||
y además se puede paralelizar.
|
||||
|
||||
## Lo que hay que mirar antes
|
||||
|
||||
`src/regions.py` declara, por país, qué datos existen de verdad:
|
||||
|
||||
| Campo | Qué significa |
|
||||
|---|---|
|
||||
| `protected='eea'` | Hay Red Natura 2000 y designaciones nacionales de la Agencia Europea de Medio Ambiente. El filtro legal funciona |
|
||||
| `protected=None` | **No hay fuente libre equivalente.** El filtro legal no se aplica. Pasa en todo el norte de África: hay que conseguir la cartografía del país antes de fiarse de un resultado |
|
||||
| `ortho='pnoa'` | Ortofoto nacional descargable. Solo España |
|
||||
| `ortho=None` | Sin foto aérea incrustada. En el visor queda el mapa deslizante, que sí funciona en todas partes |
|
||||
|
||||
## Proyección
|
||||
|
||||
Europa usa EPSG:3035 (equiárea europea). Para el norte de África se construye
|
||||
una proyección equiárea centrada en el propio país, porque 3035 deforma fuera de
|
||||
Europa. Está en `regions.crs_for()`.
|
||||
|
||||
## Añadir un país que no esté
|
||||
|
||||
En `src/regions.py`:
|
||||
|
||||
```python
|
||||
"si": dict(name="Eslovenia", bbox=(13.3, 45.4, 16.6, 46.9),
|
||||
osm=["europe/slovenia"],
|
||||
neighbours=["europe/croatia", "europe/austria", "europe/italy"],
|
||||
protected="eea", ortho=None),
|
||||
```
|
||||
|
||||
- `bbox` en lon/lat con algo de margen.
|
||||
- `osm` y `neighbours`, rutas de [Geofabrik](https://download.geofabrik.de).
|
||||
- **Los vecinos importan.** Sin ellos, la franja fronteriza sale falsamente
|
||||
vacía: el extracto está recortado por la frontera y al otro lado no hay
|
||||
edificios en los datos aunque sí los haya en el terreno.
|
||||
|
||||
## Coste aproximado
|
||||
|
||||
Por país mediano: 2-6 GB de descarga, ~25 GB de disco temporal y un par de horas.
|
||||
28
docs/Fuentes-y-licencias.md
Normal file
28
docs/Fuentes-y-licencias.md
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
# Fuentes y licencias
|
||||
|
||||
| Dato | Fuente | Licencia |
|
||||
|---|---|---|
|
||||
| Edificios, viales, agua, arbolado, roca, límites administrativos | [OpenStreetMap](https://www.openstreetmap.org/copyright) vía Geofabrik | ODbL |
|
||||
| Red Natura 2000 y designaciones nacionales | Agencia Europea de Medio Ambiente / MITECO | Reutilización con atribución |
|
||||
| Ortofotos PNOA (solo España) | [Instituto Geográfico Nacional](https://www.ign.es) | CC BY 4.0 |
|
||||
| Cartografía catastral (solo España) | [Dirección General del Catastro](https://www.sedecatastro.gob.es) | Reutilización con atribución |
|
||||
| Modelo de elevaciones | Copernicus DEM GLO-90 | Copernicus |
|
||||
| Clima | [WorldClim 2.1](https://www.worldclim.org) | CC BY-SA 4.0 |
|
||||
| Mapa deslizante | [Leaflet](https://leafletjs.com) 1.9.4 | BSD-2 |
|
||||
|
||||
El código, MIT. Los datos mantienen la licencia de su fuente: si redistribuyes
|
||||
resultados, **arrastra las atribuciones**.
|
||||
|
||||
## Servicios que consulta el visor en vivo
|
||||
|
||||
Solo en los modos Mapa y Ver de cerca, y solo si los activas:
|
||||
|
||||
- `www.ign.es` — ortofoto PNOA y mapa topográfico
|
||||
- `ovc.catastro.meh.es` — parcelas catastrales
|
||||
- `geoserver.iepnb.es` — Red Natura 2000 y espacios protegidos
|
||||
- `tile.openstreetmap.org` — mapa base de OSM
|
||||
|
||||
Son servicios públicos con condiciones de uso razonable. El visor pide teselas
|
||||
solo de lo que estás mirando; no descarga en bloque.
|
||||
|
||||
El modo Relieve y todos los datos del modelo funcionan **sin conexión**.
|
||||
34
docs/Home.md
Normal file
34
docs/Home.md
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
# EXPLORER
|
||||
|
||||
Localiza los puntos de un país más alejados de cualquier rastro de gente **a los
|
||||
que además se puede llegar** con un vehículo, y los valora de 1 a 5 estrellas.
|
||||
|
||||
Barre el territorio celda a celda sobre una malla de 100 m usando datos abiertos,
|
||||
descarta lo que no es viable (espacios protegidos, zonas militares, sin acceso,
|
||||
demasiada pendiente) y puntúa lo que queda en seis criterios.
|
||||
|
||||
## Empezar
|
||||
|
||||
| Quiero… | Ir a |
|
||||
|---|---|
|
||||
| Solo mirar los resultados | [Uso del visor](Uso-del-visor) |
|
||||
| Instalarlo en mi máquina | [Instalación](Instalacion) |
|
||||
| Procesar otro país | [Añadir un país](Anadir-un-pais) |
|
||||
| Entender cómo se calcula | [Metodología](Metodologia) |
|
||||
| Saber qué datos usa | [Fuentes y licencias](Fuentes-y-licencias) |
|
||||
| Publicarlo para más gente | [Publicar](Publicar) |
|
||||
|
||||
## Estado
|
||||
|
||||
Ahora mismo hay **un solo país procesado, España**, con 355 localizaciones.
|
||||
El resto del catálogo (27 países entre Europa y el norte de África) está
|
||||
declarado y el código los soporta, pero **sus datos no están calculados**: hay
|
||||
que ejecutar el pipeline para cada uno. Ver [Añadir un país](Anadir-un-pais).
|
||||
|
||||
## Aviso
|
||||
|
||||
Esto localiza sitios despoblados; no es permiso para nada. Casi todo el terreno
|
||||
es privado, muchas zonas tienen restricciones de acceso por incendios, y celebrar
|
||||
una concentración sin autorización tiene consecuencias administrativas y, si
|
||||
prende algo, penales. Comprueba propiedad, figura de protección y época del año
|
||||
antes de moverte.
|
||||
60
docs/Instalacion.md
Normal file
60
docs/Instalacion.md
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
# Instalación
|
||||
|
||||
## Para solo mirar los resultados: nada
|
||||
|
||||
El visor es un HTML. Clona el repositorio y ábrelo:
|
||||
|
||||
| Sistema | Orden |
|
||||
|---|---|
|
||||
| Linux | `xdg-open out/visor.html` o `./abrir.sh` |
|
||||
| Windows | doble clic en `out\visor.html`, o `.\abrir.ps1` |
|
||||
| macOS | `open out/visor.html` |
|
||||
| Android / iPhone | ver [Publicar](Publicar) |
|
||||
|
||||
No hace falta servidor, ni Python, ni conexión.
|
||||
|
||||
**Ojo:** `visor.html` necesita la carpeta `out/ortho/` a su lado, que es donde
|
||||
están las fotos aéreas. Si mueves el HTML solo, se quedan sin cargar.
|
||||
|
||||
### Si al abrirlo se abre un editor de texto
|
||||
|
||||
Le pasa a quien tiene los `.html` asociados a un editor, algo habitual si
|
||||
programas. `xdg-open` respeta esa asociación, no el navegador por defecto.
|
||||
Usa `./abrir.sh`, que llama al navegador directamente, o arrástralo a una
|
||||
ventana del navegador.
|
||||
|
||||
## Para reconstruir los datos
|
||||
|
||||
Hacen falta Python 3.9+, unos 25 GB de disco por país y un par de horas.
|
||||
|
||||
### Linux / macOS
|
||||
|
||||
```bash
|
||||
./install.sh
|
||||
```
|
||||
|
||||
Si falta el módulo `venv`: `sudo apt install python3-venv` en Debian/Ubuntu.
|
||||
|
||||
### Windows
|
||||
|
||||
```powershell
|
||||
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
|
||||
.\install.ps1
|
||||
```
|
||||
|
||||
Si no tienes Python: `winget install Python.Python.3.12`, marcando
|
||||
*Add Python to PATH*.
|
||||
|
||||
### Qué instala
|
||||
|
||||
Solo paquetes de Python, dentro de `.venv/`, sin tocar el sistema:
|
||||
`numpy`, `scipy`, `rasterio`, `osmium`, `shapely`, `pyproj`, `requests`,
|
||||
`pillow`. Todos traen binarios precompilados para Linux, Windows y macOS, así
|
||||
que **no hace falta compilar GDAL ni nada parecido**.
|
||||
|
||||
## Comprobar que funciona
|
||||
|
||||
```bash
|
||||
./.venv/bin/python src/regions.py # lista los países disponibles
|
||||
./.venv/bin/python src/revisar.py # comprueba la coherencia del resultado
|
||||
```
|
||||
80
docs/Metodologia.md
Normal file
80
docs/Metodologia.md
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
# Metodología
|
||||
|
||||
Malla de 100 m en proyección equiárea, así que una distancia euclídea en la
|
||||
malla es una distancia real en el terreno.
|
||||
|
||||
## 1. Se descarta
|
||||
|
||||
Una celda queda fuera, por buena que sea, si cumple alguna:
|
||||
|
||||
| Condición | Por qué |
|
||||
|---|---|
|
||||
| En espacio protegido oficial, o a menos de 300 m del borde | Los parques se trazaron rodeando lo más vacío, y el modelo tendía a pegarse al límite, donde hay zona periférica y vigilancia |
|
||||
| En zona militar o sobre agua | Obvio |
|
||||
| A menos de 2 km de un edificio | Por debajo te oyen desde casa |
|
||||
| A menos de 400 m de una carretera | Te ve cada coche que pasa |
|
||||
| A más de 800 m de un vial | No metes un equipo más lejos |
|
||||
| Más de 10° de pendiente | Ni se monta ni se aparca |
|
||||
|
||||
En España sobreviven 47.519 km², el 9,5 % del país.
|
||||
|
||||
## 2. Manda el sonido
|
||||
|
||||
Se estima el nivel que llega a la casa más cercana con propagación real:
|
||||
|
||||
```
|
||||
SPL = 130 − 20·log₁₀(d) − 0,5·d/1000 − atenuación_arbolado − apantallamiento
|
||||
```
|
||||
|
||||
Divergencia esférica desde 130 dB a 1 m (equipo grande), absorción atmosférica
|
||||
en frecuencias bajas (0,5 dB/km, que es lo que viaja), hasta 6 dB de absorción
|
||||
por arbolado y hasta 12 dB de apantallamiento si estás en una hondonada.
|
||||
|
||||
Se exige **≤ 45 dB**, el límite nocturno típico en suelo rural. Es el filtro que
|
||||
de verdad corta: de 47.519 km² quedan **505 km²** en toda España. El cuello de
|
||||
botella no es la soledad, es el sonido.
|
||||
|
||||
## 3. Se puntúa
|
||||
|
||||
| Criterio | Peso | Qué mide |
|
||||
|---|---|---|
|
||||
| Sonido | 30 % | Los dB del apartado anterior |
|
||||
| Soledad | 22 % | Lejanía de edificios, carreteras y núcleos; densidad construida en 5 km |
|
||||
| Acceso | 18 % | Pista en condiciones cerca (OSM distingue firme y grado), llano, sin pedregal |
|
||||
| Agua | 12 % | Río, arroyo o fuente entre 120 y 900 m |
|
||||
| Arbolado | 10 % | Entre 20 y 65 % de cobertura: sombra y pantalla sin ser impenetrable |
|
||||
| Clima | 8 % | Máxima del mes más cálido y mínima del más frío, corregidas por altitud |
|
||||
|
||||
Las estrellas salen de la media ponderada **penalizada por el eslabón más
|
||||
débil**: un sitio perfecto al que no se puede llegar no es de cuatro estrellas.
|
||||
|
||||
## 4. Se reparten
|
||||
|
||||
Se divide el país en bloques de 20 km, se coge el mejor punto elegible de cada
|
||||
bloque y después se exige 10 km de separación entre los elegidos. Sin ese
|
||||
segundo paso salen pares casi duplicados: dos bloques vecinos pueden elegir cada
|
||||
uno una celda pegada a su frontera común.
|
||||
|
||||
## Trampas que costaron sangre
|
||||
|
||||
- **La frontera.** El extracto de un país está recortado por su frontera, así
|
||||
que al otro lado no hay edificios en los datos aunque sí en el terreno. Sin
|
||||
añadir los países vecinos, toda la raya sale falsamente vacía.
|
||||
- **La rejilla no está alineada con la latitud.** En EPSG:3035 baja más al sur
|
||||
que la ventana de análisis, y colaba Melilla, cuyos edificios sí se habían
|
||||
filtrado. Salía como el punto más aislado del país con 74,6 km. El máximo real
|
||||
son 9,8 km.
|
||||
- **Los protegidos de OpenStreetMap cubren el 15 %; los oficiales, el 29 %.**
|
||||
Con los buenos, 33 de los 60 candidatos de la primera versión estaban dentro
|
||||
de espacio protegido.
|
||||
- **Sin distancia a carretera en la puntuación**, el modelo colocaba puntos de
|
||||
cinco estrellas sobre el propio asfalto.
|
||||
|
||||
## Lo que no sabe
|
||||
|
||||
- **No ve vallas ni propiedad.** Es la mayor diferencia con la realidad de campo.
|
||||
Por eso el visor lleva la capa de catastro.
|
||||
- **El modelo acústico es de manual.** Una inversión térmica nocturna o el viento
|
||||
a favor llevan el bajo mucho más lejos.
|
||||
- **Ignora la estación.** Riesgo de incendio de junio a septiembre.
|
||||
- **Distancia en línea recta, no tiempo de coche.**
|
||||
48
docs/Publicar.md
Normal file
48
docs/Publicar.md
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
# Publicar
|
||||
|
||||
## Este repositorio está en Gitea
|
||||
|
||||
**Gitea no tiene Pages integrado**, a diferencia de GitLab. Opciones:
|
||||
|
||||
### Clonar y abrir (lo más simple)
|
||||
|
||||
```bash
|
||||
git clone https://gitea.laenre.net/hacklab/EXPLORER.git
|
||||
cd EXPLORER
|
||||
xdg-open out/visor.html
|
||||
```
|
||||
|
||||
Funciona en Linux, Windows y macOS sin instalar nada.
|
||||
|
||||
### Servirlo con cualquier servidor estático
|
||||
|
||||
```bash
|
||||
cd out && python3 -m http.server 8000
|
||||
```
|
||||
|
||||
Y abrir `http://localhost:8000/visor.html`. Así también funciona desde el móvil
|
||||
si estás en la misma red: `http://IP-DEL-ORDENADOR:8000/visor.html`.
|
||||
|
||||
Para dejarlo en un dominio, cualquier nginx/Apache sirviendo `out/` vale. No hay
|
||||
backend.
|
||||
|
||||
### GitLab Pages, si lo espejas
|
||||
|
||||
El repositorio trae un `.gitlab-ci.yml` listo. Si creas un espejo en gitlab.com,
|
||||
publica solo con hacer push y queda en
|
||||
`https://USUARIO.gitlab.io/PROYECTO/`. Ese es el camino más cómodo para que lo
|
||||
use gente desde el móvil sin descargar nada.
|
||||
|
||||
## Móvil
|
||||
|
||||
El visor se adapta a pantalla estrecha: el mapa arriba, los controles debajo y la
|
||||
ficha a pantalla completa. Probado a 412 px de ancho.
|
||||
|
||||
Lo que **no** está probado en un móvil real es el gesto de pellizcar para hacer
|
||||
zoom en el modo Relieve, que usa eventos de puntero propios. En los modos Mapa y
|
||||
Ver de cerca el zoom lo gestiona Leaflet y no hay problema.
|
||||
|
||||
## Tamaño
|
||||
|
||||
El repositorio son unos 18 MB: `visor.html` 3,9 MB, `informe.html` 1,8 MB y
|
||||
8,4 MB de fotos aéreas. Los 22 GB de datos de partida no se versionan.
|
||||
40
docs/Seguridad.md
Normal file
40
docs/Seguridad.md
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
# Seguridad y privacidad
|
||||
|
||||
## Qué NO hace el visor
|
||||
|
||||
- No pide permisos del navegador. No usa geolocalización.
|
||||
- No manda datos a ningún sitio. No tiene analítica, ni cookies, ni rastreo.
|
||||
- Lo único que guarda es el idioma elegido, en `localStorage`.
|
||||
- No carga código de ningún CDN: Leaflet va incrustado en el fichero.
|
||||
|
||||
## Qué SÍ sale de tu máquina
|
||||
|
||||
En los modos Mapa y Ver de cerca, el navegador pide teselas a los servidores de
|
||||
la lista de [Fuentes](Fuentes-y-licencias). Esos servidores ven tu IP y **la zona
|
||||
que estás mirando**, como con cualquier mapa web. Si eso te importa, quédate en
|
||||
el modo Relieve, que es completamente local.
|
||||
|
||||
Los enlaces de la barra inferior abren servicios de terceros (Google, Mapillary,
|
||||
Catastro) con las coordenadas en la URL. Solo se abren si pulsas.
|
||||
|
||||
## Escapado de contenido
|
||||
|
||||
Los nombres de municipio y de espacio protegido vienen de OpenStreetMap y de
|
||||
ficheros oficiales, o sea de terceros: **cualquiera puede editar el nombre de un
|
||||
municipio en OSM**. Todo lo que sale de los datos y acaba en el HTML pasa por
|
||||
escapado antes, incluidos los tooltips del mapa. Sin eso, alguien podría inyectar
|
||||
código editando un topónimo.
|
||||
|
||||
## Al reconstruir los datos
|
||||
|
||||
- Todas las descargas van por HTTPS con verificación de certificado.
|
||||
- Los servidores del ministerio español sirven la cadena TLS incompleta. El
|
||||
proyecto **no desactiva la verificación**: descarga el certificado intermedio
|
||||
oficial de la FNMT y valida la cadena entera contra la raíz del sistema.
|
||||
- El repositorio no contiene credenciales. `data/` está en `.gitignore`.
|
||||
|
||||
## Si lo publicas
|
||||
|
||||
El visor es HTML estático, sin backend, así que la superficie de ataque es la de
|
||||
cualquier página estática. Sírvelo por HTTPS y añade cabeceras
|
||||
`Content-Security-Policy` si tu servidor lo permite.
|
||||
56
docs/Uso-del-visor.md
Normal file
56
docs/Uso-del-visor.md
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
# Uso del visor
|
||||
|
||||
## Los tres modos
|
||||
|
||||
Arriba a la izquierda:
|
||||
|
||||
- **Relieve** — el país entero sobre relieve sombreado, generado a partir del
|
||||
modelo de elevaciones. Funciona sin conexión. Encima puedes activar la capa de
|
||||
aislamiento y la de espacios protegidos.
|
||||
- **Mapa** — el país entero sobre mapa real: satélite, topográfico u
|
||||
OpenStreetMap. Necesita conexión.
|
||||
- **Ver de cerca** — lo mismo, centrado en la localización elegida.
|
||||
|
||||
## Capas
|
||||
|
||||
En los modos Mapa y Ver de cerca:
|
||||
|
||||
| Fondo | Qué aporta |
|
||||
|---|---|
|
||||
| Satélite | Ortofoto. Ves la explanada, los árboles y por dónde entra la pista |
|
||||
| Topográfico | Curvas de nivel, cotas, arroyos, topónimos |
|
||||
| OpenStreetMap | Caminos y nombres |
|
||||
|
||||
| Encima | Qué aporta |
|
||||
|---|---|
|
||||
| Parcelas del catastro | De quién es la finca y dónde acaba. **Lo más útil**: el modelo ve la pista, no el candado |
|
||||
| Red Natura 2000 | Límites oficiales en vivo |
|
||||
| Espacios protegidos | Figuras nacionales |
|
||||
| Otras localizaciones | El resto de puntos, para ver alternativas cerca |
|
||||
|
||||
## Filtros
|
||||
|
||||
Estrellas mínimas, región, y mínimos por criterio (sonido, agua, arbolado,
|
||||
acceso). La lista y el mapa se actualizan a la vez.
|
||||
|
||||
## La ficha
|
||||
|
||||
Al pulsar una localización:
|
||||
|
||||
- **Vista aérea** — foto real del sitio, 640 m de lado. Púlsala para ir al mapa.
|
||||
- **Relieve 3D** — el terreno 9,6 km alrededor. Arrastra para girarlo y ver si
|
||||
estás en una hondonada.
|
||||
- **Los seis criterios** con su puntuación.
|
||||
- **Los datos**: dB que llegan a la casa más cercana, distancias, arbolado,
|
||||
pendiente, temperaturas.
|
||||
- **Aviso** del espacio protegido más cercano.
|
||||
|
||||
## Los enlaces de abajo
|
||||
|
||||
Bajo el mapa, para la localización elegida: Satélite, Street View, Mapillary,
|
||||
OSM, Catastro y Cómo llegar.
|
||||
|
||||
## Idioma
|
||||
|
||||
Selector arriba a la izquierda: castellano, inglés, francés y portugués. Se
|
||||
recuerda entre visitas. Los nombres de municipio no se traducen, vienen del país.
|
||||
Loading…
Add table
Add a link
Reference in a new issue