Skip to main content

qualia_core_db/domains/geospatial/adapters/
canvas_defaults.rs

1use crate::domains::geospatial::adapters::wms_adapter::OgcServiceType;
2use crate::domains::geospatial::adapters::{
3    AdapterRegistry, AstrometryAdapter, CkanAdapter, IvoaTapAdapter, OsmAdapter, SparqlAdapter,
4    StacAdapter, WmsAdapter,
5};
6
7/// Registers all default geospatial, astronomical, and temporal endpoints into the canvas registry.
8pub fn register_canvas_defaults(registry: &mut AdapterRegistry) {
9    // --------------------------------------------------------------------------------
10    // 1. Astronomy & Space (IVOA TAP, SPARQL, Ephemeris)
11    // --------------------------------------------------------------------------------
12    registry.register_adapter(Box::new(IvoaTapAdapter::new(
13        "ivoa_tap_gaia",
14        "https://gea.esac.esa.int/tap-server/tap/sync",
15        "gaiadr3.gaia_source",
16    )));
17    registry.register_adapter(Box::new(IvoaTapAdapter::new(
18        "ivoa_tap_irsa",
19        "https://irsa.ipac.caltech.edu/TAP/sync",
20        "ipac",
21    )));
22    registry.register_adapter(Box::new(IvoaTapAdapter::new(
23        "ivoa_tap_vizier",
24        "http://tapvizier.cds.unistra.fr/TAPVizieR/tap/sync",
25        "vizier",
26    )));
27    registry.register_adapter(Box::new(IvoaTapAdapter::new(
28        "ivoa_tap_simbad",
29        "http://simbad.cds.unistra.fr/simbad/sim-tap/sync",
30        "simbad",
31    )));
32    registry.register_adapter(Box::new(IvoaTapAdapter::new(
33        "ivoa_tap_chandra",
34        "https://cda.cfa.harvard.edu/cxctap/sync",
35        "chandra",
36    )));
37    registry.register_adapter(Box::new(IvoaTapAdapter::new(
38        "ivoa_tap_csa",
39        "https://csa.esac.esa.int/csa/tap/sync",
40        "csa",
41    )));
42
43    registry.register_adapter(Box::new(SparqlAdapter::new(
44        "sparql_wikidata",
45        "https://query.wikidata.org/sparql",
46    )));
47    registry.register_adapter(Box::new(SparqlAdapter::new(
48        "sparql_eu_open_data",
49        "https://data.europa.eu/data/sparql",
50    )));
51
52    registry.register_adapter(Box::new(AstrometryAdapter::new(
53        "astrometry_jpl_horizons",
54        "https://ssd.jpl.nasa.gov/api/horizons.api",
55    )));
56    registry.register_adapter(Box::new(AstrometryAdapter::new(
57        "astrometry_neows",
58        "https://api.nasa.gov/neo/rest/v1/",
59    )));
60    registry.register_adapter(Box::new(AstrometryAdapter::new(
61        "astrometry_sdss_casjobs",
62        "https://skyserver.sdss.org/casjobs/services/api/",
63    )));
64    registry.register_adapter(Box::new(AstrometryAdapter::new(
65        "astrometry_mpc",
66        "https://minorplanetcenter.net/data",
67    )));
68
69    // --------------------------------------------------------------------------------
70    // 2. Earth Observation, Terrain, and Imagery (NASA GIBS, USGS, STAC)
71    // --------------------------------------------------------------------------------
72    registry.register_adapter(Box::new(WmsAdapter::new(
73        "wmts_nasa_gibs_epsg4326",
74        "https://gibs.earthdata.nasa.gov/wmts/epsg4326/best/wmts.cgi",
75        OgcServiceType::Wmts,
76    )));
77    registry.register_adapter(Box::new(WmsAdapter::new(
78        "wmts_nasa_gibs_epsg3857",
79        "https://gibs.earthdata.nasa.gov/wmts/epsg3857/best/wmts.cgi",
80        OgcServiceType::Wmts,
81    )));
82    registry.register_adapter(Box::new(WmsAdapter::new(
83        "wmts_nasa_gibs_epsg3413",
84        "https://gibs.earthdata.nasa.gov/wmts/epsg3413/best/wmts.cgi",
85        OgcServiceType::Wmts,
86    )));
87    registry.register_adapter(Box::new(WmsAdapter::new(
88        "wmts_nasa_gibs_epsg3031",
89        "https://gibs.earthdata.nasa.gov/wmts/epsg3031/best/wmts.cgi",
90        OgcServiceType::Wmts,
91    )));
92    registry.register_adapter(Box::new(WmsAdapter::new(
93        "wms_nasa_gibs",
94        "https://gibs.earthdata.nasa.gov/wms/epsg4326/best/wms.cgi",
95        OgcServiceType::Wms,
96    )));
97
98    registry.register_adapter(Box::new(WmsAdapter::new(
99        "wms_usgs_topo",
100        "https://basemap.nationalmap.gov/arcgis/services/USGSTopo/MapServer/WMSServer",
101        OgcServiceType::Wms,
102    )));
103    registry.register_adapter(Box::new(WmsAdapter::new(
104        "wms_usgs_imagery",
105        "https://imagery.nationalmap.gov/arcgis/services/USGSImageryOnly/MapServer/WMSServer",
106        OgcServiceType::Wms,
107    )));
108    registry.register_adapter(Box::new(WmsAdapter::new(
109        "wms_usgs_3dep",
110        "https://elevation.nationalmap.gov/arcgis/services/3DEPElevation/ImageServer/WMSServer",
111        OgcServiceType::Wms,
112    )));
113
114    registry.register_adapter(Box::new(StacAdapter::new(
115        "stac_usgs_landsatlook",
116        "https://landsatlook.usgs.gov/stac-server",
117        None,
118    )));
119    registry.register_adapter(Box::new(StacAdapter::new(
120        "stac_ms_planetary_computer",
121        "https://planetarycomputer.microsoft.com/api/stac/v1",
122        None,
123    )));
124    registry.register_adapter(Box::new(StacAdapter::new(
125        "stac_aws_earth_search",
126        "https://earth-search.aws.element84.com/v1",
127        None,
128    )));
129
130    // --------------------------------------------------------------------------------
131    // 3. Marine, Bathymetry & Oceanography (GEBCO, Copernicus, EMODnet, NOAA)
132    // --------------------------------------------------------------------------------
133    registry.register_adapter(Box::new(WmsAdapter::new(
134        "wms_gebco_global",
135        "https://wms.gebco.net/mapserv",
136        OgcServiceType::Wms,
137    )));
138    registry.register_adapter(Box::new(WmsAdapter::new(
139        "wms_gebco_north_polar",
140        "https://wms.gebco.net/latest/north-polar/mapserv",
141        OgcServiceType::Wms,
142    )));
143    registry.register_adapter(Box::new(WmsAdapter::new(
144        "wms_gebco_south_polar",
145        "https://wms.gebco.net/latest/south-polar/mapserv",
146        OgcServiceType::Wms,
147    )));
148    registry.register_adapter(Box::new(WmsAdapter::new(
149        "wmts_copernicus_marine",
150        "https://wmts.marine.copernicus.eu/teroWmts",
151        OgcServiceType::Wmts,
152    )));
153
154    registry.register_adapter(Box::new(WmsAdapter::new(
155        "wms_emodnet_seabed",
156        "https://ows.emodnet-seabedhabitats.eu/geoserver/emodnet_view/wms",
157        OgcServiceType::Wms,
158    )));
159    registry.register_adapter(Box::new(WmsAdapter::new(
160        "wms_emodnet_bathymetry",
161        "https://ows.emodnet-bathymetry.eu/wms",
162        OgcServiceType::Wms,
163    )));
164    registry.register_adapter(Box::new(WmsAdapter::new(
165        "wms_emodnet_biology",
166        "https://ows.emodnet-biology.eu/geoserver/wms",
167        OgcServiceType::Wms,
168    )));
169    registry.register_adapter(Box::new(WmsAdapter::new(
170        "wms_emodnet_physics",
171        "https://geoserver.emodnet-physics.eu/geoserver/wms",
172        OgcServiceType::Wms,
173    )));
174
175    registry.register_adapter(Box::new(AstrometryAdapter::new(
176        "rest_marine_regions_gazetteer",
177        "https://marineregions.org/rest/",
178    ))); // Using generic REST adapter
179    registry.register_adapter(Box::new(WmsAdapter::new(
180        "wms_noaa_coastal_dem",
181        "https://gis.ngdc.noaa.gov/arcgis/services/DEM_mosaics/DEM_all/ImageServer/WMSServer",
182        OgcServiceType::Wms,
183    )));
184    registry.register_adapter(Box::new(WmsAdapter::new(
185        "wms_noaa_trackline",
186        "https://gis.ngdc.noaa.gov/arcgis/services/trackline_geophysics/MapServer/WMSServer",
187        OgcServiceType::Wms,
188    )));
189
190    // --------------------------------------------------------------------------------
191    // 4. Extraterrestrial Planetary Mapping (USGS Astrogeology)
192    // --------------------------------------------------------------------------------
193    registry.register_adapter(Box::new(WmsAdapter::new(
194        "wms_astro_mars",
195        "https://planetarymaps.usgs.gov/cgi-bin/mapserv?map=/maps/mars/mars_simp_cyl.map",
196        OgcServiceType::Wms,
197    )));
198    registry.register_adapter(Box::new(WmsAdapter::new(
199        "wms_astro_moon",
200        "https://planetarymaps.usgs.gov/cgi-bin/mapserv?map=/maps/earth/moon_simp_cyl.map",
201        OgcServiceType::Wms,
202    )));
203    registry.register_adapter(Box::new(WmsAdapter::new(
204        "wms_astro_venus",
205        "https://planetarymaps.usgs.gov/cgi-bin/mapserv?map=/maps/venus/venus_simp_cyl.map",
206        OgcServiceType::Wms,
207    )));
208    registry.register_adapter(Box::new(WmsAdapter::new(
209        "wms_astro_mercury",
210        "https://planetarymaps.usgs.gov/cgi-bin/mapserv?map=/maps/mercury/mercury_simp_cyl.map",
211        OgcServiceType::Wms,
212    )));
213
214    // --------------------------------------------------------------------------------
215    // 5. Geoscience, Ecological & Socioeconomic (GA, EEA, GFW, SEDAC, UN)
216    // --------------------------------------------------------------------------------
217    registry.register_adapter(Box::new(WmsAdapter::new(
218        "wms_ga_geophysical",
219        "https://services.ga.gov.au/gis/geophysical-grids/ows",
220        OgcServiceType::Wms,
221    )));
222    registry.register_adapter(Box::new(WmsAdapter::new(
223        "wms_ga_rock_properties",
224        "http://www.ga.gov.au/geophysics-rockpropertypub-gws/ga_rock_properties_wms/ows",
225        OgcServiceType::Wms,
226    )));
227    registry.register_adapter(Box::new(WmsAdapter::new(
228        "wms_ga_earthquakes",
229        "https://earthquakes.ga.gov.au/geoserver/wms",
230        OgcServiceType::Wms,
231    )));
232    registry.register_adapter(Box::new(WmsAdapter::new(
233        "wms_eea_corine",
234        "https://discomap.eea.europa.eu/arcgis/services/Corine/CLC2018_WM/MapServer/WMSServer",
235        OgcServiceType::Wms,
236    )));
237    registry.register_adapter(Box::new(WmsAdapter::new(
238        "wms_opentopo",
239        "https://opentopo.sdsc.edu/geoserver/wms",
240        OgcServiceType::Wms,
241    )));
242    registry.register_adapter(Box::new(WmsAdapter::new(
243        "wms_sedac_gpw",
244        "https://sedac.ciesin.columbia.edu/geoserver/wms",
245        OgcServiceType::Wms,
246    )));
247
248    registry.register_adapter(Box::new(AstrometryAdapter::new(
249        "rest_gfw_api",
250        "https://data-api.globalforestwatch.org/",
251    )));
252    registry.register_adapter(Box::new(AstrometryAdapter::new(
253        "rest_opensensemap",
254        "https://api.opensensemap.org/boxes",
255    )));
256    registry.register_adapter(Box::new(AstrometryAdapter::new(
257        "rest_un_biodiversity",
258        "https://unbiodiversitylab.org/api/v1/",
259    )));
260
261    // --------------------------------------------------------------------------------
262    // 6. Weather, Air Traffic, and Mobility (Open-Meteo, OpenSky, OSRM, Transitland)
263    // --------------------------------------------------------------------------------
264    registry.register_adapter(Box::new(AstrometryAdapter::new(
265        "rest_open_meteo_forecast",
266        "https://api.open-meteo.com/v1/forecast",
267    )));
268    registry.register_adapter(Box::new(AstrometryAdapter::new(
269        "rest_open_meteo_archive",
270        "https://archive-api.open-meteo.com/v1/archive",
271    )));
272    registry.register_adapter(Box::new(AstrometryAdapter::new(
273        "rest_open_meteo_marine",
274        "https://marine-api.open-meteo.com/v1/marine",
275    )));
276    registry.register_adapter(Box::new(AstrometryAdapter::new(
277        "rest_nws_api",
278        "https://api.weather.gov/",
279    )));
280    registry.register_adapter(Box::new(AstrometryAdapter::new(
281        "rest_opensky_all",
282        "https://opensky-network.org/api/states/all",
283    )));
284    registry.register_adapter(Box::new(AstrometryAdapter::new(
285        "rest_aviationstack",
286        "http://api.aviationstack.com/v1/flights",
287    )));
288
289    registry.register_adapter(Box::new(AstrometryAdapter::new(
290        "rest_barentswatch_ais",
291        "https://historic.ais.barentswatch.no/v1/",
292    )));
293    registry.register_adapter(Box::new(AstrometryAdapter::new(
294        "rest_aishub",
295        "http://data.aishub.net/ws.php",
296    )));
297
298    registry.register_adapter(Box::new(AstrometryAdapter::new(
299        "rest_tomtom_incident",
300        "https://api.tomtom.com/traffic/services/5/incidentDetails",
301    )));
302    registry.register_adapter(Box::new(AstrometryAdapter::new(
303        "rest_tomtom_flow",
304        "https://api.tomtom.com/traffic/services/4/flowSegmentData",
305    )));
306    registry.register_adapter(Box::new(AstrometryAdapter::new(
307        "rest_osrm_routing",
308        "https://router.project-osrm.org/route/v1/driving/",
309    )));
310    registry.register_adapter(Box::new(AstrometryAdapter::new(
311        "rest_transitland_v2",
312        "https://transit.land/api/v2/rest/",
313    )));
314    registry.register_adapter(Box::new(AstrometryAdapter::new(
315        "rest_mobilitydata",
316        "https://database.mobilitydata.org/api/",
317    )));
318
319    // --------------------------------------------------------------------------------
320    // 7. OSM & General Web Map Tile Services
321    // --------------------------------------------------------------------------------
322    registry.register_adapter(Box::new(OsmAdapter::new(
323        "osm_default",
324        "https://overpass-api.de/api/interpreter",
325        "https://tile.openstreetmap.org",
326    )));
327
328    // --------------------------------------------------------------------------------
329    // 8. Australia - ABS ASGS, Geoscape, GA, and State Portals
330    // --------------------------------------------------------------------------------
331    // ABS ASGS REST APIs
332    registry.register_adapter(Box::new(AstrometryAdapter::new(
333        "rest_abs_lga_2024",
334        "https://geo.abs.gov.au/arcgis/rest/services/ASGS2024/LGA/MapServer",
335    )));
336    registry.register_adapter(Box::new(AstrometryAdapter::new(
337        "rest_abs_lga_2021",
338        "https://geo.abs.gov.au/arcgis/rest/services/ASGS2021/LGA/MapServer",
339    )));
340    registry.register_adapter(Box::new(AstrometryAdapter::new(
341        "rest_abs_sal_2021",
342        "https://geo.abs.gov.au/arcgis/rest/services/ASGS2021/SAL/MapServer",
343    )));
344    registry.register_adapter(Box::new(AstrometryAdapter::new(
345        "rest_abs_mb_2021",
346        "https://geo.abs.gov.au/arcgis/rest/services/ASGS2021/MB/MapServer",
347    )));
348    registry.register_adapter(Box::new(AstrometryAdapter::new(
349        "rest_abs_ced_2024",
350        "https://geo.abs.gov.au/arcgis/rest/services/ASGS2024/CED/MapServer",
351    )));
352    registry.register_adapter(Box::new(AstrometryAdapter::new(
353        "rest_abs_sed_2024",
354        "https://geo.abs.gov.au/arcgis/rest/services/ASGS2024/SED/MapServer",
355    )));
356
357    // Additional ASGS Statistical & Indigenous Boundaries
358    registry.register_adapter(Box::new(AstrometryAdapter::new(
359        "rest_abs_sa1_2021",
360        "https://geo.abs.gov.au/arcgis/rest/services/ASGS2021/SA1/MapServer",
361    )));
362    registry.register_adapter(Box::new(AstrometryAdapter::new(
363        "rest_abs_sa2_2021",
364        "https://geo.abs.gov.au/arcgis/rest/services/ASGS2021/SA2/MapServer",
365    )));
366    registry.register_adapter(Box::new(AstrometryAdapter::new(
367        "rest_abs_sa3_2021",
368        "https://geo.abs.gov.au/arcgis/rest/services/ASGS2021/SA3/MapServer",
369    )));
370    registry.register_adapter(Box::new(AstrometryAdapter::new(
371        "rest_abs_sa4_2021",
372        "https://geo.abs.gov.au/arcgis/rest/services/ASGS2021/SA4/MapServer",
373    )));
374    registry.register_adapter(Box::new(AstrometryAdapter::new(
375        "rest_abs_gccsa_2021",
376        "https://geo.abs.gov.au/arcgis/rest/services/ASGS2021/GCCSA/MapServer",
377    )));
378    registry.register_adapter(Box::new(AstrometryAdapter::new(
379        "rest_abs_ste_2021",
380        "https://geo.abs.gov.au/arcgis/rest/services/ASGS2021/STE/MapServer",
381    )));
382    registry.register_adapter(Box::new(AstrometryAdapter::new(
383        "rest_abs_aus_2021",
384        "https://geo.abs.gov.au/arcgis/rest/services/ASGS2021/AUS/MapServer",
385    )));
386    registry.register_adapter(Box::new(AstrometryAdapter::new(
387        "rest_abs_iloc_2021",
388        "https://geo.abs.gov.au/arcgis/rest/services/ASGS2021/ILOC/MapServer",
389    )));
390    registry.register_adapter(Box::new(AstrometryAdapter::new(
391        "rest_abs_iare_2021",
392        "https://geo.abs.gov.au/arcgis/rest/services/ASGS2021/IARE/MapServer",
393    )));
394    registry.register_adapter(Box::new(AstrometryAdapter::new(
395        "rest_abs_ireg_2021",
396        "https://geo.abs.gov.au/arcgis/rest/services/ASGS2021/IREG/MapServer",
397    )));
398    registry.register_adapter(Box::new(AstrometryAdapter::new(
399        "rest_abs_poa_2021",
400        "https://geo.abs.gov.au/arcgis/rest/services/ASGS2021/POA/MapServer",
401    )));
402    registry.register_adapter(Box::new(AstrometryAdapter::new(
403        "rest_abs_add_2021",
404        "https://geo.abs.gov.au/arcgis/rest/services/ASGS2021/ADD/MapServer",
405    )));
406    registry.register_adapter(Box::new(AstrometryAdapter::new(
407        "rest_abs_dzn_2021",
408        "https://geo.abs.gov.au/arcgis/rest/services/ASGS2021/DZN/MapServer",
409    )));
410    registry.register_adapter(Box::new(AstrometryAdapter::new(
411        "rest_abs_ra_2021",
412        "https://geo.abs.gov.au/arcgis/rest/services/ASGS2021/RA/MapServer",
413    )));
414    registry.register_adapter(Box::new(AstrometryAdapter::new(
415        "rest_abs_sos_2021",
416        "https://geo.abs.gov.au/arcgis/rest/services/ASGS2021/SOS/MapServer",
417    )));
418    registry.register_adapter(Box::new(AstrometryAdapter::new(
419        "rest_abs_sosr_2021",
420        "https://geo.abs.gov.au/arcgis/rest/services/ASGS2021/SOSR/MapServer",
421    )));
422    registry.register_adapter(Box::new(AstrometryAdapter::new(
423        "rest_abs_sua_2021",
424        "https://geo.abs.gov.au/arcgis/rest/services/ASGS2021/SUA/MapServer",
425    )));
426    registry.register_adapter(Box::new(AstrometryAdapter::new(
427        "rest_abs_tr_2021",
428        "https://geo.abs.gov.au/arcgis/rest/services/ASGS2021/TR/MapServer",
429    )));
430    registry.register_adapter(Box::new(AstrometryAdapter::new(
431        "rest_abs_ucl_2021",
432        "https://geo.abs.gov.au/arcgis/rest/services/ASGS2021/UCL/MapServer",
433    )));
434    registry.register_adapter(Box::new(AstrometryAdapter::new(
435        "rest_abs_nrmr_2021",
436        "https://geo.abs.gov.au/arcgis/rest/services/ASGS2021/NRMR/MapServer",
437    )));
438    registry.register_adapter(Box::new(AstrometryAdapter::new(
439        "rest_abs_lhn_2021",
440        "https://geo.abs.gov.au/arcgis/rest/services/ASGS2021/LHN/MapServer",
441    )));
442    registry.register_adapter(Box::new(AstrometryAdapter::new(
443        "rest_abs_phn_2021",
444        "https://geo.abs.gov.au/arcgis/rest/services/ASGS2021/PHN/MapServer",
445    )));
446
447    // Geoscape (CKAN Bulk Data)
448    registry.register_adapter(Box::new(AstrometryAdapter::new(
449        "rest_geoscape_admin_bounds",
450        "https://data.gov.au/data/api/3/action/package_show?id=geoscape-administrative-boundaries",
451    )));
452    registry.register_adapter(Box::new(AstrometryAdapter::new("rest_geoscape_gnaf", "https://data.gov.au/data/api/3/action/package_show?id=geocoded-national-address-file-g-naf")));
453    registry.register_adapter(Box::new(AstrometryAdapter::new(
454        "rest_aec_federal_electorates",
455        "https://data.gov.au/data/api/3/action/package_show?id=national-electoral-boundaries",
456    )));
457
458    // Geoscience Australia (WMS/WFS)
459    registry.register_adapter(Box::new(WmsAdapter::new(
460        "wms_ga_aus_land_borders",
461        "https://services.ga.gov.au/gis/services/AustraliasLandBorders/MapServer/WMSServer",
462        OgcServiceType::Wms,
463    )));
464    registry.register_adapter(Box::new(WmsAdapter::new("wms_ga_lga_council_offices", "http://services.ga.gov.au/gis/services/Local_Government_Area_Council_Offices/MapServer/WMSServer", OgcServiceType::Wms)));
465    registry.register_adapter(Box::new(WmsAdapter::new(
466        "wfs_ga_nexis_building_exposure",
467        "https://services.ga.gov.au/gis/services/NEXIS_Building_Exposure/MapServer/WFSServer",
468        OgcServiceType::Wfs,
469    )));
470
471    // State-Specific Portals
472    registry.register_adapter(Box::new(AstrometryAdapter::new(
473        "rest_nsw_spatial",
474        "https://portal.spatial.nsw.gov.au/client/services",
475    )));
476    registry.register_adapter(Box::new(AstrometryAdapter::new(
477        "rest_vicmap",
478        "https://services6.arcgis.com/GB33F62SbDxJjwEL/arcgis/rest/services",
479    )));
480    registry.register_adapter(Box::new(AstrometryAdapter::new(
481        "rest_qspatial",
482        "https://spatial-gis.information.qld.gov.au/arcgis/rest/services",
483    )));
484    registry.register_adapter(Box::new(AstrometryAdapter::new(
485        "rest_sa_location",
486        "https://lsa4.geohub.sa.gov.au/server/rest/services",
487    )));
488
489    // --------------------------------------------------------------------------------
490    // 9. Global Federated CKAN Portals
491    // --------------------------------------------------------------------------------
492    // National Portals
493    registry.register_adapter(Box::new(CkanAdapter::new(
494        "ckan_usa",
495        "https://catalog.data.gov/api/3",
496    )));
497    registry.register_adapter(Box::new(CkanAdapter::new(
498        "ckan_uk",
499        "https://data.gov.uk/api/3",
500    )));
501    registry.register_adapter(Box::new(CkanAdapter::new(
502        "ckan_aus",
503        "https://data.gov.au/data/api/3",
504    )));
505    registry.register_adapter(Box::new(CkanAdapter::new(
506        "ckan_can",
507        "https://open.canada.ca/data/api/3",
508    )));
509    registry.register_adapter(Box::new(CkanAdapter::new(
510        "ckan_brazil",
511        "https://dados.gov.br/api/3",
512    )));
513    registry.register_adapter(Box::new(CkanAdapter::new(
514        "ckan_singapore",
515        "https://data.gov.sg/api/3",
516    ))); // Note: data.gov.sg moved away from vanilla CKAN recently, but often retains compatibility.
517    registry.register_adapter(Box::new(CkanAdapter::new(
518        "ckan_ireland",
519        "https://data.gov.ie/api/3",
520    )));
521    registry.register_adapter(Box::new(CkanAdapter::new(
522        "ckan_germany",
523        "https://www.govdata.de/ckan/api/3",
524    )));
525    registry.register_adapter(Box::new(CkanAdapter::new(
526        "ckan_croatia",
527        "https://data.gov.hr/api/3",
528    )));
529    registry.register_adapter(Box::new(CkanAdapter::new(
530        "ckan_romania",
531        "https://data.gov.ro/api/3",
532    )));
533    registry.register_adapter(Box::new(CkanAdapter::new(
534        "ckan_finland",
535        "https://www.avoindata.fi/data/api/3",
536    )));
537    registry.register_adapter(Box::new(CkanAdapter::new(
538        "ckan_denmark",
539        "https://www.opendata.dk/api/3",
540    )));
541    registry.register_adapter(Box::new(CkanAdapter::new(
542        "ckan_austria",
543        "https://www.data.gv.at/katalog/api/3",
544    )));
545    registry.register_adapter(Box::new(CkanAdapter::new(
546        "ckan_sweden",
547        "https://admin.dataportal.se/api/3",
548    )));
549    registry.register_adapter(Box::new(CkanAdapter::new(
550        "ckan_mexico",
551        "https://datos.gob.mx/busca/api/3",
552    )));
553
554    // Regional/State Portals
555    registry.register_adapter(Box::new(CkanAdapter::new(
556        "ckan_qld",
557        "https://www.data.qld.gov.au/api/3",
558    )));
559    registry.register_adapter(Box::new(CkanAdapter::new(
560        "ckan_sa",
561        "https://data.sa.gov.au/data/api/3",
562    )));
563    registry.register_adapter(Box::new(CkanAdapter::new(
564        "ckan_nsw",
565        "https://data.nsw.gov.au/data/api/3",
566    )));
567    registry.register_adapter(Box::new(CkanAdapter::new(
568        "ckan_california",
569        "https://data.ca.gov/api/3",
570    )));
571    registry.register_adapter(Box::new(CkanAdapter::new(
572        "ckan_northern_ireland",
573        "https://opendatani.gov.uk/api/3",
574    )));
575    registry.register_adapter(Box::new(CkanAdapter::new(
576        "ckan_aragon",
577        "https://opendata.aragon.es/datos/api/3",
578    )));
579    registry.register_adapter(Box::new(CkanAdapter::new(
580        "ckan_asturias",
581        "https://datosabiertos.asturias.es/api/3",
582    )));
583    registry.register_adapter(Box::new(CkanAdapter::new(
584        "ckan_helsinki",
585        "https://hri.fi/data/api/3",
586    )));
587
588    // Municipal Portals
589    registry.register_adapter(Box::new(CkanAdapter::new(
590        "ckan_boston",
591        "https://data.boston.gov/api/3",
592    )));
593    registry.register_adapter(Box::new(CkanAdapter::new(
594        "ckan_amsterdam",
595        "https://data.amsterdam.nl/data/api/3",
596    )));
597    registry.register_adapter(Box::new(CkanAdapter::new(
598        "ckan_berlin",
599        "https://daten.berlin.de/api/3",
600    )));
601    registry.register_adapter(Box::new(CkanAdapter::new(
602        "ckan_cape_town",
603        "https://odp.capetown.gov.za/api/3",
604    )));
605    registry.register_adapter(Box::new(CkanAdapter::new(
606        "ckan_malmo",
607        "https://oppnadata.malmo.se/api/3",
608    )));
609    registry.register_adapter(Box::new(CkanAdapter::new(
610        "ckan_brisbane",
611        "https://www.data.brisbane.qld.gov.au/data/api/3",
612    )));
613    registry.register_adapter(Box::new(CkanAdapter::new(
614        "ckan_bari",
615        "https://opendata.comune.bari.it/api/3",
616    )));
617
618    // Supranational
619    registry.register_adapter(Box::new(CkanAdapter::new(
620        "ckan_eu",
621        "https://data.europa.eu/api/hub/search/",
622    )));
623    registry.register_adapter(Box::new(CkanAdapter::new(
624        "ckan_un_hdx",
625        "https://data.humdata.org/api/3",
626    )));
627    registry.register_adapter(Box::new(CkanAdapter::new(
628        "ckan_openafrica",
629        "https://openafrica.net/api/3",
630    )));
631}