@foodmarketmaker/mapag 0.0.15 → 0.0.17

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,632 @@ class CensusTractMapper {
14589
14664
  };
14590
14665
  }
14591
14666
 
14667
+ class CroplandDataLayerMapper {
14668
+ static PMTILES = 'pmtiles://https://foodmarketmaker-upload-data.s3.us-west-2.amazonaws.com/tiles/cdl_2024_30m.pmtiles';
14669
+ LAYER_ID = 'cropland-data-layer';
14670
+ SOURCE_ID = 'cropland-data-source';
14671
+ settings = signal(new CroplandDataLayerSettings(), ...(ngDevMode ? [{ debugName: "settings" }] : []));
14672
+ current = null;
14673
+ currentFeatureID = undefined;
14674
+ over = signal(null, ...(ngDevMode ? [{ debugName: "over" }] : []));
14675
+ legends = undefined;
14676
+ count = 0;
14677
+ total = 0;
14678
+ map;
14679
+ popup = null;
14680
+ constructor(settings) {
14681
+ if (settings) {
14682
+ this.settings.set({
14683
+ ...this.settings(),
14684
+ ...settings
14685
+ });
14686
+ }
14687
+ const _ = effect(() => {
14688
+ const settings = this.settings();
14689
+ this._update(settings);
14690
+ }, ...(ngDevMode ? [{ debugName: "_" }] : []));
14691
+ }
14692
+ update(settings) {
14693
+ this.settings.set({ ...this.settings(), ...settings });
14694
+ }
14695
+ _update(settings) {
14696
+ if (!this.map) {
14697
+ return;
14698
+ }
14699
+ const map = this.map;
14700
+ if (settings.visible) {
14701
+ map.setLayoutProperty(this.LAYER_ID, 'visibility', 'visible');
14702
+ this.legends = [this.toLegend()];
14703
+ }
14704
+ else {
14705
+ map.setLayoutProperty(this.LAYER_ID, 'visibility', 'none');
14706
+ this.legends = undefined;
14707
+ }
14708
+ }
14709
+ create() {
14710
+ if (!this.map) {
14711
+ return;
14712
+ }
14713
+ const map = this.map;
14714
+ console.log('Creating CDL raster source with URL:', CroplandDataLayerMapper.PMTILES);
14715
+ AddSource(map, this.SOURCE_ID, {
14716
+ type: 'raster',
14717
+ url: CroplandDataLayerMapper.PMTILES,
14718
+ tileSize: 256
14719
+ });
14720
+ const addedFill = AddLayer(map, {
14721
+ id: this.LAYER_ID,
14722
+ source: this.SOURCE_ID,
14723
+ type: 'raster',
14724
+ }, StandardLayersMapper.POLYGONS_BACKGROUND);
14725
+ this._update(this.settings());
14726
+ if (!addedFill) {
14727
+ return;
14728
+ }
14729
+ map.on('click', async (e) => {
14730
+ if (!this.settings().visible) {
14731
+ return;
14732
+ }
14733
+ const pixel = await pmtilesPixelInfo(CroplandDataLayerMapper.PMTILES, map, e);
14734
+ if (!pixel) {
14735
+ console.error('No pixel data returned');
14736
+ return;
14737
+ }
14738
+ const coordinates = e.lngLat;
14739
+ // Ensure that if the popup is already open, we don't create a new one
14740
+ if (this.popup) {
14741
+ this.popup.remove();
14742
+ }
14743
+ const r = pixel[0];
14744
+ const g = pixel[1];
14745
+ const b = pixel[2];
14746
+ const a = pixel[3];
14747
+ const hex = rgbToHex(r, g, b);
14748
+ const cropType = this.pixelToCropType(pixel);
14749
+ if (!cropType) {
14750
+ return;
14751
+ }
14752
+ let html = `
14753
+ <strong>Cropland Data Layer</strong>
14754
+ <hr />
14755
+ <br/>
14756
+ <div style="display: flex; align-items: center; margin-bottom: 8px;">
14757
+ <div style="width:20px; height:20px; background-color:${hex}; display:inline-block; margin-right:5px; border:1px solid #000;"></div>
14758
+ ${cropType.class}
14759
+ </div>
14760
+ Code: ${cropType.code}<br/>
14761
+ `;
14762
+ this.popup = new Popup({ maxWidth: '400px' })
14763
+ .setLngLat(coordinates)
14764
+ .setHTML(html)
14765
+ .addTo(map);
14766
+ });
14767
+ }
14768
+ async onReady(map, svc) {
14769
+ this.map = map;
14770
+ this.create();
14771
+ }
14772
+ reset() { }
14773
+ clear() {
14774
+ if (this.map) {
14775
+ this.map.removeLayer(this.LAYER_ID);
14776
+ this.map.removeSource(this.SOURCE_ID);
14777
+ }
14778
+ this.legends = undefined;
14779
+ }
14780
+ pixelToCropType(pixel) {
14781
+ const r = pixel[0];
14782
+ const g = pixel[1];
14783
+ const b = pixel[2];
14784
+ const hex = rgbToHex(r, g, b);
14785
+ if (!CroplandLegend) {
14786
+ return undefined;
14787
+ }
14788
+ const cropType = CroplandLegend.find(item => item.color.toLowerCase() === hex.toLowerCase());
14789
+ return cropType;
14790
+ }
14791
+ toLegend() {
14792
+ return {
14793
+ title: 'Cropland Data Layer',
14794
+ items: CroplandLegend.map(item => ({
14795
+ label: item.class,
14796
+ value: item.color
14797
+ }))
14798
+ };
14799
+ }
14800
+ }
14801
+ class CroplandDataLayerSettings {
14802
+ visible = true;
14803
+ }
14804
+ // Method 1: Using toString(16) and padStart
14805
+ const rgbToHex = (r, g, b) => {
14806
+ return '#' + [r, g, b].map(x => x.toString(16).padStart(2, '0')).join('');
14807
+ };
14808
+ const CroplandLegend = [
14809
+ { "code": 1, "class": "Corn", "color": "#ffd200" },
14810
+ { "code": 2, "class": "Cotton", "color": "#ff2424" },
14811
+ { "code": 3, "class": "Rice", "color": "#00a8e2" },
14812
+ { "code": 4, "class": "Sorghum", "color": "#ff9e09" },
14813
+ { "code": 5, "class": "Soybeans", "color": "#246e00" },
14814
+ { "code": 6, "class": "Sunflower", "color": "#ffff00" },
14815
+ { "code": 10, "class": "Peanuts", "color": "#6ea300" },
14816
+ { "code": 11, "class": "Tobacco", "color": "#00ad49" },
14817
+ { "code": 12, "class": "Sweet Corn", "color": "#dda309" },
14818
+ { "code": 13, "class": "Pop or Orn Corn", "color": "#dda309" },
14819
+ { "code": 14, "class": "Mint", "color": "#7cd2ff" },
14820
+ { "code": 21, "class": "Barley", "color": "#e0007a" },
14821
+ { "code": 22, "class": "Durum Wheat", "color": "#876052" },
14822
+ { "code": 23, "class": "Spring Wheat", "color": "#d6b56b" },
14823
+ { "code": 24, "class": "Winter Wheat", "color": "#a36e00" },
14824
+ { "code": 25, "class": "Other Small Grains", "color": "#d49eba" },
14825
+ { "code": 26, "class": "Dbl Crop WinWht/Soybeans", "color": "#6e6e00" },
14826
+ { "code": 27, "class": "Rye", "color": "#ac007a" },
14827
+ { "code": 28, "class": "Oats", "color": "#9f5787" },
14828
+ { "code": 29, "class": "Millet", "color": "#6e0047" },
14829
+ { "code": 30, "class": "Speltz", "color": "#d49eba" },
14830
+ { "code": 31, "class": "Canola", "color": "#d1ff00" },
14831
+ { "code": 32, "class": "Flaxseed", "color": "#7c99ff" },
14832
+ { "code": 33, "class": "Safflower", "color": "#d4d400" },
14833
+ { "code": 34, "class": "Rape Seed", "color": "#d1ff00" },
14834
+ { "code": 35, "class": "Mustard", "color": "#00ad49" },
14835
+ { "code": 36, "class": "Alfalfa", "color": "#ffa3e0" },
14836
+ { "code": 37, "class": "Other Hay/Non Alfalfa", "color": "#a3f08a" },
14837
+ { "code": 38, "class": "Camelina", "color": "#00ad49" },
14838
+ { "code": 39, "class": "Buckwheat", "color": "#d49eba" },
14839
+ { "code": 41, "class": "Sugarbeets", "color": "#a800e2" },
14840
+ { "code": 42, "class": "Dry Beans", "color": "#a30000" },
14841
+ { "code": 43, "class": "Potatoes", "color": "#6e2400" },
14842
+ { "code": 44, "class": "Other Crops", "color": "#00ad49" },
14843
+ { "code": 45, "class": "Sugarcane", "color": "#af7cff" },
14844
+ { "code": 46, "class": "Sweet Potatoes", "color": "#6e2400" },
14845
+ { "code": 47, "class": "Misc Vegs & Fruits", "color": "#ff6666" },
14846
+ { "code": 48, "class": "Watermelons", "color": "#ff6666" },
14847
+ { "code": 49, "class": "Onions", "color": "#ffcc66" },
14848
+ { "code": 50, "class": "Cucumbers", "color": "#ff6666" },
14849
+ { "code": 51, "class": "Chick Peas", "color": "#00ad49" },
14850
+ { "code": 52, "class": "Lentils", "color": "#00ddad" },
14851
+ { "code": 53, "class": "Peas", "color": "#52ff00" },
14852
+ { "code": 54, "class": "Tomatoes", "color": "#f0a177" },
14853
+ { "code": 55, "class": "Caneberries", "color": "#ff6666" },
14854
+ { "code": 56, "class": "Hops", "color": "#00ad49" },
14855
+ { "code": 57, "class": "Herbs", "color": "#7cd2ff" },
14856
+ { "code": 58, "class": "Clover/Wildflowers", "color": "#e8bdff" },
14857
+ { "code": 59, "class": "Sod/Grass Seed", "color": "#adffdd" },
14858
+ { "code": 60, "class": "Switchgrass", "color": "#00ad49" },
14859
+ { "code": 61, "class": "Fallow/Idle Cropland", "color": "#bdbd77" },
14860
+ { "code": 63, "class": "Forest", "color": "#92cc92" },
14861
+ { "code": 64, "class": "Shrubland", "color": "#c5d49e" },
14862
+ { "code": 65, "class": "Barren", "color": "#ccbda1" },
14863
+ { "code": 66, "class": "Cherries", "color": "#ff00ff" },
14864
+ { "code": 67, "class": "Peaches", "color": "#ff8eaa" },
14865
+ { "code": 68, "class": "Apples", "color": "#b8004f" },
14866
+ { "code": 69, "class": "Grapes", "color": "#6e4487" },
14867
+ { "code": 70, "class": "Christmas Trees", "color": "#007777" },
14868
+ { "code": 71, "class": "Other Tree Crops", "color": "#af9a6e" },
14869
+ { "code": 72, "class": "Citrus", "color": "#ffff7c" },
14870
+ { "code": 74, "class": "Pecans", "color": "#b56e5b" },
14871
+ { "code": 75, "class": "Almonds", "color": "#00a382" },
14872
+ { "code": 76, "class": "Walnuts", "color": "#e9d4ad" },
14873
+ { "code": 77, "class": "Pears", "color": "#af9a6e" },
14874
+ { "code": 81, "class": "Clouds/No Data", "color": "#f0f0f0" },
14875
+ { "code": 82, "class": "Developed", "color": "#9a9a9a" },
14876
+ { "code": 83, "class": "Water", "color": "#496ea1" },
14877
+ { "code": 87, "class": "Wetlands", "color": "#7cafaf" },
14878
+ { "code": 88, "class": "Nonag/Undefined", "color": "#e8ffbd" },
14879
+ { "code": 92, "class": "Aquaculture", "color": "#00ffff" },
14880
+ { "code": 111, "class": "Open Water", "color": "#496ea1" },
14881
+ { "code": 112, "class": "Perennial Ice/Snow", "color": "#d2e0f8" },
14882
+ { "code": 121, "class": "Developed/Open Space", "color": "#9a9a9a" },
14883
+ { "code": 122, "class": "Developed/Low Intensity", "color": "#9a9a9a" },
14884
+ { "code": 123, "class": "Developed/Med Intensity", "color": "#9a9a9a" },
14885
+ { "code": 124, "class": "Developed/High Intensity", "color": "#9a9a9a" },
14886
+ { "code": 131, "class": "Barren", "color": "#ccbda1" },
14887
+ { "code": 141, "class": "Deciduous Forest", "color": "#92cc92" },
14888
+ { "code": 142, "class": "Evergreen Forest", "color": "#92cc92" },
14889
+ { "code": 143, "class": "Mixed Forest", "color": "#92cc92" },
14890
+ { "code": 152, "class": "Shrubland", "color": "#c5d49e" },
14891
+ { "code": 176, "class": "Grassland/Pasture", "color": "#e8ffbd" },
14892
+ { "code": 190, "class": "Woody Wetlands", "color": "#7cafaf" },
14893
+ { "code": 195, "class": "Herbaceous Wetlands", "color": "#7cafaf" }
14894
+ ];
14895
+ /*
14896
+ https://www.nass.usda.gov/Research_and_Science/Cropland/metadata/metadata_CDL24_FGDC-STD-001-1998.htm
14897
+ https://www.nass.usda.gov/Research_and_Science/Cropland/docs/US_2024_CDL_legend.jpg
14898
+ gdalinfo ~/mmdata/download/2024_30m_cdls.tif | grep -A 200 "Color Table"
14899
+
14900
+
14901
+ Accuracy Assessment Summary for Cropland Data Layer 2024
14902
+
14903
+ Cover Attribute *Correct Producer's Omission User's Commission Cond'l
14904
+ Type Code Pixels Accuracy Error Kappa Accuracy Error Kappa
14905
+ ---- ---- ------ -------- ----- ----- -------- ----- -----
14906
+ Corn 1 926,684 92.6% 7.4% 0.923 92.3% 7.7% 0.919
14907
+ Cotton 2 118,322 85.2% 14.8% 0.852 86.2% 13.8% 0.861
14908
+ Rice 3 35,276 96.1% 3.9% 0.961 91.3% 8.7% 0.912
14909
+ Sorghum 4 60,299 79.9% 20.1% 0.799 69.8% 30.2% 0.697
14910
+ Soybeans 5 830,135 91.2% 8.8% 0.908 91.6% 8.4% 0.912
14911
+ Sunflower 6 7,181 82.8% 17.2% 0.828 82.8% 17.2% 0.828
14912
+ Peanuts 10 18,182 90.7% 9.3% 0.906 74.8% 25.2% 0.747
14913
+ Tobacco 11 329 37.9% 62.1% 0.379 70.3% 29.7% 0.703
14914
+ Sweet Corn 12 1,389 56.2% 43.8% 0.562 56.6% 43.4% 0.566
14915
+ Pop or Orn Corn 13 1,298 82.7% 17.3% 0.827 52.3% 47.7% 0.523
14916
+ Mint 14 402 82.5% 17.5% 0.825 76.9% 23.1% 0.769
14917
+ Barley 21 16,542 74.3% 25.7% 0.743 65.1% 34.9% 0.650
14918
+ Durum Wheat 22 16,332 72.0% 28.0% 0.720 62.6% 37.4% 0.625
14919
+ Spring Wheat 23 110,760 82.9% 17.1% 0.828 86.7% 13.3% 0.866
14920
+ Winter Wheat 24 204,900 87.1% 12.9% 0.869 81.1% 18.9% 0.809
14921
+ Other Small Grains 25 90 33.2% 66.8% 0.332 54.5% 45.5% 0.545
14922
+ Dbl Crop WinWht/Soybeans 26 36,376 78.4% 21.6% 0.783 81.6% 18.4% 0.815
14923
+ Rye 27 2,895 54.7% 45.3% 0.546 36.1% 63.9% 0.360
14924
+ Oats 28 6,701 57.3% 42.7% 0.573 36.2% 63.8% 0.362
14925
+ Millet 29 5,076 64.7% 35.3% 0.647 52.3% 47.7% 0.523
14926
+ Speltz 30 29 15.4% 84.6% 0.154 30.9% 69.1% 0.309
14927
+ Canola 31 28,077 93.8% 6.2% 0.938 89.1% 10.9% 0.891
14928
+ Flaxseed 32 1,003 61.2% 38.8% 0.612 51.4% 48.6% 0.514
14929
+ Safflower 33 1,363 75.4% 24.6% 0.754 77.2% 22.8% 0.772
14930
+ Rape Seed 34 25 25.5% 74.5% 0.255 50.0% 50.0% 0.500
14931
+ Mustard 35 1,657 82.9% 17.1% 0.829 73.3% 26.7% 0.733
14932
+ Alfalfa 36 88,352 79.6% 20.4% 0.795 60.3% 39.7% 0.601
14933
+ Other Hay/Non Alfalfa 37 13,256 46.8% 53.2% 0.464 8.3% 91.7% 0.082
14934
+ Camelina 38 165 44.6% 55.4% 0.446 39.0% 61.0% 0.390
14935
+ Buckwheat 39 311 57.9% 42.1% 0.579 71.0% 29.0% 0.710
14936
+ Sugarbeets 41 11,233 95.6% 4.4% 0.956 91.1% 8.9% 0.911
14937
+ Dry Beans 42 14,668 80.6% 19.4% 0.806 77.0% 23.0% 0.770
14938
+ Potatoes 43 8,489 89.7% 10.3% 0.897 87.1% 12.9% 0.871
14939
+ Other Crops 44 731 46.0% 54.0% 0.460 54.3% 45.7% 0.543
14940
+ Sugarcane 45 13,498 88.5% 11.5% 0.885 90.0% 10.0% 0.900
14941
+ Sweet Potatoes 46 935 83.8% 16.2% 0.838 77.6% 22.4% 0.776
14942
+ Misc Vegs & Fruits 47 62 9.8% 90.2% 0.098 24.5% 75.5% 0.245
14943
+ Watermelons 48 268 45.9% 54.1% 0.459 55.4% 44.6% 0.554
14944
+ Onions 49 923 70.1% 29.9% 0.701 76.8% 23.2% 0.768
14945
+ Cucumbers 50 306 56.5% 43.5% 0.565 68.0% 32.0% 0.680
14946
+ Chick Peas 51 5,280 77.7% 22.3% 0.777 81.7% 18.3% 0.817
14947
+ Lentils 52 10,012 82.2% 17.8% 0.822 77.6% 22.4% 0.776
14948
+ Peas 53 10,544 81.8% 18.2% 0.818 73.0% 27.0% 0.730
14949
+ Tomatoes 54 1,893 78.0% 22.0% 0.780 86.1% 13.9% 0.861
14950
+ Caneberries 55 62 51.2% 48.8% 0.512 49.2% 50.8% 0.492
14951
+ Hops 56 594 88.9% 11.1% 0.889 81.5% 18.5% 0.815
14952
+ Herbs 57 615 53.2% 46.8% 0.532 38.7% 61.3% 0.387
14953
+ Clover/Wildflowers 58 490 41.7% 58.3% 0.417 34.8% 65.2% 0.348
14954
+ Sod/Grass Seed 59 4,068 60.1% 39.9% 0.600 49.6% 50.4% 0.496
14955
+ Switchgrass 60 33 18.8% 81.3% 0.187 30.0% 70.0% 0.300
14956
+ Fallow/Idle Cropland 61 68,594 84.1% 15.9% 0.840 67.7% 32.3% 0.676
14957
+ Shrubland 64 18,064 72.3% 27.7% 0.723 49.2% 50.8% 0.492
14958
+ Cherries 66 805 52.9% 47.1% 0.529 47.0% 53.0% 0.470
14959
+ Peaches 67 597 45.5% 54.5% 0.455 48.4% 51.6% 0.484
14960
+ Apples 68 2,715 63.5% 36.5% 0.635 74.8% 25.2% 0.747
14961
+ Grapes 69 10,441 71.9% 28.1% 0.719 76.3% 23.7% 0.763
14962
+ Christmas Trees 70 68 9.7% 90.3% 0.097 14.3% 85.7% 0.143
14963
+ Other Tree Crops 71 275 30.8% 69.2% 0.308 44.0% 56.0% 0.440
14964
+ Citrus 72 3,974 58.5% 41.5% 0.585 75.1% 24.9% 0.751
14965
+ Pecans 74 2,706 76.6% 23.4% 0.766 49.9% 50.1% 0.499
14966
+ Almonds 75 23,975 86.3% 13.7% 0.863 86.5% 13.5% 0.865
14967
+ Walnuts 76 5,826 88.7% 11.3% 0.887 72.3% 27.7% 0.723
14968
+ Pears 77 293 56.0% 44.0% 0.560 52.6% 47.4% 0.526
14969
+ Aquaculture 92 4,555 85.3% 14.7% 0.853 80.7% 19.3% 0.807
14970
+ Pistachios 204 8,607 88.9% 11.1% 0.889 85.7% 14.3% 0.857
14971
+ Triticale 205 2,559 46.5% 53.5% 0.465 25.7% 74.3% 0.257
14972
+ Carrots 206 147 54.6% 45.4% 0.546 56.5% 43.5% 0.565
14973
+ Asparagus 207 17 34.0% 66.0% 0.340 54.8% 45.2% 0.548
14974
+ Garlic 208 144 66.4% 33.6% 0.664 76.6% 23.4% 0.766
14975
+ Cantaloupes 209 57 34.8% 65.2% 0.348 60.0% 40.0% 0.600
14976
+ Prunes 210 245 54.1% 45.9% 0.541 36.5% 63.5% 0.365
14977
+ Olives 211 479 73.6% 26.4% 0.736 45.7% 54.3% 0.457
14978
+ Oranges 212 3,617 61.0% 39.0% 0.610 58.5% 41.5% 0.585
14979
+ Honeydew Melons 213 2 10.5% 89.5% 0.105 11.1% 88.9% 0.111
14980
+ Broccoli 214 61 36.7% 63.3% 0.367 47.7% 52.3% 0.477
14981
+ Avocados 215 353 69.9% 30.1% 0.699 48.9% 51.1% 0.489
14982
+ Peppers 216 108 38.3% 61.7% 0.383 54.5% 45.5% 0.545
14983
+ Pomegranates 217 206 83.7% 16.3% 0.837 51.2% 48.8% 0.512
14984
+ Nectarines 218 1 5.3% 94.7% 0.053 14.3% 85.7% 0.143
14985
+ Greens 219 63 39.1% 60.9% 0.391 40.9% 59.1% 0.409
14986
+ Plums 220 20 14.6% 85.4% 0.146 5.7% 94.3% 0.057
14987
+ Strawberries 221 26 15.7% 84.3% 0.157 45.6% 54.4% 0.456
14988
+ Squash 222 51 24.4% 75.6% 0.244 45.1% 54.9% 0.451
14989
+ Apricots 223 5 7.5% 92.5% 0.075 6.2% 93.8% 0.062
14990
+ Vetch 224 64 57.7% 42.3% 0.577 59.8% 40.2% 0.598
14991
+ Dbl Crop WinWht/Corn 225 1,796 46.1% 53.9% 0.460 48.5% 51.5% 0.485
14992
+ Dbl Crop Oats/Corn 226 315 47.9% 52.1% 0.479 48.8% 51.2% 0.488
14993
+ Lettuce 227 97 41.6% 58.4% 0.416 27.1% 72.9% 0.271
14994
+ Dbl Crop Triticale/Corn 228 1,841 47.0% 53.0% 0.469 61.8% 38.2% 0.618
14995
+ Pumpkins 229 226 36.3% 63.7% 0.363 57.1% 42.9% 0.571
14996
+ Dbl Crop Lettuce/Durum Wht 230 0 0.0% 100.0% 0.000 n/a n/a n/a
14997
+ Dbl Crop Lettuce/Cantaloupe 231 56 48.7% 51.3% 0.487 90.3% 9.7% 0.903
14998
+ Dbl Crop Lettuce/Cotton 232 97 68.3% 31.7% 0.683 84.3% 15.7% 0.843
14999
+ Dbl Crop Lettuce/Barley 233 1 20.0% 80.0% 0.200 25.0% 75.0% 0.250
15000
+ Dbl Crop WinWht/Sorghum 236 1,725 56.4% 43.6% 0.564 33.3% 66.7% 0.333
15001
+ Dbl Crop Barley/Corn 237 187 39.0% 61.0% 0.390 57.9% 42.1% 0.579
15002
+ Dbl Crop WinWht/Cotton 238 407 32.9% 67.1% 0.329 18.2% 81.8% 0.182
15003
+ Dbl Crop Soybeans/Cotton 239 0 0.0% 100.0% 0.000 n/a n/a n/a
15004
+ Dbl Crop Soybeans/Oats 240 160 29.5% 70.5% 0.295 37.0% 63.0% 0.370
15005
+ Dbl Crop Corn/Soybeans 241 31 32.6% 67.4% 0.326 48.4% 51.6% 0.484
15006
+ Blueberries 242 368 45.4% 54.6% 0.454 39.1% 60.9% 0.391
15007
+ Cabbage 243 90 49.2% 50.8% 0.492 46.9% 53.1% 0.469
15008
+ Cauliflower 244 10 28.6% 71.4% 0.286 20.4% 79.6% 0.204
15009
+ Celery 245 6 14.3% 85.7% 0.143 25.0% 75.0% 0.250
15010
+ Radishes 246 28 46.7% 53.3% 0.467 50.9% 49.1% 0.509
15011
+ Turnips 247 19 38.8% 61.2% 0.388 48.7% 51.3% 0.487
15012
+ Eggplants 248 1 10.0% 90.0% 0.100 50.0% 50.0% 0.500
15013
+ Gourds 249 3 17.6% 82.4% 0.176 60.0% 40.0% 0.600
15014
+ Cranberries 250 18 17.6% 82.4% 0.176 69.2% 30.8% 0.692
15015
+ Dbl Crop Barley/Soybeans 254 433 47.5% 52.5% 0.475 63.0% 37.0% 0.630
15016
+
15017
+
15018
+ Raster
15019
+ Attribute Domain Values and Definitions: NO DATA, BACKGROUND 0
15020
+
15021
+ Categorization Code Land Cover
15022
+ "0" Background
15023
+
15024
+ Raster
15025
+ Attribute Domain Values and Definitions: CROPS 1-60
15026
+
15027
+ Categorization Code Land Cover
15028
+ "1" Corn
15029
+ "2" Cotton
15030
+ "3" Rice
15031
+ "4" Sorghum
15032
+ "5" Soybeans
15033
+ "6" Sunflower
15034
+ "10" Peanuts
15035
+ "11" Tobacco
15036
+ "12" Sweet Corn
15037
+ "13" Pop or Orn Corn
15038
+ "14" Mint
15039
+ "21" Barley
15040
+ "22" Durum Wheat
15041
+ "23" Spring Wheat
15042
+ "24" Winter Wheat
15043
+ "25" Other Small Grains
15044
+ "26" Dbl Crop WinWht/Soybeans
15045
+ "27" Rye
15046
+ "28" Oats
15047
+ "29" Millet
15048
+ "30" Speltz
15049
+ "31" Canola
15050
+ "32" Flaxseed
15051
+ "33" Safflower
15052
+ "34" Rape Seed
15053
+ "35" Mustard
15054
+ "36" Alfalfa
15055
+ "37" Other Hay/Non Alfalfa
15056
+ "38" Camelina
15057
+ "39" Buckwheat
15058
+ "41" Sugarbeets
15059
+ "42" Dry Beans
15060
+ "43" Potatoes
15061
+ "44" Other Crops
15062
+ "45" Sugarcane
15063
+ "46" Sweet Potatoes
15064
+ "47" Misc Vegs & Fruits
15065
+ "48" Watermelons
15066
+ "49" Onions
15067
+ "50" Cucumbers
15068
+ "51" Chick Peas
15069
+ "52" Lentils
15070
+ "53" Peas
15071
+ "54" Tomatoes
15072
+ "55" Caneberries
15073
+ "56" Hops
15074
+ "57" Herbs
15075
+ "58" Clover/Wildflowers
15076
+ "59" Sod/Grass Seed
15077
+ "60" Switchgrass
15078
+
15079
+ Raster
15080
+ Attribute Domain Values and Definitions: NON-CROP 61-65
15081
+
15082
+ Categorization Code Land Cover
15083
+ "61" Fallow/Idle Cropland
15084
+ "62" Pasture/Grass
15085
+ "63" Forest
15086
+ "64" Shrubland
15087
+ "65" Barren
15088
+
15089
+ Raster
15090
+ Attribute Domain Values and Definitions: CROPS 66-80
15091
+
15092
+ Categorization Code Land Cover
15093
+ "66" Cherries
15094
+ "67" Peaches
15095
+ "68" Apples
15096
+ "69" Grapes
15097
+ "70" Christmas Trees
15098
+ "71" Other Tree Crops
15099
+ "72" Citrus
15100
+ "74" Pecans
15101
+ "75" Almonds
15102
+ "76" Walnuts
15103
+ "77" Pears
15104
+
15105
+ Raster
15106
+ Attribute Domain Values and Definitions: OTHER 81-109
15107
+
15108
+ Categorization Code Land Cover
15109
+ "81" Clouds/No Data
15110
+ "82" Developed
15111
+ "83" Water
15112
+ "87" Wetlands
15113
+ "88" Nonag/Undefined
15114
+ "92" Aquaculture
15115
+
15116
+ Raster
15117
+ Attribute Domain Values and Definitions: NLCD-DERIVED CLASSES 110-195
15118
+
15119
+ Categorization Code Land Cover
15120
+ "111" Open Water
15121
+ "112" Perennial Ice/Snow
15122
+ "121" Developed/Open Space
15123
+ "122" Developed/Low Intensity
15124
+ "123" Developed/Med Intensity
15125
+ "124" Developed/High Intensity
15126
+ "131" Barren
15127
+ "141" Deciduous Forest
15128
+ "142" Evergreen Forest
15129
+ "143" Mixed Forest
15130
+ "152" Shrubland
15131
+ "176" Grassland/Pasture
15132
+ "190" Woody Wetlands
15133
+ "195" Herbaceous Wetlands
15134
+
15135
+ Raster
15136
+ Attribute Domain Values and Definitions: CROPS 195-255
15137
+
15138
+ Categorization Code Land Cover
15139
+ "204" Pistachios
15140
+ "205" Triticale
15141
+ "206" Carrots
15142
+ "207" Asparagus
15143
+ "208" Garlic
15144
+ "209" Cantaloupes
15145
+ "210" Prunes
15146
+ "211" Olives
15147
+ "212" Oranges
15148
+ "213" Honeydew Melons
15149
+ "214" Broccoli
15150
+ "215" Avocados
15151
+ "216" Peppers
15152
+ "217" Pomegranates
15153
+ "218" Nectarines
15154
+ "219" Greens
15155
+ "220" Plums
15156
+ "221" Strawberries
15157
+ "222" Squash
15158
+ "223" Apricots
15159
+ "224" Vetch
15160
+ "225" Dbl Crop WinWht/Corn
15161
+ "226" Dbl Crop Oats/Corn
15162
+ "227" Lettuce
15163
+ "228" Dbl Crop Triticale/Corn
15164
+ "229" Pumpkins
15165
+ "230" Dbl Crop Lettuce/Durum Wht
15166
+ "231" Dbl Crop Lettuce/Cantaloupe
15167
+ "232" Dbl Crop Lettuce/Cotton
15168
+ "233" Dbl Crop Lettuce/Barley
15169
+ "234" Dbl Crop Durum Wht/Sorghum
15170
+ "235" Dbl Crop Barley/Sorghum
15171
+ "236" Dbl Crop WinWht/Sorghum
15172
+ "237" Dbl Crop Barley/Corn
15173
+ "238" Dbl Crop WinWht/Cotton
15174
+ "239" Dbl Crop Soybeans/Cotton
15175
+ "240" Dbl Crop Soybeans/Oats
15176
+ "241" Dbl Crop Corn/Soybeans
15177
+ "242" Blueberries
15178
+ "243" Cabbage
15179
+ "244" Cauliflower
15180
+ "245" Celery
15181
+ "246" Radishes
15182
+ "247" Turnips
15183
+ "248" Eggplants
15184
+ "249" Gourds
15185
+ "250" Cranberries
15186
+ "254" Dbl Crop Barley/Soybeans
15187
+
15188
+ */
15189
+
15190
+ class EsriMapper {
15191
+ jsonUrl = 'https://basemaps.arcgis.com/arcgis/rest/services/World_Basemap_v2/VectorTileServer/resources/styles/root.json';
15192
+ SOURCE_ID = 'esri';
15193
+ map = undefined;
15194
+ legends = undefined;
15195
+ count = 0;
15196
+ total = 0;
15197
+ current = [];
15198
+ settings = signal(new EsriSettings(), ...(ngDevMode ? [{ debugName: "settings" }] : []));
15199
+ constructor(settings) {
15200
+ if (settings) {
15201
+ this.settings.set({
15202
+ ...this.settings(),
15203
+ ...settings
15204
+ });
15205
+ }
15206
+ else {
15207
+ this.makeSettings();
15208
+ }
15209
+ const _ = effect(() => {
15210
+ const settings = this.settings();
15211
+ this._update(settings);
15212
+ }, ...(ngDevMode ? [{ debugName: "_" }] : []));
15213
+ }
15214
+ async makeSettings() {
15215
+ const settings = new EsriSettings();
15216
+ const data = await fetch(this.jsonUrl)
15217
+ .then(response => response.json());
15218
+ const accepted = [];
15219
+ const rawLawers = data.layers;
15220
+ for (const layer of rawLawers) {
15221
+ const l = layer;
15222
+ accepted.push(l);
15223
+ }
15224
+ settings.options = accepted;
15225
+ settings.layers = new Map();
15226
+ this.settings.set(settings);
15227
+ return settings;
15228
+ }
15229
+ update(settings) {
15230
+ this.settings.set({ ...this.settings(), ...settings });
15231
+ }
15232
+ _update(settings) {
15233
+ this.clear();
15234
+ for (const layerSpec of settings.layers.values()) {
15235
+ if (!this.map) {
15236
+ return;
15237
+ }
15238
+ const map = this.map;
15239
+ const layerId = layerSpec.id;
15240
+ if (map.getLayer(layerId)) {
15241
+ continue; // Layer already exists
15242
+ }
15243
+ try {
15244
+ map.addLayer(layerSpec);
15245
+ this.current.push(layerId);
15246
+ }
15247
+ catch (error) {
15248
+ console.error(`Failed to add layer ${layerId}:`, error);
15249
+ }
15250
+ }
15251
+ }
15252
+ onReady(map, svc) {
15253
+ this.map = map;
15254
+ map.addSource("esri", {
15255
+ type: "vector",
15256
+ tiles: [
15257
+ "https://basemaps.arcgis.com/arcgis/rest/services/World_Basemap_v2/VectorTileServer/tile/{z}/{y}/{x}.pbf"
15258
+ ],
15259
+ minzoom: 0,
15260
+ maxzoom: 23
15261
+ });
15262
+ // map.addLayer({
15263
+ // id: "urban-area",
15264
+ // type: "fill",
15265
+ // source: "esri",
15266
+ // "source-layer": "Urban area", // must match the actual layer name in the vector tiles
15267
+ // minzoom: 5,
15268
+ // maxzoom: 12,
15269
+ // paint: {
15270
+ // "fill-color": "#8b1650",
15271
+ // "fill-opacity": 0.8
15272
+ // }
15273
+ // });
15274
+ // Additional setup if needed
15275
+ }
15276
+ clear() {
15277
+ for (const layerId of this.current) {
15278
+ if (this.map?.getLayer(layerId)) {
15279
+ this.map.removeLayer(layerId);
15280
+ }
15281
+ }
15282
+ this.current = [];
15283
+ }
15284
+ reset() {
15285
+ this.clear();
15286
+ }
15287
+ }
15288
+ class EsriSettings {
15289
+ options = [];
15290
+ layers = new Map();
15291
+ }
15292
+
14592
15293
  class LayerSettings {
14593
15294
  visible = true;
14594
15295
  }
@@ -14813,6 +15514,134 @@ class HardinessSettings extends PolygonLayerSettings {
14813
15514
  borderOpacity = 0;
14814
15515
  }
14815
15516
 
15517
+ class NAASMapper {
15518
+ LAYER_ID = 'naas-layer';
15519
+ SOURCE_ID = 'naas-source';
15520
+ settings = signal(new NAASSettings(), ...(ngDevMode ? [{ debugName: "settings" }] : []));
15521
+ current = null;
15522
+ currentFeatureID = undefined;
15523
+ over = signal(null, ...(ngDevMode ? [{ debugName: "over" }] : []));
15524
+ map = undefined;
15525
+ legends;
15526
+ count = 0;
15527
+ total = 0;
15528
+ constructor(settings) {
15529
+ if (settings) {
15530
+ this.settings.set({
15531
+ ...this.settings(),
15532
+ ...settings
15533
+ });
15534
+ }
15535
+ const _ = effect(() => {
15536
+ const settings = this.settings();
15537
+ this._update(settings);
15538
+ }, ...(ngDevMode ? [{ debugName: "_" }] : []));
15539
+ }
15540
+ update(settings) {
15541
+ this.settings.set({ ...this.settings(), ...settings });
15542
+ }
15543
+ _update(settings) {
15544
+ if (!this.map) {
15545
+ return;
15546
+ }
15547
+ const map = this.map;
15548
+ if (settings.visible) {
15549
+ map.setLayoutProperty(this.LAYER_ID, 'visibility', 'visible');
15550
+ }
15551
+ else {
15552
+ map.setLayoutProperty(this.LAYER_ID, 'visibility', 'none');
15553
+ }
15554
+ }
15555
+ create() {
15556
+ if (!this.map) {
15557
+ return;
15558
+ }
15559
+ const map = this.map;
15560
+ AddSource(map, this.SOURCE_ID, {
15561
+ type: 'vector',
15562
+ url: 'mapbox://examples.8fgz4egr' // Example vector tile source
15563
+ });
15564
+ const addedFill = AddLayer(map, {
15565
+ id: this.LAYER_ID,
15566
+ source: this.SOURCE_ID,
15567
+ 'source-layer': 'naas-data', // Example source layer
15568
+ type: 'fill',
15569
+ paint: {
15570
+ 'fill-color': '#888888',
15571
+ 'fill-opacity': 0.5
15572
+ }
15573
+ }, StandardLayersMapper.POLYGONS_BACKGROUND);
15574
+ this._update(this.settings());
15575
+ if (!addedFill) {
15576
+ console.error('Failed to add NAAS layer');
15577
+ }
15578
+ }
15579
+ onReady(map, svc) {
15580
+ }
15581
+ reset() {
15582
+ }
15583
+ clear() {
15584
+ }
15585
+ }
15586
+ class NAASSettings {
15587
+ url = '';
15588
+ visible = true;
15589
+ fillColor = '#0000ff';
15590
+ fillOpacity = 0.1;
15591
+ borderColor = '#01018b';
15592
+ borderWidth = 1;
15593
+ borderOpacity = 1.0;
15594
+ labelsVisible = true;
15595
+ labelsSize = 10;
15596
+ labelsColor = '#000000';
15597
+ labelsHaloColor = '#ffffff';
15598
+ labelsHaloWidth = 1;
15599
+ labelsOpacity = 1.0;
15600
+ labelOverlap = false;
15601
+ autoSelectLayer = false;
15602
+ }
15603
+
15604
+ class SimpleMapper {
15605
+ reset() {
15606
+ if (this.map) {
15607
+ // Remove existing layers and sources
15608
+ if (this.map.getLayer('esri-natgeo-layer')) {
15609
+ this.map.removeLayer('esri-natgeo-layer');
15610
+ }
15611
+ if (this.map.getSource('esri-natgeo')) {
15612
+ this.map.removeSource('esri-natgeo');
15613
+ }
15614
+ this.count = 0;
15615
+ this.total = 0;
15616
+ }
15617
+ }
15618
+ clear() {
15619
+ this.reset();
15620
+ }
15621
+ legends = undefined;
15622
+ count = 0;
15623
+ total = 0;
15624
+ // Implementation of a simple mapper
15625
+ map = undefined;
15626
+ onReady(map, svc) {
15627
+ this.map = map;
15628
+ map.addSource('esri-natgeo', {
15629
+ type: 'raster',
15630
+ tiles: [
15631
+ // 'https://services.arcgisonline.com/ArcGIS/rest/services/NatGeoStyleBase/MapServer/tile/{z}/{y}/{x}',
15632
+ 'https://tiles.arcgis.com/tiles/P3ePLMYs2RVChkJx/arcgis/rest/services/NatGeoStyleBase/MapServer/tile/{z}/{y}/{x}',
15633
+ ],
15634
+ tileSize: 256,
15635
+ });
15636
+ map.addLayer({
15637
+ id: 'esri-natgeo-layer',
15638
+ type: 'raster',
15639
+ source: 'esri-natgeo',
15640
+ });
15641
+ // Additional setup if needed
15642
+ }
15643
+ }
15644
+
14816
15645
  class VectorTileServerMapper {
14817
15646
  src;
14818
15647
  legends;
@@ -15244,6 +16073,8 @@ class HttpBoundaryLoader {
15244
16073
  /*
15245
16074
  * Public API Surface of mapag
15246
16075
  */
16076
+ // export * from './lib/mappers/cropland-data-layer';
16077
+ // export * from './lib/models/census-blocks';
15247
16078
  // export * from './lib/models/census-zipcodes';
15248
16079
  // export * from './lib/models/census-counties';
15249
16080
  // export * from './lib/models/census-states';
@@ -15255,5 +16086,5 @@ class HttpBoundaryLoader {
15255
16086
  * Generated bundle index. Do not edit.
15256
16087
  */
15257
16088
 
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 };
16089
+ export { AddLayer, AddSource, AreaMapperMapper, BackgroundMaskMapper, BaseMapLight, BasemapSelect, BasemapSelectMenu, CensusTractMapper, CroplandDataLayerMapper, CroplandDataLayerSettings, CroplandLegend, 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
16090
  //# sourceMappingURL=foodmarketmaker-mapag.mjs.map