@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 = 'https://geoserveis.icgc.cat/contextmaps/glyphs/{fontstack}/{range}.pbf';
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 = 'https://geoserveis.icgc.cat/contextmaps/glyphs/{fontstack}/{range}.pbf';
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