@cerca.red/mapa 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +133 -0
- package/dist/capas.d.ts +29 -0
- package/dist/capas.js +489 -0
- package/dist/capas.js.map +1 -0
- package/dist/doble/estiloFalso.d.ts +19 -0
- package/dist/doble/estiloFalso.js +33 -0
- package/dist/doble/estiloFalso.js.map +1 -0
- package/dist/doble/index.d.ts +11 -0
- package/dist/doble/index.js +12 -0
- package/dist/doble/index.js.map +1 -0
- package/dist/doble/mapaFalso.d.ts +75 -0
- package/dist/doble/mapaFalso.js +535 -0
- package/dist/doble/mapaFalso.js.map +1 -0
- package/dist/encuadre.d.ts +64 -0
- package/dist/encuadre.js +83 -0
- package/dist/encuadre.js.map +1 -0
- package/dist/estilo.d.ts +88 -0
- package/dist/estilo.js +23 -0
- package/dist/estilo.js.map +1 -0
- package/dist/eventos.d.ts +127 -0
- package/dist/eventos.js +69 -0
- package/dist/eventos.js.map +1 -0
- package/dist/identificadores.d.ts +109 -0
- package/dist/identificadores.js +104 -0
- package/dist/identificadores.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/manifiesto.d.ts +97 -0
- package/dist/manifiesto.js +156 -0
- package/dist/manifiesto.js.map +1 -0
- package/dist/modelo.d.ts +154 -0
- package/dist/modelo.js +227 -0
- package/dist/modelo.js.map +1 -0
- package/dist/navegador/index.d.ts +70 -0
- package/dist/navegador/index.js +132 -0
- package/dist/navegador/index.js.map +1 -0
- package/dist/navegador/maplibre.d.ts +41 -0
- package/dist/navegador/maplibre.js +463 -0
- package/dist/navegador/maplibre.js.map +1 -0
- package/dist/navegador/protocolo.d.ts +4 -0
- package/dist/navegador/protocolo.js +55 -0
- package/dist/navegador/protocolo.js.map +1 -0
- package/dist/navegador/webgl.d.ts +24 -0
- package/dist/navegador/webgl.js +47 -0
- package/dist/navegador/webgl.js.map +1 -0
- package/dist/navegador/worker.d.ts +33 -0
- package/dist/navegador/worker.js +47 -0
- package/dist/navegador/worker.js.map +1 -0
- package/dist/paleta.d.ts +53 -0
- package/dist/paleta.js +53 -0
- package/dist/paleta.js.map +1 -0
- package/dist/proyecciones.d.ts +160 -0
- package/dist/proyecciones.js +2 -0
- package/dist/proyecciones.js.map +1 -0
- package/dist/puerto.d.ts +244 -0
- package/dist/puerto.js +2 -0
- package/dist/puerto.js.map +1 -0
- package/dist/sdk.d.ts +111 -0
- package/dist/sdk.js +552 -0
- package/dist/sdk.js.map +1 -0
- package/dist/sincronizacion.d.ts +40 -0
- package/dist/sincronizacion.js +144 -0
- package/dist/sincronizacion.js.map +1 -0
- package/dist/worker-de-maplibre.d.ts +36 -0
- package/dist/worker-de-maplibre.js +37 -0
- package/dist/worker-de-maplibre.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ColeccionDeEntidades } from "@cerca.red/geo";
|
|
2
|
+
import type { CapaDelEstilo } from "./estilo.ts";
|
|
3
|
+
import { type Anclas } from "./identificadores.ts";
|
|
4
|
+
import { type ModeloDelMapa } from "./modelo.ts";
|
|
5
|
+
import type { PaletaDelMapa } from "./paleta.ts";
|
|
6
|
+
import type { MapaNativo, OpcionesDeFuente } from "./puerto.ts";
|
|
7
|
+
/** Todo lo que se dibuja, por fuente, calculado del modelo. */
|
|
8
|
+
export declare function coleccionesDe(modelo: ModeloDelMapa): ReadonlyMap<string, ColeccionDeEntidades>;
|
|
9
|
+
/** Una capa que la superficie añadió por su cuenta, con lo que necesita para vivir. */
|
|
10
|
+
export interface CapaExtra {
|
|
11
|
+
readonly capa: CapaDelEstilo;
|
|
12
|
+
readonly antesDe?: string;
|
|
13
|
+
readonly fuente?: {
|
|
14
|
+
readonly id: string;
|
|
15
|
+
readonly datos: ColeccionDeEntidades;
|
|
16
|
+
readonly opciones?: OpcionesDeFuente;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Monta sobre el motor todo lo que el SDK dibuja: fuentes, capas de Cerca y
|
|
21
|
+
* capas extra, en ese orden.
|
|
22
|
+
*
|
|
23
|
+
* Idempotente sobre un estilo recién puesto, que es el único momento en que
|
|
24
|
+
* se llama.
|
|
25
|
+
*/
|
|
26
|
+
export declare function montarSobreElEstilo(motor: MapaNativo, modelo: ModeloDelMapa, paleta: PaletaDelMapa, anclas: Anclas, capasExtra: readonly CapaExtra[]): void;
|
|
27
|
+
/** Monta una capa extra y su fuente, si trae. */
|
|
28
|
+
export declare function montarCapaExtra(motor: MapaNativo, extra: CapaExtra): void;
|
|
29
|
+
/**
|
|
30
|
+
* Qué fuentes hay que reescribir tras un cambio de modelo.
|
|
31
|
+
*
|
|
32
|
+
* Compara por referencia, que es exacto porque el modelo es inmutable: dos
|
|
33
|
+
* modelos que comparten la misma lista de negocios tienen los mismos
|
|
34
|
+
* negocios, sin recorrer nada. Reescribir todas las fuentes en cada cambio
|
|
35
|
+
* funcionaría igual de bien en una pantalla con diez puntos y se notaría en
|
|
36
|
+
* una con quinientos, que es justo donde no se puede probar a ojo.
|
|
37
|
+
*/
|
|
38
|
+
export declare function fuentesQueCambiaron(anterior: ModeloDelMapa, nuevo: ModeloDelMapa): readonly string[];
|
|
39
|
+
/** Escribe en el motor solo las fuentes que cambiaron. */
|
|
40
|
+
export declare function aplicarCambios(motor: MapaNativo, modelo: ModeloDelMapa, fuentes: readonly string[]): void;
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { todasLasCapas } from "./capas.js";
|
|
2
|
+
import { FUENTES } from "./identificadores.js";
|
|
3
|
+
import { coleccionDeGrupos, coleccionDeImprecision, coleccionDeIsocronas, coleccionDeNegocios, coleccionDeRutas, coleccionDeSedes, coleccionDeSeleccion, coleccionDeUbicacion, coleccionDeVehiculos, coleccionDeZonas, } from "./modelo.js";
|
|
4
|
+
/**
|
|
5
|
+
* Cómo el modelo llega al motor.
|
|
6
|
+
*
|
|
7
|
+
* Está en un archivo aparte del SDK porque es la parte que se ejecuta dos
|
|
8
|
+
* veces por razones distintas: al arrancar, y **otra vez entera** cada vez que
|
|
9
|
+
* cambia el tema o el idioma, porque reemplazar el estilo de MapLibre borra
|
|
10
|
+
* todas las fuentes y capas que se le habían añadido.
|
|
11
|
+
*
|
|
12
|
+
* Que sea una sola función la que monta todo es lo que garantiza que el
|
|
13
|
+
* segundo montaje sea idéntico al primero. Con dos caminos —uno para arrancar
|
|
14
|
+
* y otro para reconstruir— el segundo se olvida de algo, y lo que se olvida
|
|
15
|
+
* son los símbolos o el estado de la selección: cosas que no se ven hasta que
|
|
16
|
+
* alguien cambia a modo oscuro con un negocio elegido.
|
|
17
|
+
*/
|
|
18
|
+
/** Las opciones de cada fuente, que no cambian nunca. */
|
|
19
|
+
const OPCIONES_DE_FUENTE = {
|
|
20
|
+
[FUENTES.negocios]: {
|
|
21
|
+
// La agrupación la hace el motor. Hacerla en JavaScript sobre cientos de
|
|
22
|
+
// puntos es lo que convierte un mapa en una presentación de diapositivas
|
|
23
|
+
// en un teléfono de gama media.
|
|
24
|
+
agrupar: true,
|
|
25
|
+
radioDeGrupoEnPx: 50,
|
|
26
|
+
zoomMaximoDeGrupo: 15,
|
|
27
|
+
promoverId: "id",
|
|
28
|
+
},
|
|
29
|
+
[FUENTES.grupos]: { promoverId: "id" },
|
|
30
|
+
[FUENTES.sedes]: { promoverId: "id" },
|
|
31
|
+
[FUENTES.seleccion]: { promoverId: "id" },
|
|
32
|
+
[FUENTES.vehiculos]: { promoverId: "id" },
|
|
33
|
+
[FUENTES.rutas]: { promoverId: "id" },
|
|
34
|
+
[FUENTES.zonas]: { promoverId: "id" },
|
|
35
|
+
[FUENTES.imprecision]: { promoverId: "id" },
|
|
36
|
+
[FUENTES.isocronas]: {},
|
|
37
|
+
[FUENTES.ubicacion]: {},
|
|
38
|
+
};
|
|
39
|
+
/** Todo lo que se dibuja, por fuente, calculado del modelo. */
|
|
40
|
+
export function coleccionesDe(modelo) {
|
|
41
|
+
return new Map([
|
|
42
|
+
[FUENTES.negocios, coleccionDeNegocios(modelo)],
|
|
43
|
+
[FUENTES.grupos, coleccionDeGrupos(modelo)],
|
|
44
|
+
[FUENTES.sedes, coleccionDeSedes(modelo)],
|
|
45
|
+
[FUENTES.seleccion, coleccionDeSeleccion(modelo)],
|
|
46
|
+
[FUENTES.imprecision, coleccionDeImprecision(modelo)],
|
|
47
|
+
[FUENTES.ubicacion, coleccionDeUbicacion(modelo)],
|
|
48
|
+
[FUENTES.vehiculos, coleccionDeVehiculos(modelo)],
|
|
49
|
+
[FUENTES.rutas, coleccionDeRutas(modelo)],
|
|
50
|
+
[FUENTES.zonas, coleccionDeZonas(modelo)],
|
|
51
|
+
[FUENTES.isocronas, coleccionDeIsocronas(modelo)],
|
|
52
|
+
]);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Monta sobre el motor todo lo que el SDK dibuja: fuentes, capas de Cerca y
|
|
56
|
+
* capas extra, en ese orden.
|
|
57
|
+
*
|
|
58
|
+
* Idempotente sobre un estilo recién puesto, que es el único momento en que
|
|
59
|
+
* se llama.
|
|
60
|
+
*/
|
|
61
|
+
export function montarSobreElEstilo(motor, modelo, paleta, anclas, capasExtra) {
|
|
62
|
+
for (const [id, datos] of coleccionesDe(modelo)) {
|
|
63
|
+
if (motor.tieneFuente(id))
|
|
64
|
+
motor.ponerDatosDeFuente(id, datos);
|
|
65
|
+
else
|
|
66
|
+
motor.agregarFuenteGeoJSON(id, datos, OPCIONES_DE_FUENTE[id] ?? {});
|
|
67
|
+
}
|
|
68
|
+
for (const { capa, antesDe } of todasLasCapas(paleta, anclas)) {
|
|
69
|
+
if (motor.tieneCapa(capa.id))
|
|
70
|
+
continue;
|
|
71
|
+
// Un ancla vacía significa «arriba del todo». Y si el ancla existe pero
|
|
72
|
+
// el estilo no la trae —porque `mapa-estilos` cambió sus nombres—, la
|
|
73
|
+
// capa se añade igual al final en vez de reventar el mapa entero: un
|
|
74
|
+
// orden de capas equivocado se ve y se arregla; un mapa que no carga, no.
|
|
75
|
+
const referencia = antesDe !== "" && motor.tieneCapa(antesDe) ? antesDe : undefined;
|
|
76
|
+
motor.agregarCapa(capa, referencia);
|
|
77
|
+
}
|
|
78
|
+
for (const extra of capasExtra)
|
|
79
|
+
montarCapaExtra(motor, extra);
|
|
80
|
+
}
|
|
81
|
+
/** Monta una capa extra y su fuente, si trae. */
|
|
82
|
+
export function montarCapaExtra(motor, extra) {
|
|
83
|
+
if (extra.fuente !== undefined && !motor.tieneFuente(extra.fuente.id)) {
|
|
84
|
+
motor.agregarFuenteGeoJSON(extra.fuente.id, extra.fuente.datos, extra.fuente.opciones ?? {});
|
|
85
|
+
}
|
|
86
|
+
if (motor.tieneCapa(extra.capa.id))
|
|
87
|
+
return;
|
|
88
|
+
const referencia = extra.antesDe !== undefined && motor.tieneCapa(extra.antesDe)
|
|
89
|
+
? extra.antesDe
|
|
90
|
+
: undefined;
|
|
91
|
+
motor.agregarCapa(extra.capa, referencia);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Qué fuentes hay que reescribir tras un cambio de modelo.
|
|
95
|
+
*
|
|
96
|
+
* Compara por referencia, que es exacto porque el modelo es inmutable: dos
|
|
97
|
+
* modelos que comparten la misma lista de negocios tienen los mismos
|
|
98
|
+
* negocios, sin recorrer nada. Reescribir todas las fuentes en cada cambio
|
|
99
|
+
* funcionaría igual de bien en una pantalla con diez puntos y se notaría en
|
|
100
|
+
* una con quinientos, que es justo donde no se puede probar a ojo.
|
|
101
|
+
*/
|
|
102
|
+
export function fuentesQueCambiaron(anterior, nuevo) {
|
|
103
|
+
const cambiadas = new Set();
|
|
104
|
+
const resultadosCambiaron = anterior.resultados !== nuevo.resultados;
|
|
105
|
+
const negociosCambiaron = resultadosCambiaron ||
|
|
106
|
+
anterior.radioDeImprecisionEnMetros !== nuevo.radioDeImprecisionEnMetros;
|
|
107
|
+
if (negociosCambiaron) {
|
|
108
|
+
cambiadas.add(FUENTES.negocios);
|
|
109
|
+
cambiadas.add(FUENTES.sedes);
|
|
110
|
+
cambiadas.add(FUENTES.imprecision);
|
|
111
|
+
// La selección sale de la lista de negocios: si la lista cambió, el punto
|
|
112
|
+
// resaltado puede haberse movido o haber desaparecido.
|
|
113
|
+
cambiadas.add(FUENTES.seleccion);
|
|
114
|
+
}
|
|
115
|
+
if (resultadosCambiaron)
|
|
116
|
+
cambiadas.add(FUENTES.grupos);
|
|
117
|
+
if (anterior.seleccionado !== nuevo.seleccionado) {
|
|
118
|
+
cambiadas.add(FUENTES.seleccion);
|
|
119
|
+
}
|
|
120
|
+
if (anterior.ubicacion !== nuevo.ubicacion)
|
|
121
|
+
cambiadas.add(FUENTES.ubicacion);
|
|
122
|
+
if (anterior.vehiculos !== nuevo.vehiculos)
|
|
123
|
+
cambiadas.add(FUENTES.vehiculos);
|
|
124
|
+
if (anterior.rutas !== nuevo.rutas)
|
|
125
|
+
cambiadas.add(FUENTES.rutas);
|
|
126
|
+
if (anterior.zonas !== nuevo.zonas)
|
|
127
|
+
cambiadas.add(FUENTES.zonas);
|
|
128
|
+
if (anterior.isocronas !== nuevo.isocronas)
|
|
129
|
+
cambiadas.add(FUENTES.isocronas);
|
|
130
|
+
return [...cambiadas];
|
|
131
|
+
}
|
|
132
|
+
/** Escribe en el motor solo las fuentes que cambiaron. */
|
|
133
|
+
export function aplicarCambios(motor, modelo, fuentes) {
|
|
134
|
+
if (fuentes.length === 0)
|
|
135
|
+
return;
|
|
136
|
+
const colecciones = coleccionesDe(modelo);
|
|
137
|
+
for (const id of fuentes) {
|
|
138
|
+
const datos = colecciones.get(id);
|
|
139
|
+
if (datos === undefined || !motor.tieneFuente(id))
|
|
140
|
+
continue;
|
|
141
|
+
motor.ponerDatosDeFuente(id, datos);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=sincronizacion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sincronizacion.js","sourceRoot":"","sources":["../src/sincronizacion.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ColeccionDeEntidades } from \"@cerca.red/geo\";\n\nimport type { CapaDelEstilo } from \"./estilo.ts\";\nimport { todasLasCapas } from \"./capas.ts\";\nimport { type Anclas, FUENTES } from \"./identificadores.ts\";\nimport {\n type ModeloDelMapa,\n coleccionDeGrupos,\n coleccionDeImprecision,\n coleccionDeIsocronas,\n coleccionDeNegocios,\n coleccionDeRutas,\n coleccionDeSedes,\n coleccionDeSeleccion,\n coleccionDeUbicacion,\n coleccionDeVehiculos,\n coleccionDeZonas,\n} from \"./modelo.ts\";\nimport type { PaletaDelMapa } from \"./paleta.ts\";\nimport type { MapaNativo, OpcionesDeFuente } from \"./puerto.ts\";\n\n/**\n * Cómo el modelo llega al motor.\n *\n * Está en un archivo aparte del SDK porque es la parte que se ejecuta dos\n * veces por razones distintas: al arrancar, y **otra vez entera** cada vez que\n * cambia el tema o el idioma, porque reemplazar el estilo de MapLibre borra\n * todas las fuentes y capas que se le habían añadido.\n *\n * Que sea una sola función la que monta todo es lo que garantiza que el\n * segundo montaje sea idéntico al primero. Con dos caminos —uno para arrancar\n * y otro para reconstruir— el segundo se olvida de algo, y lo que se olvida\n * son los símbolos o el estado de la selección: cosas que no se ven hasta que\n * alguien cambia a modo oscuro con un negocio elegido.\n */\n\n/** Las opciones de cada fuente, que no cambian nunca. */\nconst OPCIONES_DE_FUENTE: Readonly<Record<string, OpcionesDeFuente>> = {\n [FUENTES.negocios]: {\n // La agrupación la hace el motor. Hacerla en JavaScript sobre cientos de\n // puntos es lo que convierte un mapa en una presentación de diapositivas\n // en un teléfono de gama media.\n agrupar: true,\n radioDeGrupoEnPx: 50,\n zoomMaximoDeGrupo: 15,\n promoverId: \"id\",\n },\n [FUENTES.grupos]: { promoverId: \"id\" },\n [FUENTES.sedes]: { promoverId: \"id\" },\n [FUENTES.seleccion]: { promoverId: \"id\" },\n [FUENTES.vehiculos]: { promoverId: \"id\" },\n [FUENTES.rutas]: { promoverId: \"id\" },\n [FUENTES.zonas]: { promoverId: \"id\" },\n [FUENTES.imprecision]: { promoverId: \"id\" },\n [FUENTES.isocronas]: {},\n [FUENTES.ubicacion]: {},\n};\n\n/** Todo lo que se dibuja, por fuente, calculado del modelo. */\nexport function coleccionesDe(\n modelo: ModeloDelMapa,\n): ReadonlyMap<string, ColeccionDeEntidades> {\n return new Map<string, ColeccionDeEntidades>([\n [FUENTES.negocios, coleccionDeNegocios(modelo)],\n [FUENTES.grupos, coleccionDeGrupos(modelo)],\n [FUENTES.sedes, coleccionDeSedes(modelo)],\n [FUENTES.seleccion, coleccionDeSeleccion(modelo)],\n [FUENTES.imprecision, coleccionDeImprecision(modelo)],\n [FUENTES.ubicacion, coleccionDeUbicacion(modelo)],\n [FUENTES.vehiculos, coleccionDeVehiculos(modelo)],\n [FUENTES.rutas, coleccionDeRutas(modelo)],\n [FUENTES.zonas, coleccionDeZonas(modelo)],\n [FUENTES.isocronas, coleccionDeIsocronas(modelo)],\n ]);\n}\n\n/** Una capa que la superficie añadió por su cuenta, con lo que necesita para vivir. */\nexport interface CapaExtra {\n readonly capa: CapaDelEstilo;\n readonly antesDe?: string;\n readonly fuente?: {\n readonly id: string;\n readonly datos: ColeccionDeEntidades;\n readonly opciones?: OpcionesDeFuente;\n };\n}\n\n/**\n * Monta sobre el motor todo lo que el SDK dibuja: fuentes, capas de Cerca y\n * capas extra, en ese orden.\n *\n * Idempotente sobre un estilo recién puesto, que es el único momento en que\n * se llama.\n */\nexport function montarSobreElEstilo(\n motor: MapaNativo,\n modelo: ModeloDelMapa,\n paleta: PaletaDelMapa,\n anclas: Anclas,\n capasExtra: readonly CapaExtra[],\n): void {\n for (const [id, datos] of coleccionesDe(modelo)) {\n if (motor.tieneFuente(id)) motor.ponerDatosDeFuente(id, datos);\n else motor.agregarFuenteGeoJSON(id, datos, OPCIONES_DE_FUENTE[id] ?? {});\n }\n\n for (const { capa, antesDe } of todasLasCapas(paleta, anclas)) {\n if (motor.tieneCapa(capa.id)) continue;\n // Un ancla vacía significa «arriba del todo». Y si el ancla existe pero\n // el estilo no la trae —porque `mapa-estilos` cambió sus nombres—, la\n // capa se añade igual al final en vez de reventar el mapa entero: un\n // orden de capas equivocado se ve y se arregla; un mapa que no carga, no.\n const referencia =\n antesDe !== \"\" && motor.tieneCapa(antesDe) ? antesDe : undefined;\n motor.agregarCapa(capa, referencia);\n }\n\n for (const extra of capasExtra) montarCapaExtra(motor, extra);\n}\n\n/** Monta una capa extra y su fuente, si trae. */\nexport function montarCapaExtra(motor: MapaNativo, extra: CapaExtra): void {\n if (extra.fuente !== undefined && !motor.tieneFuente(extra.fuente.id)) {\n motor.agregarFuenteGeoJSON(\n extra.fuente.id,\n extra.fuente.datos,\n extra.fuente.opciones ?? {},\n );\n }\n if (motor.tieneCapa(extra.capa.id)) return;\n const referencia =\n extra.antesDe !== undefined && motor.tieneCapa(extra.antesDe)\n ? extra.antesDe\n : undefined;\n motor.agregarCapa(extra.capa, referencia);\n}\n\n/**\n * Qué fuentes hay que reescribir tras un cambio de modelo.\n *\n * Compara por referencia, que es exacto porque el modelo es inmutable: dos\n * modelos que comparten la misma lista de negocios tienen los mismos\n * negocios, sin recorrer nada. Reescribir todas las fuentes en cada cambio\n * funcionaría igual de bien en una pantalla con diez puntos y se notaría en\n * una con quinientos, que es justo donde no se puede probar a ojo.\n */\nexport function fuentesQueCambiaron(\n anterior: ModeloDelMapa,\n nuevo: ModeloDelMapa,\n): readonly string[] {\n const cambiadas = new Set<string>();\n\n const resultadosCambiaron = anterior.resultados !== nuevo.resultados;\n const negociosCambiaron =\n resultadosCambiaron ||\n anterior.radioDeImprecisionEnMetros !== nuevo.radioDeImprecisionEnMetros;\n\n if (negociosCambiaron) {\n cambiadas.add(FUENTES.negocios);\n cambiadas.add(FUENTES.sedes);\n cambiadas.add(FUENTES.imprecision);\n // La selección sale de la lista de negocios: si la lista cambió, el punto\n // resaltado puede haberse movido o haber desaparecido.\n cambiadas.add(FUENTES.seleccion);\n }\n if (resultadosCambiaron) cambiadas.add(FUENTES.grupos);\n if (anterior.seleccionado !== nuevo.seleccionado) {\n cambiadas.add(FUENTES.seleccion);\n }\n if (anterior.ubicacion !== nuevo.ubicacion) cambiadas.add(FUENTES.ubicacion);\n if (anterior.vehiculos !== nuevo.vehiculos) cambiadas.add(FUENTES.vehiculos);\n if (anterior.rutas !== nuevo.rutas) cambiadas.add(FUENTES.rutas);\n if (anterior.zonas !== nuevo.zonas) cambiadas.add(FUENTES.zonas);\n if (anterior.isocronas !== nuevo.isocronas) cambiadas.add(FUENTES.isocronas);\n\n return [...cambiadas];\n}\n\n/** Escribe en el motor solo las fuentes que cambiaron. */\nexport function aplicarCambios(\n motor: MapaNativo,\n modelo: ModeloDelMapa,\n fuentes: readonly string[],\n): void {\n if (fuentes.length === 0) return;\n const colecciones = coleccionesDe(modelo);\n for (const id of fuentes) {\n const datos = colecciones.get(id);\n if (datos === undefined || !motor.tieneFuente(id)) continue;\n motor.ponerDatosDeFuente(id, datos);\n }\n}\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lo que hace falta saber para servir el worker de MapLibre, dicho como dato.
|
|
3
|
+
*
|
|
4
|
+
* Las dos constantes están aquí y no en `navegador/` a propósito: son cadenas,
|
|
5
|
+
* no tocan el DOM ni importan `maplibre-gl`, y quien las necesita es la
|
|
6
|
+
* **compilación** de la superficie —un guion de Node que copia un archivo a
|
|
7
|
+
* `public/`, una prueba que compara versiones—, no el navegador. Ponerlas
|
|
8
|
+
* detrás de `./navegador` obligaría a ese guion a importar el motor entero
|
|
9
|
+
* para leer dos cadenas.
|
|
10
|
+
*
|
|
11
|
+
* El porqué de todo esto está en el README del paquete, sección «Next.js y
|
|
12
|
+
* los bundlers que pierden `import.meta.url`».
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* El especificador del archivo que hay que servir, tal como se resuelve desde
|
|
16
|
+
* `node_modules`.
|
|
17
|
+
*
|
|
18
|
+
* Se da como especificador y no como ruta de disco para que quien lo copie lo
|
|
19
|
+
* pase por `require.resolve` o `import.meta.resolve`: así sale el archivo del
|
|
20
|
+
* `maplibre-gl` que **ese** proyecto resolvió, y no el de otro `node_modules`
|
|
21
|
+
* más arriba. `maplibre-gl` lo exporta bajo `"./dist/*"`.
|
|
22
|
+
*/
|
|
23
|
+
export declare const RUTA_DEL_WORKER_DE_MAPLIBRE = "maplibre-gl/dist/maplibre-gl-worker.mjs";
|
|
24
|
+
/**
|
|
25
|
+
* La versión de `maplibre-gl` contra la que se compiló este paquete.
|
|
26
|
+
*
|
|
27
|
+
* Existe para que la superficie compare: el worker que sirva tiene que salir
|
|
28
|
+
* de **esta misma versión** del paquete. El protocolo entre el hilo principal
|
|
29
|
+
* y el worker es interno de MapLibre y no está versionado, así que un worker
|
|
30
|
+
* de otra versión no da un error que lo diga — da un mapa que no pinta
|
|
31
|
+
* teselas.
|
|
32
|
+
*
|
|
33
|
+
* `worker-de-maplibre.test.ts` la compara con la versión que resuelve este
|
|
34
|
+
* árbol, para que subir el catálogo y olvidar esta línea salga en rojo.
|
|
35
|
+
*/
|
|
36
|
+
export declare const VERSION_DE_MAPLIBRE = "6.8.0";
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lo que hace falta saber para servir el worker de MapLibre, dicho como dato.
|
|
3
|
+
*
|
|
4
|
+
* Las dos constantes están aquí y no en `navegador/` a propósito: son cadenas,
|
|
5
|
+
* no tocan el DOM ni importan `maplibre-gl`, y quien las necesita es la
|
|
6
|
+
* **compilación** de la superficie —un guion de Node que copia un archivo a
|
|
7
|
+
* `public/`, una prueba que compara versiones—, no el navegador. Ponerlas
|
|
8
|
+
* detrás de `./navegador` obligaría a ese guion a importar el motor entero
|
|
9
|
+
* para leer dos cadenas.
|
|
10
|
+
*
|
|
11
|
+
* El porqué de todo esto está en el README del paquete, sección «Next.js y
|
|
12
|
+
* los bundlers que pierden `import.meta.url`».
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* El especificador del archivo que hay que servir, tal como se resuelve desde
|
|
16
|
+
* `node_modules`.
|
|
17
|
+
*
|
|
18
|
+
* Se da como especificador y no como ruta de disco para que quien lo copie lo
|
|
19
|
+
* pase por `require.resolve` o `import.meta.resolve`: así sale el archivo del
|
|
20
|
+
* `maplibre-gl` que **ese** proyecto resolvió, y no el de otro `node_modules`
|
|
21
|
+
* más arriba. `maplibre-gl` lo exporta bajo `"./dist/*"`.
|
|
22
|
+
*/
|
|
23
|
+
export const RUTA_DEL_WORKER_DE_MAPLIBRE = "maplibre-gl/dist/maplibre-gl-worker.mjs";
|
|
24
|
+
/**
|
|
25
|
+
* La versión de `maplibre-gl` contra la que se compiló este paquete.
|
|
26
|
+
*
|
|
27
|
+
* Existe para que la superficie compare: el worker que sirva tiene que salir
|
|
28
|
+
* de **esta misma versión** del paquete. El protocolo entre el hilo principal
|
|
29
|
+
* y el worker es interno de MapLibre y no está versionado, así que un worker
|
|
30
|
+
* de otra versión no da un error que lo diga — da un mapa que no pinta
|
|
31
|
+
* teselas.
|
|
32
|
+
*
|
|
33
|
+
* `worker-de-maplibre.test.ts` la compara con la versión que resuelve este
|
|
34
|
+
* árbol, para que subir el catálogo y olvidar esta línea salga en rojo.
|
|
35
|
+
*/
|
|
36
|
+
export const VERSION_DE_MAPLIBRE = "6.8.0";
|
|
37
|
+
//# sourceMappingURL=worker-de-maplibre.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-de-maplibre.js","sourceRoot":"","sources":["../src/worker-de-maplibre.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,2BAA2B,GACtC,yCAAyC,CAAC;AAE5C;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CAAC","sourcesContent":["/**\n * Lo que hace falta saber para servir el worker de MapLibre, dicho como dato.\n *\n * Las dos constantes están aquí y no en `navegador/` a propósito: son cadenas,\n * no tocan el DOM ni importan `maplibre-gl`, y quien las necesita es la\n * **compilación** de la superficie —un guion de Node que copia un archivo a\n * `public/`, una prueba que compara versiones—, no el navegador. Ponerlas\n * detrás de `./navegador` obligaría a ese guion a importar el motor entero\n * para leer dos cadenas.\n *\n * El porqué de todo esto está en el README del paquete, sección «Next.js y\n * los bundlers que pierden `import.meta.url`».\n */\n\n/**\n * El especificador del archivo que hay que servir, tal como se resuelve desde\n * `node_modules`.\n *\n * Se da como especificador y no como ruta de disco para que quien lo copie lo\n * pase por `require.resolve` o `import.meta.resolve`: así sale el archivo del\n * `maplibre-gl` que **ese** proyecto resolvió, y no el de otro `node_modules`\n * más arriba. `maplibre-gl` lo exporta bajo `\"./dist/*\"`.\n */\nexport const RUTA_DEL_WORKER_DE_MAPLIBRE =\n \"maplibre-gl/dist/maplibre-gl-worker.mjs\";\n\n/**\n * La versión de `maplibre-gl` contra la que se compiló este paquete.\n *\n * Existe para que la superficie compare: el worker que sirva tiene que salir\n * de **esta misma versión** del paquete. El protocolo entre el hilo principal\n * y el worker es interno de MapLibre y no está versionado, así que un worker\n * de otra versión no da un error que lo diga — da un mapa que no pinta\n * teselas.\n *\n * `worker-de-maplibre.test.ts` la compara con la versión que resuelve este\n * árbol, para que subir el catálogo y olvidar esta línea salga en rojo.\n */\nexport const VERSION_DE_MAPLIBRE = \"6.8.0\";\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@cerca.red/mapa",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "El SDK del mapa de Cerca: modelo, cámara, capas y eventos. El punto de entrada por defecto no alcanza MapLibre; el mapa entra por la subruta ./navegador.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/index.js"
|
|
11
|
+
},
|
|
12
|
+
"./navegador": {
|
|
13
|
+
"types": "./dist/navegador/index.d.ts",
|
|
14
|
+
"import": "./dist/navegador/index.js"
|
|
15
|
+
},
|
|
16
|
+
"./doble": {
|
|
17
|
+
"types": "./dist/doble/index.d.ts",
|
|
18
|
+
"import": "./dist/doble/index.js"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"publishConfig": {
|
|
22
|
+
"access": "public"
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
"dist"
|
|
26
|
+
],
|
|
27
|
+
"sideEffects": [
|
|
28
|
+
"./src/navegador/*.ts",
|
|
29
|
+
"./dist/navegador/*.js"
|
|
30
|
+
],
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@cerca.red/geo": "0.2.0"
|
|
33
|
+
},
|
|
34
|
+
"peerDependencies": {
|
|
35
|
+
"maplibre-gl": "^6.8.0",
|
|
36
|
+
"pmtiles": "^4.5.0"
|
|
37
|
+
},
|
|
38
|
+
"peerDependenciesMeta": {
|
|
39
|
+
"maplibre-gl": {
|
|
40
|
+
"optional": true
|
|
41
|
+
},
|
|
42
|
+
"pmtiles": {
|
|
43
|
+
"optional": true
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"maplibre-gl": "6.8.0",
|
|
48
|
+
"pmtiles": "4.5.0",
|
|
49
|
+
"@cerca.red/mapa-estilos": "0.2.0"
|
|
50
|
+
},
|
|
51
|
+
"repository": {
|
|
52
|
+
"type": "git",
|
|
53
|
+
"url": "git+https://github.com/Exus-Agencia-Web/cerca-maps.git",
|
|
54
|
+
"directory": "packages/mapa"
|
|
55
|
+
},
|
|
56
|
+
"scripts": {
|
|
57
|
+
"construir": "tsc -p tsconfig.build.json"
|
|
58
|
+
}
|
|
59
|
+
}
|