@foodmarketmaker/mapag 0.0.15 → 0.0.16
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.
|
@@ -181,7 +181,56 @@ async function sampleTilesForLayers(pmtiles) {
|
|
|
181
181
|
return [];
|
|
182
182
|
}
|
|
183
183
|
}
|
|
184
|
+
async function pmtilesPixelInfo(url, map, e) {
|
|
185
|
+
const pmtiles = new PMTiles(url.replace('pmtiles://', ''));
|
|
186
|
+
const lngLat = e.lngLat; // {lng, lat}
|
|
187
|
+
// Convert lat/lon to tile coordinates at a chosen zoom
|
|
188
|
+
const zoom = 10; // pick a zoom level for sampling
|
|
189
|
+
const x = Math.floor(((lngLat.lng + 180) / 360) * Math.pow(2, zoom));
|
|
190
|
+
const y = Math.floor(((1 -
|
|
191
|
+
Math.log(Math.tan((lngLat.lat * Math.PI) / 180) +
|
|
192
|
+
1 / Math.cos((lngLat.lat * Math.PI) / 180)) /
|
|
193
|
+
Math.PI) /
|
|
194
|
+
2) *
|
|
195
|
+
Math.pow(2, zoom));
|
|
196
|
+
// 5. Fetch the tile from PMTiles
|
|
197
|
+
const tile = await pmtiles.getZxy(zoom, x, y);
|
|
198
|
+
if (!tile) {
|
|
199
|
+
console.log("No tile found at this location");
|
|
200
|
+
return undefined;
|
|
201
|
+
}
|
|
202
|
+
// Decode the raster tile (PNG or WebP)
|
|
203
|
+
const blob = new Blob([tile.data]);
|
|
204
|
+
const bitmap = await createImageBitmap(blob);
|
|
205
|
+
// Draw to canvas to read pixel
|
|
206
|
+
const canvas = document.createElement("canvas");
|
|
207
|
+
canvas.width = bitmap.width;
|
|
208
|
+
canvas.height = bitmap.height;
|
|
209
|
+
const ctx = canvas.getContext("2d");
|
|
210
|
+
if (!ctx) {
|
|
211
|
+
console.error("Failed to get canvas context");
|
|
212
|
+
return undefined;
|
|
213
|
+
}
|
|
214
|
+
ctx.drawImage(bitmap, 0, 0);
|
|
215
|
+
// Convert lat/lon to pixel coordinates inside the tile
|
|
216
|
+
const px = Math.floor(((lngLat.lng + 180) / 360) * (256 * Math.pow(2, zoom))) % 256;
|
|
217
|
+
const py = Math.floor(((1 -
|
|
218
|
+
Math.log(Math.tan((lngLat.lat * Math.PI) / 180) +
|
|
219
|
+
1 / Math.cos((lngLat.lat * Math.PI) / 180)) /
|
|
220
|
+
Math.PI) /
|
|
221
|
+
2) *
|
|
222
|
+
(256 * Math.pow(2, zoom))) % 256;
|
|
223
|
+
const pixel = ctx.getImageData(px, py, 1, 1).data;
|
|
224
|
+
console.log(`Pixel RGBA at ${lngLat.lng},${lngLat.lat}:`, pixel);
|
|
225
|
+
// const r = pixel[0];
|
|
226
|
+
// const g = pixel[1];
|
|
227
|
+
// const b = pixel[2];
|
|
228
|
+
// const a = pixel[3];
|
|
229
|
+
return pixel;
|
|
230
|
+
}
|
|
184
231
|
|
|
232
|
+
const DEFAULT_GLYPHS = "https://basemaps.arcgis.com/arcgis/rest/services/World_Basemap_v2/VectorTileServer/resources/fonts/{fontstack}/{range}.pbf";
|
|
233
|
+
// export const DEFAULT_GLYPHS = "'https://geoserveis.icgc.cat/contextmaps/glyphs/{fontstack}/{range}.pbf';"
|
|
185
234
|
class Styles {
|
|
186
235
|
style = signal(MapStyles["streetmap"], ...(ngDevMode ? [{ debugName: "style" }] : []));
|
|
187
236
|
map;
|
|
@@ -254,7 +303,10 @@ class Styles {
|
|
|
254
303
|
const styleSpec = await response.json();
|
|
255
304
|
console.debug("Glyphs property:", styleSpec.glyphs);
|
|
256
305
|
if (!styleSpec.glyphs) {
|
|
257
|
-
styleSpec.glyphs =
|
|
306
|
+
styleSpec.glyphs = DEFAULT_GLYPHS;
|
|
307
|
+
}
|
|
308
|
+
if (styleData.postFetch) {
|
|
309
|
+
styleData.postFetch(styleSpec);
|
|
258
310
|
}
|
|
259
311
|
return styleSpec;
|
|
260
312
|
}
|
|
@@ -274,10 +326,13 @@ class Styles {
|
|
|
274
326
|
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
275
327
|
}
|
|
276
328
|
const styleSpec = await response.json();
|
|
329
|
+
if (styleData.postFetch) {
|
|
330
|
+
styleData.postFetch(styleSpec);
|
|
331
|
+
}
|
|
277
332
|
// Add Glyphs
|
|
278
333
|
console.debug("Glyphs property:", styleSpec.glyphs);
|
|
279
334
|
if (!styleSpec.glyphs) {
|
|
280
|
-
styleSpec.glyphs =
|
|
335
|
+
styleSpec.glyphs = DEFAULT_GLYPHS;
|
|
281
336
|
}
|
|
282
337
|
// Extract source and layer IDs
|
|
283
338
|
const sourceIds = Object.keys(styleSpec.sources || {});
|
|
@@ -454,6 +509,25 @@ const MapStyles = {
|
|
|
454
509
|
url: "https://geoserveis.icgc.cat/contextmaps/icgc_orto_hibrida.json",
|
|
455
510
|
image: "assets/mapag/src/assets/map_icgc_ortho_hybrid.png",
|
|
456
511
|
},
|
|
512
|
+
// "natgeo" : {
|
|
513
|
+
// name: "National Geographic",
|
|
514
|
+
// code: "natgeo",
|
|
515
|
+
// // url: "https://raw.githubusercontent.com/go2garret/maps/main/src/assets/json/natgeo.json",
|
|
516
|
+
// // url: "https://www.arcgis.com/sharing/rest/content/items/cdd1ca79ffc74237bd6f76e5d9803e2e/resources/styles/root.json",
|
|
517
|
+
// url :"https://basemaps.arcgis.com/arcgis/rest/services/World_Basemap_v2/VectorTileServer/resources/styles/root.json",
|
|
518
|
+
// image: "assets/mapag/src/assets/map_natgeo.png",
|
|
519
|
+
// postFetch: (styleJson: StyleSpecification ) => {
|
|
520
|
+
// styleJson.sprite = "https://basemaps.arcgis.com/arcgis/rest/services/World_Basemap_v2/VectorTileServer/resources/sprites/sprite"
|
|
521
|
+
// styleJson.sources["esri"] = {
|
|
522
|
+
// type: "vector",
|
|
523
|
+
// tiles: [
|
|
524
|
+
// "https://basemaps.arcgis.com/arcgis/rest/services/World_Basemap_v2/VectorTileServer/tile/{z}/{y}/{x}.pbf"
|
|
525
|
+
// ],
|
|
526
|
+
// minzoom: 0,
|
|
527
|
+
// maxzoom: 23
|
|
528
|
+
// }
|
|
529
|
+
// }
|
|
530
|
+
// }
|
|
457
531
|
};
|
|
458
532
|
|
|
459
533
|
class BasemapSelect {
|
|
@@ -14079,6 +14153,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.10", ngImpo
|
|
|
14079
14153
|
// Set up PMTiles protocol for MapLibre
|
|
14080
14154
|
const protocol = new Protocol();
|
|
14081
14155
|
maplibregl.addProtocol('pmtiles', protocol.tile);
|
|
14156
|
+
// maplibregl.addProtocol('pmtiles', protocol.add);
|
|
14082
14157
|
class MapComponent {
|
|
14083
14158
|
styles = new Styles();
|
|
14084
14159
|
zone = inject(NgZone);
|
|
@@ -14589,6 +14664,109 @@ class CensusTractMapper {
|
|
|
14589
14664
|
};
|
|
14590
14665
|
}
|
|
14591
14666
|
|
|
14667
|
+
class EsriMapper {
|
|
14668
|
+
jsonUrl = 'https://basemaps.arcgis.com/arcgis/rest/services/World_Basemap_v2/VectorTileServer/resources/styles/root.json';
|
|
14669
|
+
SOURCE_ID = 'esri';
|
|
14670
|
+
map = undefined;
|
|
14671
|
+
legends = undefined;
|
|
14672
|
+
count = 0;
|
|
14673
|
+
total = 0;
|
|
14674
|
+
current = [];
|
|
14675
|
+
settings = signal(new EsriSettings(), ...(ngDevMode ? [{ debugName: "settings" }] : []));
|
|
14676
|
+
constructor(settings) {
|
|
14677
|
+
if (settings) {
|
|
14678
|
+
this.settings.set({
|
|
14679
|
+
...this.settings(),
|
|
14680
|
+
...settings
|
|
14681
|
+
});
|
|
14682
|
+
}
|
|
14683
|
+
else {
|
|
14684
|
+
this.makeSettings();
|
|
14685
|
+
}
|
|
14686
|
+
const _ = effect(() => {
|
|
14687
|
+
const settings = this.settings();
|
|
14688
|
+
this._update(settings);
|
|
14689
|
+
}, ...(ngDevMode ? [{ debugName: "_" }] : []));
|
|
14690
|
+
}
|
|
14691
|
+
async makeSettings() {
|
|
14692
|
+
const settings = new EsriSettings();
|
|
14693
|
+
const data = await fetch(this.jsonUrl)
|
|
14694
|
+
.then(response => response.json());
|
|
14695
|
+
const accepted = [];
|
|
14696
|
+
const rawLawers = data.layers;
|
|
14697
|
+
for (const layer of rawLawers) {
|
|
14698
|
+
const l = layer;
|
|
14699
|
+
accepted.push(l);
|
|
14700
|
+
}
|
|
14701
|
+
settings.options = accepted;
|
|
14702
|
+
settings.layers = new Map();
|
|
14703
|
+
this.settings.set(settings);
|
|
14704
|
+
return settings;
|
|
14705
|
+
}
|
|
14706
|
+
update(settings) {
|
|
14707
|
+
this.settings.set({ ...this.settings(), ...settings });
|
|
14708
|
+
}
|
|
14709
|
+
_update(settings) {
|
|
14710
|
+
this.clear();
|
|
14711
|
+
for (const layerSpec of settings.layers.values()) {
|
|
14712
|
+
if (!this.map) {
|
|
14713
|
+
return;
|
|
14714
|
+
}
|
|
14715
|
+
const map = this.map;
|
|
14716
|
+
const layerId = layerSpec.id;
|
|
14717
|
+
if (map.getLayer(layerId)) {
|
|
14718
|
+
continue; // Layer already exists
|
|
14719
|
+
}
|
|
14720
|
+
try {
|
|
14721
|
+
map.addLayer(layerSpec);
|
|
14722
|
+
this.current.push(layerId);
|
|
14723
|
+
}
|
|
14724
|
+
catch (error) {
|
|
14725
|
+
console.error(`Failed to add layer ${layerId}:`, error);
|
|
14726
|
+
}
|
|
14727
|
+
}
|
|
14728
|
+
}
|
|
14729
|
+
onReady(map, svc) {
|
|
14730
|
+
this.map = map;
|
|
14731
|
+
map.addSource("esri", {
|
|
14732
|
+
type: "vector",
|
|
14733
|
+
tiles: [
|
|
14734
|
+
"https://basemaps.arcgis.com/arcgis/rest/services/World_Basemap_v2/VectorTileServer/tile/{z}/{y}/{x}.pbf"
|
|
14735
|
+
],
|
|
14736
|
+
minzoom: 0,
|
|
14737
|
+
maxzoom: 23
|
|
14738
|
+
});
|
|
14739
|
+
// map.addLayer({
|
|
14740
|
+
// id: "urban-area",
|
|
14741
|
+
// type: "fill",
|
|
14742
|
+
// source: "esri",
|
|
14743
|
+
// "source-layer": "Urban area", // must match the actual layer name in the vector tiles
|
|
14744
|
+
// minzoom: 5,
|
|
14745
|
+
// maxzoom: 12,
|
|
14746
|
+
// paint: {
|
|
14747
|
+
// "fill-color": "#8b1650",
|
|
14748
|
+
// "fill-opacity": 0.8
|
|
14749
|
+
// }
|
|
14750
|
+
// });
|
|
14751
|
+
// Additional setup if needed
|
|
14752
|
+
}
|
|
14753
|
+
clear() {
|
|
14754
|
+
for (const layerId of this.current) {
|
|
14755
|
+
if (this.map?.getLayer(layerId)) {
|
|
14756
|
+
this.map.removeLayer(layerId);
|
|
14757
|
+
}
|
|
14758
|
+
}
|
|
14759
|
+
this.current = [];
|
|
14760
|
+
}
|
|
14761
|
+
reset() {
|
|
14762
|
+
this.clear();
|
|
14763
|
+
}
|
|
14764
|
+
}
|
|
14765
|
+
class EsriSettings {
|
|
14766
|
+
options = [];
|
|
14767
|
+
layers = new Map();
|
|
14768
|
+
}
|
|
14769
|
+
|
|
14592
14770
|
class LayerSettings {
|
|
14593
14771
|
visible = true;
|
|
14594
14772
|
}
|
|
@@ -14813,6 +14991,134 @@ class HardinessSettings extends PolygonLayerSettings {
|
|
|
14813
14991
|
borderOpacity = 0;
|
|
14814
14992
|
}
|
|
14815
14993
|
|
|
14994
|
+
class NAASMapper {
|
|
14995
|
+
LAYER_ID = 'naas-layer';
|
|
14996
|
+
SOURCE_ID = 'naas-source';
|
|
14997
|
+
settings = signal(new NAASSettings(), ...(ngDevMode ? [{ debugName: "settings" }] : []));
|
|
14998
|
+
current = null;
|
|
14999
|
+
currentFeatureID = undefined;
|
|
15000
|
+
over = signal(null, ...(ngDevMode ? [{ debugName: "over" }] : []));
|
|
15001
|
+
map = undefined;
|
|
15002
|
+
legends;
|
|
15003
|
+
count = 0;
|
|
15004
|
+
total = 0;
|
|
15005
|
+
constructor(settings) {
|
|
15006
|
+
if (settings) {
|
|
15007
|
+
this.settings.set({
|
|
15008
|
+
...this.settings(),
|
|
15009
|
+
...settings
|
|
15010
|
+
});
|
|
15011
|
+
}
|
|
15012
|
+
const _ = effect(() => {
|
|
15013
|
+
const settings = this.settings();
|
|
15014
|
+
this._update(settings);
|
|
15015
|
+
}, ...(ngDevMode ? [{ debugName: "_" }] : []));
|
|
15016
|
+
}
|
|
15017
|
+
update(settings) {
|
|
15018
|
+
this.settings.set({ ...this.settings(), ...settings });
|
|
15019
|
+
}
|
|
15020
|
+
_update(settings) {
|
|
15021
|
+
if (!this.map) {
|
|
15022
|
+
return;
|
|
15023
|
+
}
|
|
15024
|
+
const map = this.map;
|
|
15025
|
+
if (settings.visible) {
|
|
15026
|
+
map.setLayoutProperty(this.LAYER_ID, 'visibility', 'visible');
|
|
15027
|
+
}
|
|
15028
|
+
else {
|
|
15029
|
+
map.setLayoutProperty(this.LAYER_ID, 'visibility', 'none');
|
|
15030
|
+
}
|
|
15031
|
+
}
|
|
15032
|
+
create() {
|
|
15033
|
+
if (!this.map) {
|
|
15034
|
+
return;
|
|
15035
|
+
}
|
|
15036
|
+
const map = this.map;
|
|
15037
|
+
AddSource(map, this.SOURCE_ID, {
|
|
15038
|
+
type: 'vector',
|
|
15039
|
+
url: 'mapbox://examples.8fgz4egr' // Example vector tile source
|
|
15040
|
+
});
|
|
15041
|
+
const addedFill = AddLayer(map, {
|
|
15042
|
+
id: this.LAYER_ID,
|
|
15043
|
+
source: this.SOURCE_ID,
|
|
15044
|
+
'source-layer': 'naas-data', // Example source layer
|
|
15045
|
+
type: 'fill',
|
|
15046
|
+
paint: {
|
|
15047
|
+
'fill-color': '#888888',
|
|
15048
|
+
'fill-opacity': 0.5
|
|
15049
|
+
}
|
|
15050
|
+
}, StandardLayersMapper.POLYGONS_BACKGROUND);
|
|
15051
|
+
this._update(this.settings());
|
|
15052
|
+
if (!addedFill) {
|
|
15053
|
+
console.error('Failed to add NAAS layer');
|
|
15054
|
+
}
|
|
15055
|
+
}
|
|
15056
|
+
onReady(map, svc) {
|
|
15057
|
+
}
|
|
15058
|
+
reset() {
|
|
15059
|
+
}
|
|
15060
|
+
clear() {
|
|
15061
|
+
}
|
|
15062
|
+
}
|
|
15063
|
+
class NAASSettings {
|
|
15064
|
+
url = '';
|
|
15065
|
+
visible = true;
|
|
15066
|
+
fillColor = '#0000ff';
|
|
15067
|
+
fillOpacity = 0.1;
|
|
15068
|
+
borderColor = '#01018b';
|
|
15069
|
+
borderWidth = 1;
|
|
15070
|
+
borderOpacity = 1.0;
|
|
15071
|
+
labelsVisible = true;
|
|
15072
|
+
labelsSize = 10;
|
|
15073
|
+
labelsColor = '#000000';
|
|
15074
|
+
labelsHaloColor = '#ffffff';
|
|
15075
|
+
labelsHaloWidth = 1;
|
|
15076
|
+
labelsOpacity = 1.0;
|
|
15077
|
+
labelOverlap = false;
|
|
15078
|
+
autoSelectLayer = false;
|
|
15079
|
+
}
|
|
15080
|
+
|
|
15081
|
+
class SimpleMapper {
|
|
15082
|
+
reset() {
|
|
15083
|
+
if (this.map) {
|
|
15084
|
+
// Remove existing layers and sources
|
|
15085
|
+
if (this.map.getLayer('esri-natgeo-layer')) {
|
|
15086
|
+
this.map.removeLayer('esri-natgeo-layer');
|
|
15087
|
+
}
|
|
15088
|
+
if (this.map.getSource('esri-natgeo')) {
|
|
15089
|
+
this.map.removeSource('esri-natgeo');
|
|
15090
|
+
}
|
|
15091
|
+
this.count = 0;
|
|
15092
|
+
this.total = 0;
|
|
15093
|
+
}
|
|
15094
|
+
}
|
|
15095
|
+
clear() {
|
|
15096
|
+
this.reset();
|
|
15097
|
+
}
|
|
15098
|
+
legends = undefined;
|
|
15099
|
+
count = 0;
|
|
15100
|
+
total = 0;
|
|
15101
|
+
// Implementation of a simple mapper
|
|
15102
|
+
map = undefined;
|
|
15103
|
+
onReady(map, svc) {
|
|
15104
|
+
this.map = map;
|
|
15105
|
+
map.addSource('esri-natgeo', {
|
|
15106
|
+
type: 'raster',
|
|
15107
|
+
tiles: [
|
|
15108
|
+
// 'https://services.arcgisonline.com/ArcGIS/rest/services/NatGeoStyleBase/MapServer/tile/{z}/{y}/{x}',
|
|
15109
|
+
'https://tiles.arcgis.com/tiles/P3ePLMYs2RVChkJx/arcgis/rest/services/NatGeoStyleBase/MapServer/tile/{z}/{y}/{x}',
|
|
15110
|
+
],
|
|
15111
|
+
tileSize: 256,
|
|
15112
|
+
});
|
|
15113
|
+
map.addLayer({
|
|
15114
|
+
id: 'esri-natgeo-layer',
|
|
15115
|
+
type: 'raster',
|
|
15116
|
+
source: 'esri-natgeo',
|
|
15117
|
+
});
|
|
15118
|
+
// Additional setup if needed
|
|
15119
|
+
}
|
|
15120
|
+
}
|
|
15121
|
+
|
|
14816
15122
|
class VectorTileServerMapper {
|
|
14817
15123
|
src;
|
|
14818
15124
|
legends;
|
|
@@ -15244,6 +15550,8 @@ class HttpBoundaryLoader {
|
|
|
15244
15550
|
/*
|
|
15245
15551
|
* Public API Surface of mapag
|
|
15246
15552
|
*/
|
|
15553
|
+
// export * from './lib/mappers/cropland-data-layer';
|
|
15554
|
+
// export * from './lib/models/census-blocks';
|
|
15247
15555
|
// export * from './lib/models/census-zipcodes';
|
|
15248
15556
|
// export * from './lib/models/census-counties';
|
|
15249
15557
|
// export * from './lib/models/census-states';
|
|
@@ -15255,5 +15563,5 @@ class HttpBoundaryLoader {
|
|
|
15255
15563
|
* Generated bundle index. Do not edit.
|
|
15256
15564
|
*/
|
|
15257
15565
|
|
|
15258
|
-
export { AddLayer, AddSource, AreaMapperMapper, BackgroundMaskMapper, BaseMapLight, BasemapSelect, BasemapSelectMenu, CensusTractMapper, DrawingMapper, HardinessMapper, HardinessSettings, HttpBoundaryLoader, MapAreaSelectComponent, MapComponent, MapSelectionService, MapService, MapStyles, MapboxMapperGroup, NoOpMapper, RemoveLayer, RemoveSource, SaveMap, SelectMode, StandardLayersMapper, Styles, VectorTileServerMapper, WatershedMapper, WatershedSettings, discoverLayers, isGeoloader, isMultiPolygon, isNumber2DArray, isNumber3DArray, isPolygon, mapboxLoadImages, mapboxloadImage, sampleTilesForLayers, simpleClone, toMultiPolygon, trySync };
|
|
15566
|
+
export { AddLayer, AddSource, AreaMapperMapper, BackgroundMaskMapper, BaseMapLight, BasemapSelect, BasemapSelectMenu, CensusTractMapper, DEFAULT_GLYPHS, DrawingMapper, EsriMapper, EsriSettings, HardinessMapper, HardinessSettings, HttpBoundaryLoader, MapAreaSelectComponent, MapComponent, MapSelectionService, MapService, MapStyles, MapboxMapperGroup, NAASMapper, NAASSettings, NoOpMapper, RemoveLayer, RemoveSource, SaveMap, SelectMode, SimpleMapper, StandardLayersMapper, Styles, VectorTileServerMapper, WatershedMapper, WatershedSettings, discoverLayers, isGeoloader, isMultiPolygon, isNumber2DArray, isNumber3DArray, isPolygon, mapboxLoadImages, mapboxloadImage, pmtilesPixelInfo, sampleTilesForLayers, simpleClone, toMultiPolygon, trySync };
|
|
15259
15567
|
//# sourceMappingURL=foodmarketmaker-mapag.mjs.map
|