Bibliotecas cliente¶
Dos clientes ligeros, una API, un nombre: geoworld en
PyPI y en
npm. No incluyen datos. Cada uno lee
data/index.json de una release de datos fijada,
descarga los archivos que pides, los cachea y verifica su sha256 contra el
índice.
Cada uno tiene su página completa: Python y JavaScript. Tres adaptadores ponen el cliente JavaScript en un mapa o en un árbol de componentes: MapLibre, Leaflet y React.
| Paquete | Qué es | Deps en runtime |
|---|---|---|
geoworld (PyPI) |
Cliente Python | ninguna |
geoworld (npm) |
Cliente JavaScript/TypeScript | ninguna |
geoworld-maplibre |
addBoundaries, feature state por id estable, fitToBounds |
ninguna (peer maplibre-gl) |
geoworld-leaflet |
withLeaflet(L).addBoundaries, layerById, toLatLngBounds |
ninguna (peer opcional leaflet) |
geoworld-react |
GeoWorldProvider, useBoundaries, useCountry, useChildren, … |
ninguna (peer react) |
Qué hacen — y qué no¶
- Leen el índice una vez.
data/index.jsonlista cada territorio, nivel, archivo, tamaño, checksum y licencia.countries(),levels(),bbox()yurl()responden desde él sin descargar ningún GeoJSON. - Descargan bajo demanda.
get()trae un nivel de un territorio. Los niveles demasiado grandes para un solo archivo (los municipios de Brasil) vienen en partes, una por división de primer nivel:get_part()/getPart()eiter_parts()/iterParts(). - Cachean. Python escribe en el directorio de caché de la plataforma;
JavaScript guarda los archivos en memoria y, en Node, puede persistirlos con
geoworld/node. La disposición es la misma,geoworld/<versión>/<ruta>, así que ambos pueden compartir un directorio. - Verifican. Cada archivo de resolución completa se hashea tras descargarlo y cada lectura de caché se vuelve a hashear; una discrepancia es un error, nunca se usa en silencio.
- Navegan. Cada feature tiene un
idestable y cada feature subnacional unparentID, así quefind(),parent(),children()ysearch()funcionan entre niveles sin comparar nombres. - Nada del lado del servidor. Las bibliotecas hablan con archivos
estáticos —
raw.githubusercontent.comen la etiqueta de la release por defecto, o cualquier host que indiques enbase_url/baseUrl, incluido un directorio local o un asset de release descomprimido.
No son un SIG: sin reproyección, sin operaciones geométricas, sin render.
Pásale la FeatureCollection a GeoPandas, Leaflet, MapLibre o lo que ya uses.
(to_geopandas() existe en Python por comodidad.)
La misma API en ambos¶
| Python | JavaScript | Devuelve |
|---|---|---|
GeoWorld(version, base_url=, cache_dir=, cache=, verify=) |
createClient({ version, baseUrl, cache, fetch, verify }) |
un cliente |
index() |
index() |
todo el index.json |
countries() |
countries() |
un resumen por territorio |
country(iso3) |
country(iso3) |
la entrada completa del índice |
levels(iso3) |
levels(iso3) |
["ADM0", "ADM1", …] |
dataset(iso3, level) |
dataset(iso3, level) |
la entrada de un nivel |
bbox(iso3, level) |
bbox(iso3, level) |
[oeste, sur, este, norte] |
parts(iso3, level) |
parts(iso3, level) |
códigos de parte de un nivel dividido |
url(iso3, level, part=, preview=) |
url(iso3, level, { part, preview }) |
la URL del archivo |
get(iso3, level) |
get(iso3, level) |
FeatureCollection |
get_part(iso3, level, code) |
getPart(iso3, level, code) |
FeatureCollection |
iter_parts(iso3, level) |
iterParts(iso3, level) |
pares (código, FeatureCollection) |
features(iso3, level) |
features(iso3, level) |
cada feature, a través de las partes si hace falta |
preview(iso3, level) |
preview(iso3, level) |
la FeatureCollection simplificada |
find(id) |
find(id) |
una Feature |
parent(id) |
parent(id) |
la Feature padre, o ninguna |
children(id) |
children(id) |
Features del siguiente nivel |
search(text, iso3, level=) |
search(text, iso3, level?) |
Features que coinciden |
clear_cache() |
clearCache() |
— |
to_geopandas(iso3, level) |
— | un GeoDataFrame |
En JavaScript todo es async. Los errores están tipados igual en ambos lados
(UnknownCountry, UnknownLevel, NoCombinedFile, ChecksumMismatch,
UnsupportedSchema, …) y todos extienden GeoWorldError.
Ambos clientes se prueban contra los mismos fixtures y deben producir el mismo
fixtures/expected/fixtures.json byte a byte, así que lo que uno calcula lo
calcula el otro.
Versiones¶
Las versiones de las bibliotecas y las de los datos son independientes
(por qué). Cada
release de biblioteca declara el schema_version de datos que entiende y una
release de datos por defecto:
| Biblioteca | Datos por defecto | Soporta esquema | |
|---|---|---|---|
| Python | geoworld 0.1.0 |
1.0.0 |
1 |
| JavaScript | geoworld 0.2.0, y los tres adaptadores en la misma versión |
1.0.0 |
1 |
Los paquetes JavaScript avanzan en bloque: un número de versión, una etiqueta,
y cada adaptador declara geoworld como peer en esa menor.
Fija la versión de datos contra la que probaste. version="main" sirve para
experimentar pero avisa: la rama se mueve y nada se cachea en disco.
Publicación¶
Los mantenedores publican desde etiquetas: python-vX.Y.Z ejecuta
publish-python.yml (PyPI, trusted publishing) y js-vX.Y.Z ejecuta
publish-js.yml, que publica geoworld y luego los tres adaptadores con
procedencia, saltando los que ya estén en el registro con esa versión. Ambos
workflows rechazan una etiqueta que no coincida con las versiones de los
paquetes.