diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..997504b --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# SCM syntax highlighting & preventing 3-way merges +pixi.lock merge=binary linguist-language=YAML linguist-generated=true -diff diff --git a/.gitignore b/.gitignore index 57e45bf..777c1ce 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,9 @@ .Ruserdata .idea data/ -.vscode \ No newline at end of file +.vscode + +# pixi environments +.pixi/* +!.pixi/config.toml + diff --git a/PythonRaster.Rproj b/PythonRaster.Rproj deleted file mode 100644 index 6e89df4..0000000 --- a/PythonRaster.Rproj +++ /dev/null @@ -1,14 +0,0 @@ -Version: 1.0 -ProjectId: 6f37064d-cb1d-4997-b801-2c896d818fd6 - -RestoreWorkspace: Default -SaveWorkspace: Default -AlwaysSaveHistory: Default - -EnableCodeIndexing: Yes -UseSpacesForTab: Yes -NumSpacesForTab: 2 -Encoding: UTF-8 - -RnwWeave: Sweave -LaTeX: pdfLaTeX diff --git a/_quarto.yml b/_quarto.yml new file mode 100644 index 0000000..60e9412 --- /dev/null +++ b/_quarto.yml @@ -0,0 +1,7 @@ +# _quarto.yml +project: + type: website + output-dir: _site + +website: + title: "Python Raster" \ No newline at end of file diff --git a/env.yaml b/env.yaml deleted file mode 100644 index 61cafc7..0000000 --- a/env.yaml +++ /dev/null @@ -1,14 +0,0 @@ -name: raster -dependencies: - - python - - numpy - - matplotlib - - spyder - - owslib - - gdal - - geopandas - - rasterio - - rasterstats - - affine - - osmnx - - pysits \ No newline at end of file diff --git a/index.html b/index.html index cd17c56..dfa313c 100644 --- a/index.html +++ b/index.html @@ -1,759 +1,34 @@ - - - - - + - - - - - Raster data handling with Python - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - + - -
-
-
- - +
+ +
- -

Jan Verbesselt, Jorge Mendes de Jesus, -Aldo Bergsma, Dainius Masiliunas, David Swinkels, Judith Verstegen, -Corné Vreugdenhil, Arno Timmer

-

2025-09-05

- - - - -
- -

WUR -Geoscripting -WUR logo

-
+
+
+
+ + + +
+ +
+
Author
+
+

Jan Verbesselt, Jorge Mendes de Jesus, Aldo Bergsma, Dainius Masiliunas, David Swinkels, Judith Verstegen, Corné Vreugdenhil, Arno Timmer

+
+
+ +
+
Published
+
+

September 16, 2026

+
+
+ + +
+ + + +
+ + +

WUR Geoscripting

+

Raster data handling with Python

-
-

Introduction

-

Today we will work with Python packages for spatial raster analysis. -Python has some dedicated packages to handle rasters:

+
+

Introduction

+

Today we will work with Python packages for spatial raster analysis. Python has some dedicated packages to handle rasters:

    -
  • OWSLib allows us -to download geospatial raster data from Web Coverage Services
  • -
  • GDAL is -powerful library for reading, writing and warping raster datasets
  • -
  • Rasterio -reads and writes geospatial raster data
  • -
  • rasterstats -summarizes geospatial raster datasets based on vector geometries
  • -
  • NumPy is fundamental package for -scientific computing, such as array (thus raster) calculations
  • +
  • OWSLib allows us to download geospatial raster data from Web Coverage Services
  • +
  • GDAL is powerful library for reading, writing and warping raster datasets
  • +
  • Rasterio reads and writes geospatial raster data
  • +
  • rasterstats summarizes geospatial raster datasets based on vector geometries
  • +
  • NumPy is fundamental package for scientific computing, such as array (thus raster) calculations
-
-
-

Learning objectives

+
+
+

Learning objectives

    -
  • Be able to read spatial raster formats from web services and -files
  • +
  • Be able to read spatial raster data from web services and files
  • Be able to write spatial raster formats to disk
  • -
  • Know how to apply basic operations on raster data, such as -arithmetics
  • +
  • Know how to apply basic operations on raster data, such as arithmetics
  • Be able to plot spatial raster data with Matplotlib
+
+
+

Setting up the Python Environment

+

Like in the previous tutorials, we will create a pixi environment. Do this by creating a directory for this tutorial, copying the following text in a pixi.toml file and run pixi install.

+
[workspace]
+authors = ["Arno Timmer <arno.timmer@wur.nl>"]
+channels = ["conda-forge"]
+name = "raster"
+platforms = ["linux-64"]
+version = "0.1.0"
+
+[tasks]
+
+[dependencies]
+python = "*"
+numpy = "*"
+matplotlib = "*"
+owslib = "*"
+gdal = "*"
+geopandas = "*"
+rasterio = "*"
+rasterstats = "*"
+affine = "*"
+osmnx = "*"
+ipykernel = "*"
+

Create the necessary directories for this tutorial (for this we use the nifty Pathlib package, the standard path handling library in python! ):

+
+
from pathlib import Path
+
+base = Path.home() # This references the location of your script
+(base / "data").mkdir(exist_ok=True)
+(base / "output").mkdir(exist_ok=True)
-
-

Setting up the Python Environment

-

Make a directory structure for this tutorial:

-
cd ~/Documents/
-mkdir PythonRaster #or give the directory a name to your liking
-cd ./PythonRaster
-mkdir data
-mkdir output
-

Like in the previous tutorials, we will create a conda environment -with a .yaml file:

-
name: raster
-dependencies:
-  - python
-  - numpy
-  - matplotlib
-  - spyder
-  - owslib
-  - gdal
-  - geopandas
-  - rasterio
-  - rasterstats
-  - affine
-  - osmnx
-

After creation, activate the environment, open Spyder, create a -script in the root directory, and start coding.

+

From now on, if you see the format combining strings and variables together with /’s like: base / 'some_dir_name', it is Pathlib based path handling.

+

Use this directory for the rest of this tutorial.

+
+ +
+

Reading raster data and accessing metadata

+

There are many ways to work with raster data, you have been introduced to some in R and bash. in Python we can do similar things, often using the same underlying software (gdal for example).

+

Before we will look into how to deal with local files and data processing, we will introduce web services and will show you how to access and store remote (online hosted) data locally. This is useful, because we can rely on the owner of the data (governments for example) updating the data, making our analysis pipelines making use of up to date data. Think about a yearly update of some dataset, where the source data is renewed ‘automagically’ each year.

+

Conveniently, the data that we will acces and store locally, will be used throughout this tutorial to introduce libraries that can be used for reading, writing and processing raster data in Python.

+

Lastly, we will look a more recent development in the area of analyzing (sometimes very large and multidimensional) remotely stored raster datasets.

+
+
+
+
+
+Warning
-
-

Reading raster data and accessing metadata

-

There are numerous way to access raster data in Python. In fact, most -of these methods are not limited to python, in R you can use similar -implementations just as well. The other way around, from some of the -methods introduced earlier there are also python implementation. And -there are a lot more ways, we can’t cover everything…

-
-

From a Web Coverage Service

-

A Web Coverage Service (WCS) loads raster data in a similar way as -Web Feature Services (WFS) load vector data. Web Coverage Services are a -standard by the Open Geospatial Consortium and allow the downloading of -geospatial raster data with multiple types of format encoding: GeoTIFF, -netCDF, JPEG2000 etc. A Web -Map Service [WMS] also exists for rasters; it allows downloading of -images but without the data values.

-

Today we will work with elevation rasters. More specifically, we will -have a look at the WCS of the AHN dataset. AHN stands for “Actueel -Hoogtebestand Nederland” and is a Digital Elevation Model [DEM] that -covers the Netherlands. Access the web coverage service to have a look -at the contents:

-
from owslib.wcs import WebCoverageService
-
-# Access the WCS by proving the url and optional arguments
-wcs = WebCoverageService('https://service.pdok.nl/rws/ahn/wcs/v1_0?SERVICE=WCS&request=GetCapabilities', version='1.0.0')
-
-# Print to check the contents of the WCS
-print(list(wcs.contents))
-

Running the last line of code shows that the Web Coverage Service of -the AHN3 contains two rasters: 0.5m DSM, and 0.5m DTM. Raster data of -AHN has the projected coordinate system -RD_New (EPSG: 28992).

-

We can also check what types of operations are available for this -WCS:

-
# Get all operations and print the name of each of them
-print([op.name for op in wcs.operations])
-

You will see that the Web Coverage Service allows accessing the data -(GetCoverage), the metadata (DescribeCoverage), and the capabilities -(GetCapabilities). These are all standard protocols defined by the -OGC.

-

Several functions are available to access specific metadata of each -individual raster, for example:

-
# Take the 0.5m DSM as an example
-cvg = wcs.contents['dsm_05m']
-
-# Print supported reference systems, the bounding box defined in WGS 84 coordinates, and supported file formats
-print(cvg.supportedCRS)
-print(cvg.boundingBoxWGS84)
-print(cvg.supportedFormats)
-

Let us have a look at the data itself. As we do not want to overload -the web service, we download once and store the data locally.

-

Download the Digital Surface Model [DSM], which is the the ‘dsm_05m’ -version, and Digital Terrain Model [DTM], which is the ‘dtm_05m’ -version, to a local file. The difference between a DEM, DSM and DTM is -explained on the GIS -StackExchange.

-
import os
-
-# Define a bounding box in the available crs (see before) by picking a point and drawing a 1x1 km box around it
-x, y = 174100, 444100
-bbox = (x - 500, y - 500, x + 500, y + 500)
-
-# Request the DSM data from the WCS
-response = wcs.getCoverage(identifier='dsm_05m', bbox=bbox, format='GEOTIFF',
-                           crs='urn:ogc:def:crs:EPSG::28992', resx=0.5, resy=0.5)
-
-# Write the data to a local file in the 'data' directory
-with open('data/AHN3_05m_DSM.tif', 'wb') as file:
-    file.write(response.read())
-
-# Do the same for the DTM
-response = wcs.getCoverage(identifier='dtm_05m', bbox=bbox, format='GEOTIFF',
-                           crs='urn:ogc:def:crs:EPSG::28992', resx=0.5, resy=0.5)
-
-with open('data/AHN3_05m_DTM.tif', 'wb') as file:
-    file.write(response.read())
-

Before continuing, please check if this step was successful -(Hint: you can check if files have been written into corresponding -directory).

-
-

From a file with GDAL

-

GDAL is the fundament under most -spatial operations, reading and writing and a lot more. GDAL is a C++ -library that can handle raster and vector geospatial data formats. There -are APIs to access GDAL functionality in Python, but also in Java, R and -C. When opening a raster file in GDAL, the object has a hierarchical -structure starting at the Dataset level. A Dataset has a Geotransform -(metadata) and can contain one or more Bands. Each Band has a Data array -and potentially Overviews.

-
-
-gdal structure -
-GDAL class structure, adapted from Garrard, 2016, Geoprocessing with -Python. -
-
+
+

TODO: revise this argument Check if intro still covers material in qmd.

+
+
+
+

From a Web Coverage Service

+

A Web Coverage Service (WCS) loads raster data in a similar way as Web Feature Services (WFS) load vector data. Web Coverage Services are a standard by the Open Geospatial Consortium and allow the downloading of geospatial raster data with multiple types of format encoding: GeoTIFF, netCDF, JPEG2000 etc. A Web Map Service [WMS] is another dataservice for raster data. An important difference between them is that a WCS serves the raw raster data (such as elevation in meters for Digital Elevation Models), and a WMS serves visualizations of data, for example a nice elevation basemap with 3 bands for Red Green and Blue (RGB) instad of the raw data.

+

Today we will work with elevation rasters. More specifically, we will have a look at the WCS of the AHN dataset. AHN stands for “Actueel Hoogtebestand Nederland” and is a Digital Elevation Model [DEM] that covers the Netherlands. Access the web coverage service to have a look at the contents. For this we will use OWSLib:

+
+
from owslib.wcs import WebCoverageService
+
+# Access the WCS by proving the url and optional arguments
+wcs = WebCoverageService('https://service.pdok.nl/rws/ahn/wcs/v1_0?SERVICE=WCS&request=GetCapabilities', version='1.0.0')
+
+# Print to check the contents of the WCS
+print(list(wcs.contents))
+
+
['dsm_05m', 'dtm_05m']
+
+
+

Running the last line of code shows that the Web Coverage Service of the AHN3 contains two rasters with the identifiers dtm_05m and dsm_05m, corresponding to a 0.5m resolution DSM, and 0.5m resolution DTM. Raster data of AHN has the projected coordinate system RD_New (EPSG: 28992). The difference between a DEM, DSM and DTM is explained in thie question on GIS StackExchange (Thanks @underdark!.

+

We can also check what types of operations are available for this WCS:

+
+
# Get all operations and print the name of each of them
+print([op.name for op in wcs.operations])
+
+
['GetCapabilities', 'DescribeCoverage', 'GetCoverage']
+
+
+

You will see that the Web Coverage Service allows accessing the data (GetCoverage), the metadata (DescribeCoverage), and the capabilities (GetCapabilities). These are all standard protocols defined by the OGC.

+

Several functions are available to access specific metadata of each individual raster, for example:

+
+
# Take the 0.5m DSM as an example
+cvg = wcs.contents['dsm_05m']
+
+# Print supported reference systems, the bounding box defined in WGS 84 coordinates, and supported file formats
+print(f'Available CRS options: {cvg.supportedCRS}')
+
+
Available CRS options: [urn:ogc:def:crs:EPSG::28992, urn:ogc:def:crs:EPSG::28992]
+
+
print(f'Bounding box is WGS84: {cvg.boundingBoxWGS84}')
+
+
Bounding box is WGS84: (3.20030320333955, 50.728765211722, 7.273444085294, 53.555958411015)
+
+
print(f'Supported formats: {cvg.supportedFormats}')
+
+
Supported formats: ['GEOTIFF']
+
+
+

Let us have a look at the data itself. Calling the GetCoverage function will send a request fo the server where the data is stored and download the data. As we do not want to overload the web service, we call this function once, download the data and store it locally.

+

Download the Digital Surface Model [DSM], which we can acces through the ‘dsm_05m’ identifier, and Digital Terrain Model [DTM], which is the ‘dtm_05m’ version, to a local file.

+
+
# Define a bounding box in the available crs (see before) by picking a point and drawing a 1x1 km box around it
+x, y = 174100, 444100
+bbox = (x - 500, y - 500, x + 500, y + 500)
+
+# Request the DSM data from the WCS
+response = wcs.getCoverage(identifier='dsm_05m', bbox=bbox, format='GEOTIFF',
+                           crs='urn:ogc:def:crs:EPSG::28992', resx=0.5, resy=0.5)
+
+# Write the data to a local file in the 'data' directory
+with open(base / 'data/AHN3_05m_DSM.tif', 'wb') as file:
+    file.write(response.read())
+
+
10172750
+
+
# Do the same for the DTM
+response = wcs.getCoverage(identifier='dtm_05m', bbox=bbox, format='GEOTIFF',
+                           crs='urn:ogc:def:crs:EPSG::28992', resx=0.5, resy=0.5)
+
+with open(base / 'data/AHN3_05m_DTM.tif', 'wb') as file:
+    file.write(response.read())
+
+
8276816
+
+
+

That’s a very short introduction to webservices and accessing with Python. The datasets that you now stored locally we will use in the rest of the tutorial. Before continuing, please check if these steps were successful (Check if files have been written into corresponding directory).

+
+
+

From a file with GDAL

+

GDAL is the fundament under most spatial operations, reading and writing data and a lot more. GDAL is a C++ library that can handle raster and vector geospatial data formats. There are APIs to access GDAL functionality in Python, but also in Java, R and C. When opening a raster file in GDAL, the object has a hierarchical structure starting at the Dataset level. A Dataset has a Geotransform (metadata) and can contain one or more Bands. Each Band has a Data array and potentially Overviews.

+
+
+

gdal structure

+
GDAL class structure, adapted from Garrard, 2016, Geoprocessing with Python.
-

As you can see handling spatial data with GDAL can become a bit -confusing. But since it is so fundamental it is good to get familiar -with the basics of GDAL. Luckily there are packages that build upon GDAL -that make life a bit easier, but they all use GDAL under the hood. More -on those packages later, first let’s have a look at opening geotiff in -GDAL.

-

Let us open the file we just saved. You will see you first get the -dataset (even though there is only one), before the data array can be -accessed.

-
from osgeo import gdal
-
-# Open dataset, gdal automatically selects the correct driver
-ds = gdal.Open("data/AHN3_05m_DSM.tif" )
-
-# Get the band (band number 1)
-band = ds.GetRasterBand(1)
-
-# Get the data array
-data = band.ReadAsArray()
-print(data)
-
-# Delete objects to close the file
-ds = None
-
-
-Question 1: Why do we set ds to None at the end of your -script? What may happen if you do not do that? +
+

As you can see handling spatial data with GDAL can become a bit confusing. But since it is so fundamental it is good to get familiar with the very basics of GDAL. Luckily there are packages that build upon GDAL that make life a bit easier, but they all use GDAL under the hood. More on those packages later, first let’s have a look at opening geotiff in GDAL.

+

Let us open the file we just saved. You will see you first get the dataset (even though there is only one), before the data array can be accessed.

+
+
from osgeo import gdal
+
+# Open dataset, gdal automatically selects the correct driver
+ds = gdal.Open(base / "data/AHN3_05m_DSM.tif" )
+
+# Get the band (band number 1)
+band = ds.GetRasterBand(1)
+
+# Get the data array
+data = band.ReadAsArray()
+print(data)
+
+# Delete objects to close the file
+ds = None
+
+
+
+
+ +
+
+Question 1: What happening with ds = None at the end of your script? Is it important? What may happen if you do not do that?
Click for answer -Keeping files open may leave you vulnerable to losing data, (Geo)Pandas -manage resources under the hood so you don’t explicitly need to close -files, but for the case of GDAL, and as you will later see, Rasterio, -it’s important to close your files or open them with a context manager -with open … +Setting ds to None, makes python forget the dataset, closing the dataset, its a C thing. Keeping files open may leave you vulnerable to losing data, (Geo)Pandas manages resources under the hood so you don't explicitly need to close files, but for the case of GDAL, and as you will later see, Rasterio, it's important to close your files. Another way to handle this is using contexts, for this we would open them with a context managerwith open …`. More on that later.
-
-
-

From a file with Rasterio

-

Rasterio -reads and writes multiple raster formats based on GDAL, provides raster -processing functions based on NumPy arrays and GeoJSON, and integrates -Matplotlib in the module rasterio.plot for -visualization.

-

The rest of the tutorial below is a complete route of handling a -raster dataset. We will use the DEMs from a the WCS for our study area, -handle it with Rasterio, calculate new information (CHM), overlay it -with vector data representing buildings and visualize it.

-

Let us read in the raster data we just stored from the WCS with -Rasterio and plot it with rasterio.plot:

-
import rasterio
-from rasterio.plot import show
-import matplotlib.pyplot as plt
-
-# Open the two rasters 
-dsm = rasterio.open("data/AHN3_05m_DSM.tif", driver="GTiff")
-dtm = rasterio.open("data/AHN3_05m_DTM.tif", driver="GTiff")
-
-# Metadata functions from Rasterio
-print(dsm.meta)
-print(dtm.meta)
-
-# Plot with rasterio.plot, which provides Matplotlib functionality
-plt.figure(figsize=(5, 5), dpi=300)  # adjust size and resolution
-show(dsm, title='Digital Surface Model', cmap='gist_ncar')
-

Water pixels of the Netherlands

-
-
-Question 2: Adjust the code above to take a look at the -DTM. Note the gaps that appear. What are these gaps? +
+
+
+

From a file with Rasterio

+

GDAL can be tricky to work with but it allows for a lot of flexibility. There are tools that build upon GDAL, making integration with other software more intuitive. One of them is Raterio. As Rasterio explains on their website, the goal of Rasterio is to the standard geospatial abstraction library that can use modern ppython features, and frees users from C related pitfalls. It allows to read and write the same raster formats as GDAL can, provides raster processing functions, and can be integrated with other packages using NumPy and GeoJSON, and allows for easy visualization based upon MatPlotLib.

+

The rest of the tutorial below is a complete route of handling a raster dataset. We will use the DEMs from a the WCS for our study area, handle it with Rasterio, calculate new information (CHM), overlay it with vector data representing buildings and visualize it. Let us read in the raster data we just stored from the WCS with Rasterio and plot it with rasterio.plot:

+
+
import rasterio
+from rasterio.plot import show
+import matplotlib.pyplot as plt
+
+# Open the two rasters 
+dsm = rasterio.open(base / "data/AHN3_05m_DSM.tif", driver="GTiff")
+dtm = rasterio.open(base / "data/AHN3_05m_DTM.tif", driver="GTiff")
+
+# Metadata functions from Rasterio
+print(dsm.meta)
+
+
{'driver': 'GTiff', 'dtype': 'float32', 'nodata': 3.4028234663852886e+38, 'width': 2000, 'height': 2000, 'count': 1, 'crs': CRS.from_wkt('PROJCS["Amersfoort / RD New",GEOGCS["Amersfoort",DATUM["Amersfoort",SPHEROID["Bessel 1841",6377397.155,299.1528128,AUTHORITY["EPSG","7004"]],AUTHORITY["EPSG","6289"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4289"]],PROJECTION["Oblique_Stereographic"],PARAMETER["latitude_of_origin",52.1561605555556],PARAMETER["central_meridian",5.38763888888889],PARAMETER["scale_factor",0.9999079],PARAMETER["false_easting",155000],PARAMETER["false_northing",463000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","28992"]]'), 'transform': Affine(0.5, 0.0, 173600.0,
+       0.0, -0.5, 444600.0)}
+
+
print(dtm.meta)
+
+
{'driver': 'GTiff', 'dtype': 'float32', 'nodata': 3.4028234663852886e+38, 'width': 2000, 'height': 2000, 'count': 1, 'crs': CRS.from_wkt('PROJCS["Amersfoort / RD New",GEOGCS["Amersfoort",DATUM["Amersfoort",SPHEROID["Bessel 1841",6377397.155,299.1528128,AUTHORITY["EPSG","7004"]],AUTHORITY["EPSG","6289"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4289"]],PROJECTION["Oblique_Stereographic"],PARAMETER["latitude_of_origin",52.1561605555556],PARAMETER["central_meridian",5.38763888888889],PARAMETER["scale_factor",0.9999079],PARAMETER["false_easting",155000],PARAMETER["false_northing",463000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","28992"]]'), 'transform': Affine(0.5, 0.0, 173600.0,
+       0.0, -0.5, 444600.0)}
+
+
# Plot with rasterio.plot, which provides Matplotlib functionality
+plt.figure(figsize=(5, 5), dpi=300)  # adjust size and resolution
+show(dsm, title='Digital Surface Model', cmap='gist_ncar')
+
+
+
+

+
+
+
+
+
+
+
+ +
+
+Question 2: Adjust the code above to take a look at the DTM. Note the gaps that appear. What are these gaps?
Click for answer These are buildings.
-
-

The metadata shows the driver, datatype, nodata value, width of -raster in number of cells, height of raster in number of cells, number -of raster bands in the dataset, coordinate reference system, and -transformation values.

-

In the back-end, raster layers in Rasterio are stored as NumPy -arrays, which appear when the data are read with the method -.read():

-
# Rasterio object
-print(type(dsm))
-
-# Read, show object type and data
-dsm_data = dsm.read(1)
-print(type(dsm_data))
-print(dsm_data)
-
-

STAC

-

In the examples above, we have looked at single images or relatively -small areas. In the past years the amount of data that we are capturing -has been growing. Websvervices are not suitable for sharing very large -quantities of multimodal or multidimensional data. Searching and -accessing these volumes of data can be done using the Spatial Temporal -Asset Catalogue (STAC).

-

This is a very short, and very incomplete description of what STAC is -and how to use it. For a more elaborate tutorial visit the dedicated STAC tutorial.

-

STAC is a standard with a strong community working on enabling easier -acces to data about our planet. It provides a standardized structure for -accessing spatiotemporal datasets. The starting point is usually a STAC -catalog, for example https://stac.ecodatacube.eu/. -This website is a visual representation of a catalog.json -file, that can be accessed by clicking on the source button in the top -right. It is possible to search the catalog programatically, and is -discussed in the STAC -Tutorial. An alternative is to browse through the viewer and find -relevant datasets there.

-

A STAC catalog consists of a links to collections, -items or other catalogs. A STAC collection is a collection of -STAC items with similar traits. For example https://s3.ecodatacube.eu/arco/stac/oc_iso.10694.1995.mg.cm3/collection.json -(that can be found through the ecodatacube catalog). This collection, is -a collection of STAC items regarding the soil organic carbon density -(SOCD). In this case it links to datasets at different depths, at -different timeframes.

-

Generally these separate datasets can be found by a url stored in the -items. These urls point, in the case of raster data, to a Cloud -Optimized GeoTiff (COG). This is a Tiff file as we know it, it also ends -at .tiff, but it contains some indexing and other metadata -that makes the file searchable remotely instead of having to download -the entire file before being able to for example mask a part of it.

-
import rasterio
-from rasterio.mask import mask
-from shapely import box
-import matplotlib.pyplot as plt
-
-# Define a bounding box in the available crs (see before) by picking a point and drawing a 1x1 km box around it
-bbox = box( 4021321,3213709,  4028479, 3217978) # In EPSG:3035 - same as raster
-
-# get url from item asset link
-asset_url = 'https://s3.ecodatacube.eu/arco/ndvi_glad.landsat.ard2.seasconv.m.yearly_p25_30m_s_20220101_20221231_eu_epsg.3035_v20231127.tif'
-
-# open raster directly from S3 (requires rasterio with HTTP enabled, which is default)
-with rasterio.open(asset_url) as src:
-    # crop the raster with the polygon
-    out_image, out_transform = mask(src, [bbox], crop=True)
-
-# plot the cropped raster
-plt.imshow(out_image[0], cmap="viridis")
-plt.title("Cropped raster over Wageningen")
-plt.colorbar(label="Value")
-plt.show()
+

The metadata shows the driver, datatype, nodata value, width of raster in number of cells, height of raster in number of cells, number of raster bands in the dataset, coordinate reference system, and transformation values.

+

Rasterio allows us to access the data values in a raster as NumPy arrays. We can use the .read() method to access these:

+
+
# Rasterio object
+print(type(dsm))
+
+# Read, show object type and data
+dsm_data = dsm.read(1)
+print(type(dsm_data))
+print(dsm_data)
-
+

NumPy is a very common Python Library providing support for large, multi-dimensional arrays and fast mathematical operations. Because it is so common, other libraries will be able to read NumPy arrays. This makes it possible to read raster data into other libraries, such as the machine learning in scikit-learn.

+
+
+

Processing raster data

-

Now that we have some options to read data into python, let’s have a -look at what we can do with it.

-
-

Creating a Canopy Height Model

-

A Canopy Height Model (CHM) gives an indication of the height of -trees and/or buildings. It can be created by subtracting a Digital -Terrain Model from a Digital Surface Model. In the resulting raster, -each cell value represents the height above the underlying surface -topography.

-
import numpy as np
-
-# Access the data from the two rasters
-dsm_data = dsm.read()
-dtm_data = dtm.read()
-
-# Set our nodata to np.nan (this is important for later)
-dsm_data[dsm_data == dsm.nodata] = np.nan
-dtm_data[dtm_data == dtm.nodata] = np.nan
-

Earlier, we noticed that the DTM included gaps. Let’s first fill -these gaps using the fillnodata() function from -rasterio.fill. For more information, see the documentation.

-
from rasterio.fill import fillnodata
-
-# Create a mask to specify which pixels to fill (0=fill, 1=do not fill)
-dtm_mask = dtm_data.copy()
-dtm_mask[~np.isnan(dtm_data)] = 1
-dtm_mask[np.isnan(dtm_data)] = 0
-
-# Fill missing values
-dtm_data = fillnodata(dtm_data, mask=dtm_mask)
+

Now that we have some options to read data into python, let’s have a look at what we can do with it.

+
+

Creating a Canopy Height Model

+

A Canopy Height Model (CHM) gives an indication of the height of trees and/or buildings. It can be created by subtracting a Digital Terrain Model from a Digital Surface Model. In the resulting raster, each cell value represents the height above the underlying surface topography.

+
+
import numpy as np
+
+# Access the data from the two rasters
+dsm_data = dsm.read()
+dtm_data = dtm.read()
+
+# Set our nodata to np.nan (this is important for later)
+dsm_data[dsm_data == dsm.nodata] = np.nan
+dtm_data[dtm_data == dtm.nodata] = np.nan
+
+

Earlier, we noticed that the DTM included gaps. Let’s first fill these gaps using the fillnodata() function from rasterio.fill. For more information, see the documentation.

+
+
from rasterio.fill import fillnodata
+
+# Create a mask to specify which pixels to fill (0=fill, 1=do not fill)
+dtm_mask = dtm_data.copy()
+dtm_mask[~np.isnan(dtm_data)] = 1
+dtm_mask[np.isnan(dtm_data)] = 0
+
+# Fill missing values
+dtm_data = fillnodata(dtm_data, mask=dtm_mask)
+

Now, let’s can create our CHM:

-
# Subtract the NumPy arrays 
-chm = dsm_data - dtm_data
-
-# Check the resulting array
-print(chm)
-
-# Copy metadata of one of the rasters (does not matter which one)
-kwargs = dsm.meta 
-
-# Save the chm as a raster
-with rasterio.open('data/AHN3_05m_CHM.tif', 'w', **kwargs) as file:
-    file.write(chm.astype(rasterio.float32))
-
-
-Question 3: Where is the CHM the highest in the study -area? Is it what you expected? +
+
# Subtract the NumPy arrays 
+chm = dsm_data - dtm_data
+
+# Check the resulting array
+print(chm)
+
+# Copy metadata of one of the rasters (does not matter which one)
+kwargs = dsm.meta 
+
+# Save the chm as a raster
+with rasterio.open('data/AHN3_05m_CHM.tif', 'w', **kwargs) as file:
+    file.write(chm.astype(rasterio.float32))
+
+
+
+
+ +
+
+Question 3: Where is the CHM the highest in the study area? Is it what you expected?
Click for answer Think about where you have the most forests on campus.
-
-

We have now applied the basic concepts of creating a Canopy Height -Model!

-
-

Computing heights of buildings

-

Using our CHM, let’s determine the average heights of the buildings -in our study area. The first step is to download building data from the -BAG Web Feature Service that we also used in the vector tutorial. Note -that we make use of the bbox from an earlier codeblock for -this.

-
import geopandas as gpd
-import json
-from owslib.wfs import WebFeatureService
-
-# Get the WFS of the BAG
-wfsUrl = 'https://service.pdok.nl/lv/bag/wfs/v2_0'
-wfs = WebFeatureService(url=wfsUrl, version='2.0.0')
-layer = list(wfs.contents)[0]
-
-# Get the features for the study area
-# notice that we now get them as json, in contrast to before
-response = wfs.getfeature(typename=layer, bbox=bbox, outputFormat='json')
-data = json.loads(response.read())
-
-# Create GeoDataFrame, without saving first
-buildings_gdf = gpd.GeoDataFrame.from_features(data['features'])
-
-# Set crs to RD New
-buildings_gdf.crs = 28992
+
+

We have now applied the basic concepts of creating a Canopy Height Model!

+
+
+

Computing heights of buildings

+

Using our CHM, let’s determine the average heights of the buildings in our study area. The first step is to download building data from the BAG Web Feature Service that we also used in the vector tutorial. Note that we make use of the bbox from an earlier codeblock for this.

+
+
import geopandas as gpd
+import json
+from owslib.wfs import WebFeatureService
+
+# Get the WFS of the BAG
+wfsUrl = 'https://service.pdok.nl/lv/bag/wfs/v2_0'
+wfs = WebFeatureService(url=wfsUrl, version='2.0.0')
+layer = list(wfs.contents)[0]
+
+# Get the features for the study area
+# notice that we now get them as json, in contrast to before
+response = wfs.getfeature(typename=layer, bbox=bbox, outputFormat='json')
+data = json.loads(response.read())
+
+# Create GeoDataFrame, without saving first
+buildings_gdf = gpd.GeoDataFrame.from_features(data['features'])
+
+# Set crs to RD New
+buildings_gdf.crs = 28992
+
-

The next step is to perform zonal statistics to get the average -height value per building polygon. We will do this with the module -Rasterstats, which can use a GeoDataFrame and a -.tif file for this task. Here, we make it output a GeoJSON.

-
import rasterstats as rs
-
-# Apply the zonal statistics function with gdf and tif as input
-chm_buildings = rs.zonal_stats(buildings_gdf, "data/AHN3_05m_CHM.tif", prefix='CHM_', geojson_out=True)
-
-# Convert GeoJSON to GeoDataFrame
-buildings_gdf = gpd.GeoDataFrame.from_features(chm_buildings)
-
-# Check the added attributes with a prefix 'CHM_'
-print(buildings_gdf['CHM_mean'])
-

A quick visualization shows us the heights derived from the raster -data on the map:

-
# Create one plot with figure size 10 by 10
-fig, ax = plt.subplots(1, figsize=(10, 10))
-
-# Customize figure with title, legend, and facecolour
-ax.set_title('Heights above ground (m) of buildings on the WUR campus')
-buildings_gdf.plot(ax=ax, column='CHM_mean', k=6,
-                   cmap=plt.cm.viridis, linewidth=1, edgecolor='black', legend=True)
-ax.set_facecolor("lightgray")
-
-# Make sure to get an equal scale in the x and y direction
-plt.axis('equal')
-
-# Visualize figure
-plt.show()
-

Buildings on Wageningen Campus and their height

-
-
-Question 4: Why do we want an equal scale in the x and -y direction for this figure? +

The next step is to perform zonal statistics to get the average height value per building polygon. We will do this with the module Rasterstats, which can use a GeoDataFrame and a .tif file for this task. Here, we make it output a GeoJSON.

+
+
import rasterstats as rs
+
+# Apply the zonal statistics function with gdf and tif as input
+chm_buildings = rs.zonal_stats(buildings_gdf, "data/AHN3_05m_CHM.tif", prefix='CHM_', geojson_out=True)
+
+# Convert GeoJSON to GeoDataFrame
+buildings_gdf = gpd.GeoDataFrame.from_features(chm_buildings)
+
+# Check the added attributes with a prefix 'CHM_'
+print(buildings_gdf['CHM_mean'])
+
+

A quick visualization shows us the heights derived from the raster data on the map:

+
+
# Create one plot with figure size 10 by 10
+fig, ax = plt.subplots(1, figsize=(10, 10))
+
+# Customize figure with title, legend, and facecolour
+ax.set_title('Heights above ground (m) of buildings on the WUR campus')
+buildings_gdf.plot(ax=ax, column='CHM_mean', k=6,
+                   cmap=plt.cm.viridis, linewidth=1, edgecolor='black', legend=True)
+ax.set_facecolor("lightgray")
+
+# Make sure to get an equal scale in the x and y direction
+plt.axis('equal')
+
+# Visualize figure
+plt.show()
+
+
+
+

Buildings on Wageningen Campus and their height

+
Buildings on Wageningen Campus and their height
+
+
+
+
+
+ +
+
+Question 4: Why do we want an equal scale in the x and y direction for this figure?
Click for answer -To visualize the buildings properly, otherwise their geometries will be -skewed. +To visualize the buildings properly, otherwise their geometries will be skewed.
-
-
-
-

Other functionality

-

Note that this tutorial only scratches the surface of the -possibilities of Rasterio. It can do most if not all things you did in -R in the Vector - Raster tutorial. Rasterio for example -also allows you to do masking, -reprojecting, -and resampling.

-
+ +
+

Other functionality

+

Note that this tutorial only scratches the surface of the possibilities of Rasterio. It can do most if not all things you did in R in the Vector - Raster tutorial. Rasterio for example also allows you to do masking, reprojecting, and resampling.

+
+ +

More on writing raster data to a file

-

As you’ve seen before, to store the NumPy array as a raster file, -Rasterio needs the accompanying metadata. It is possible to use the -metadata of an existing raster (which we did before), but it is also -possible to create it from scratch.

-

To create metadata from scratch, the CRS can be defined with a -function from Rasterio and the transformation can be defined using -Affine. Affine is a Python module that facilitates affine -transformations, i.e. scaling, rotating, mirroring or skewing of -images/rasters/arrays.

-

Rasterio can write most raster formats from -GDAL. The -developers recommend using GeoTiff driver for writing as it is the -best-tested and best-supported format.

-
import affine
-
-# Specify the components of the crs (we know them from the DSM)
-kwargs = {'driver': 'GTiff',
-          'dtype': 'float32',
-          'nodata': np.nan,
-          'width': 2000,
-          'height': 2000,
-          'count': 1,
-          'crs': rasterio.crs.CRS({'init': 'epsg:28992'}),
-          'transform': affine.Affine(0.5, 0.0, 173600.0, 0.0, -0.5, 444600.0)}
-
-# Write the raster file
-with rasterio.open('data/AHN3_05m_CHM_affine.tif', 'w', **kwargs) as file:
-    file.write(chm.astype(rasterio.float32))
+

As you’ve seen before, to store the NumPy array as a raster file, Rasterio needs the accompanying metadata. It is possible to use the metadata of an existing raster (which we did before), but it is also possible to create it from scratch.

+

To create metadata from scratch, the CRS can be defined with a function from Rasterio and the transformation can be defined using Affine. Affine is a Python module that facilitates affine transformations, i.e. scaling, rotating, mirroring or skewing of images/rasters/arrays.

+

Rasterio can write most raster formats from GDAL. The developers recommend using GeoTiff driver for writing as it is the best-tested and best-supported format.

+
+
import affine
+
+# Specify the components of the crs (we know them from the DSM)
+kwargs = {'driver': 'GTiff',
+          'dtype': 'float32',
+          'nodata': np.nan,
+          'width': 2000,
+          'height': 2000,
+          'count': 1,
+          'crs': rasterio.crs.CRS({'init': 'epsg:28992'}),
+          'transform': affine.Affine(0.5, 0.0, 173600.0, 0.0, -0.5, 444600.0)}
+
+# Write the raster file
+with rasterio.open('data/AHN3_05m_CHM_affine.tif', 'w', **kwargs) as file:
+    file.write(chm.astype(rasterio.float32))
-
+
+

More on raster data visualization

-

Raster data can be visualized by passing NumPy arrays to Matplotlib -directly or by making use of a method in Rasterio that accesses -Matplotlib for you. Using Matplotlib directly allows more flexibility, -such as tweaking the legend, axis and labels, and is more suitable for -professional purposes. The visualization using Rasterio requires less -code and can give a quick idea of your raster data. We show both -approaches below. Let’s first make a visualization of the DSM using -Matplotlib:

-
# Create one plot with figure size 10 by 10
-fig, ax = plt.subplots(figsize=(10, 10), dpi=200)
-
-# imshow() is the main raster plotting method in Matplotlib
-# Again, ensure an equal scale in the x and y direction
-dsmplot = ax.imshow(dsm_data[0], cmap='Oranges', extent=bbox, aspect='equal')
-
-# Title (do not do this for a scientific report, use a caption instead)
-ax.set_title("Digital Surface Model - WUR Campus", fontsize=14)
-
-# Add a legend (colourbar) with label
-cbar = fig.colorbar(dsmplot, fraction=0.035, pad=0.01)
-cbar.ax.get_yaxis().labelpad = 15
-cbar.ax.set_ylabel('Height (m)', rotation=90)
-
-# Hide the axes
-ax.set_axis_off()
-plt.show()
-

Digital Surface Model of WUR Campus

-

If you do not like the orange colourmap of Matplotlib, it is also -possible to pick another -colourmap.

-

The second approach with Rasterio only requires one line of code to -make a plot. By creating subplots, the figures can be combined (this can -be done with Matplotlib directly as well).

-
# Figure with three subplots, unpack directly
-fig, (axdsm, axdtm, axchm) = plt.subplots(1, 3, figsize=(15, 7), dpi=200)
-
-# Populate the three subplots with raster data
-show(dsm_data, ax=axdsm, title='DSM')
-show(dtm_data, ax=axdtm, title='Filled DTM')
-show(chm, ax=axchm, title='CHM')
-plt.show()
-

Canopy Height, Digital Surface and Terrain Model of WUR Campus

-

Rasterio can also create simple histograms by calling functions of -Matplotlib.

-
from rasterio.plot import show_hist
-import numpy as np
-
-# Stack the three arrays along a new axis to create a 3-band raster
-# Ensure all arrays have the same shape and are 2D
-three_band_array = np.stack([dsm_data, dtm_data, chm], axis=0).squeeze()
-
-# Copy metadata and update for 3 bands
-three_band_meta = dsm.meta.copy()
-three_band_meta.update(count=3)
-
-# Write the 3-band raster to file
-with rasterio.open('data/AHN3_05m_3band.tif', 'w', **three_band_meta) as dst:
-  dst.write(three_band_array.astype(rasterio.float32))
-
-with rasterio.open('data/AHN3_05m_3band.tif') as raster:
-  show_hist(raster, bins=50, lw=0.0, stacked=False, alpha=0.3, 
-            histtype='stepfilled', title="Histogram", label = ['dsm', 'dtm', 'chm'])
-

Histograms of Canopy Height, Digital Surface and Terrain Model of WUR Campus

-
-
-Question 5: What is represented on the x and y axis? -The default axis labels are DN (x) and Frequency (y); if you were to -change them, what labels would you pick to better reflect the content of -the plots? +

Raster data can be visualized by passing NumPy arrays to Matplotlib directly or by making use of a method in Rasterio that accesses Matplotlib for you. Using Matplotlib directly allows more flexibility, such as tweaking the legend, axis and labels, and is more suitable for professional purposes. The visualization using Rasterio requires less code and can give a quick idea of your raster data. We show both approaches below. Let’s first make a visualization of the DSM using Matplotlib:

+
+
# Create one plot with figure size 10 by 10
+fig, ax = plt.subplots(figsize=(10, 10), dpi=200)
+
+# imshow() is the main raster plotting method in Matplotlib
+# Again, ensure an equal scale in the x and y direction
+dsmplot = ax.imshow(dsm_data[0], cmap='Oranges', extent=bbox, aspect='equal')
+
+# Title (do not do this for a scientific report, use a caption instead)
+ax.set_title("Digital Surface Model - WUR Campus", fontsize=14)
+
+# Add a legend (colourbar) with label
+cbar = fig.colorbar(dsmplot, fraction=0.035, pad=0.01)
+cbar.ax.get_yaxis().labelpad = 15
+cbar.ax.set_ylabel('Height (m)', rotation=90)
+
+# Hide the axes
+ax.set_axis_off()
+plt.show()
+
+
+
+

Digital Surface Model of WUR Campus

+
Digital Surface Model of WUR Campus
+
+
+

If you do not like the orange colourmap of Matplotlib, it is also possible to pick another colourmap.

+

The second approach with Rasterio only requires one line of code to make a plot. By creating subplots, the figures can be combined (this can be done with Matplotlib directly as well).

+
+
# Figure with three subplots, unpack directly
+fig, (axdsm, axdtm, axchm) = plt.subplots(1, 3, figsize=(15, 7), dpi=200)
+
+# Populate the three subplots with raster data
+show(dsm_data, ax=axdsm, title='DSM')
+show(dtm_data, ax=axdtm, title='Filled DTM')
+show(chm, ax=axchm, title='CHM')
+plt.show()
+
+
+
+

Canopy Height, Digital Surface and Terrain Model of WUR Campus

+
Canopy Height, Digital Surface and Terrain Model of WUR Campus
+
+
+

Rasterio can also create simple histograms by calling functions of Matplotlib.

+
+
from rasterio.plot import show_hist
+import numpy as np
+
+# Stack the three arrays along a new axis to create a 3-band raster
+# Ensure all arrays have the same shape and are 2D
+three_band_array = np.stack([dsm_data, dtm_data, chm], axis=0).squeeze()
+
+# Copy metadata and update for 3 bands
+three_band_meta = dsm.meta.copy()
+three_band_meta.update(count=3)
+
+# Write the 3-band raster to file
+with rasterio.open('data/AHN3_05m_3band.tif', 'w', **three_band_meta) as dst:
+  dst.write(three_band_array.astype(rasterio.float32))
+
+with rasterio.open('data/AHN3_05m_3band.tif') as raster:
+  show_hist(raster, bins=50, lw=0.0, stacked=False, alpha=0.3, 
+            histtype='stepfilled', title="Histogram", label = ['dsm', 'dtm', 'chm'])
+
+
+
+

Histograms of Canopy Height, Digital Surface and Terrain Model of WUR Campus

+
Histograms of Canopy Height, Digital Surface and Terrain Model of WUR Campus
+
+
+
+
+
+ +
+
+Question 5: What is represented on the x and y axis? The default axis labels are DN (x) and Frequency (y); if you were to change them, what labels would you pick to better reflect the content of the plots?
Click for answer -The y axis represents the count of pixels. Meanwhile the x axis -represents the pixel’s DN (digital value), in this tutorial since we are -looking at elevation this value is actually meters. For example, in the -first plot (DSM) you can see that most pixel values are in the 10 to 15 -meter range +The y axis represents the count of pixels. Meanwhile the x axis represents the pixel’s DN (digital value), in this tutorial since we are looking at elevation this value is actually meters. For example, in the first plot (DSM) you can see that most pixel values are in the 10 to 15 meter range
-
-
+
+
+

STAC

+

In the examples above, we have looked at single images or relatively small areas. In the past years the amount of data that we are capturing has been growing. Websvervices are not suitable for sharing very large quantities of multimodal or multidimensional data. Searching and accessing these volumes of data can be done using the Spatial Temporal Asset Catalogue (STAC).

+

This is a very short, and very incomplete description of what STAC is and how to use it. For a more elaborate tutorial visit the dedicated STAC tutorial.

+

STAC is a standard with a strong community working on enabling easier acces to data about our planet. It provides a standardized structure for accessing spatiotemporal datasets. The starting point is usually a STAC catalog, for example https://stac.ecodatacube.eu/. This website is a visual representation of a catalog.json file, that can be accessed by clicking on the source button in the top right. It is possible to search the catalog programatically, and is discussed in the STAC Tutorial. An alternative is to browse through the viewer and find relevant datasets there.

+

A STAC catalog consists of a links to collections, items or other catalogs. A STAC collection is a collection of STAC items with similar traits. For example https://s3.ecodatacube.eu/arco/stac/oc_iso.10694.1995.mg.cm3/collection.json (that can be found through the ecodatacube catalog). This collection, is a collection of STAC items regarding the soil organic carbon density (SOCD). In this case it links to datasets at different depths, at different timeframes.

+

Generally these separate datasets can be found by a url stored in the items. These urls point, in the case of raster data, to a Cloud Optimized GeoTiff (COG). This is a Tiff file as we know it, it also ends at .tiff, but it contains some indexing and other metadata that makes the file searchable remotely instead of having to download the entire file before being able to for example mask a part of it.

+
+
import rasterio
+from rasterio.mask import mask
+from shapely import box
+import matplotlib.pyplot as plt
+
+# Define a bounding box in the available crs (see before) by picking a point and drawing a 1x1 km box around it
+bbox = box( 4021321,3213709,  4028479, 3217978) # In EPSG:3035 - same as raster
+
+# get url from item asset link
+asset_url = 'https://s3.ecodatacube.eu/arco/ndvi_glad.landsat.ard2.seasconv.m.yearly_p25_30m_s_20220101_20221231_eu_epsg.3035_v20231127.tif'
+
+# open raster directly from S3 (requires rasterio with HTTP enabled, which is default)
+with rasterio.open(asset_url) as src:
+    # crop the raster with the polygon
+    out_image, out_transform = mask(src, [bbox], crop=True)
+
+# plot the cropped raster
+plt.imshow(out_image[0], cmap="viridis")
+plt.title("Cropped raster over Wageningen")
+plt.colorbar(label="Value")
+plt.show()
+
+
+ +

More info

-
-
- - - -
-
- -
-
- - - - - + + - - - - - + + \ No newline at end of file diff --git a/index.Rmd b/index.qmd similarity index 51% rename from index.Rmd rename to index.qmd index ad36a4e..6f3e2a0 100644 --- a/index.Rmd +++ b/index.qmd @@ -1,29 +1,37 @@ --- pagetitle: "Raster data handling with Python" author: "Jan Verbesselt, Jorge Mendes de Jesus, Aldo Bergsma, Dainius Masiliunas, David Swinkels, Judith Verstegen, Corné Vreugdenhil, Arno Timmer" -date: "`r format(Sys.time(), '%Y-%m-%d')`" -output: - rmdformats::html_clean: - highlight: zenburn +date: today +engine: knitr +format: + html: + theme: simplex + highlight-style: zenburn + toc: true + toc-location: right + css: styles.css + lightbox: true +execute: + eval: true + echo: true --- -```{css, echo=FALSE} -@import url("https://netdna.bootstrapcdn.com/bootswatch/3.0.0/simplex/bootstrap.min.css"); -.main-container {max-width: none;} -div.figcaption {display: none;} -pre {color: inherit; background-color: inherit;} -code[class^="sourceCode"]::before { - content: attr(class); - display: block; - text-align: right; - font-size: 70%; -} -code[class^="sourceCode r"]::before { content: "R Source";} -code[class^="sourceCode python"]::before { content: "Python Source"; } -code[class^="sourceCode bash"]::before { content: "Bash Source"; } +```{r} +#| include: false +# This is necessary to show outputs for students, +# the include is false hides this for the students. +reticulate::py_require("numpy") +reticulate::py_require("matplotlib") +reticulate::py_require("owslib") +reticulate::py_require("geopandas") +reticulate::py_require("rasterio") +reticulate::py_require("rasterstats") +reticulate::py_require("affine") +reticulate::py_require("osmnx") ``` -[WUR Geoscripting](https://geoscripting-wur.github.io/) WUR logo + +[[WUR Geoscripting](https://geoscripting-wur.github.io/)]{.page-header-title} # Raster data handling with Python @@ -32,60 +40,74 @@ code[class^="sourceCode bash"]::before { content: "Bash Source"; } Today we will work with Python packages for spatial raster analysis. Python has some dedicated packages to handle rasters: * [OWSLib](https://geopython.github.io/OWSLib/) allows us to download geospatial raster data from Web Coverage Services -* [GDAL](https://gdal.org/api/python_bindings.html) is powerful library for reading, writing and warping raster datasets +* [GDAL](https://gdal.org/api/python_bindings.html) is a powerful library for reading, writing and warping raster datasets * [Rasterio](https://Rasterio.readthedocs.io/en/latest/) reads and writes geospatial raster data * [rasterstats](https://pythonhosted.org/rasterstats/) summarizes geospatial raster datasets based on vector geometries -* [NumPy](http://www.numpy.org/) is fundamental package for scientific computing, such as array (thus raster) calculations +* [NumPy](http://www.numpy.org/) is a fundamental package for scientific computing, such as array (thus raster) calculations ## Learning objectives -- Be able to read spatial raster formats from web services and files +- Be able to read spatial raster data from web services and files - Be able to write spatial raster formats to disk - Know how to apply basic operations on raster data, such as arithmetics - Be able to plot spatial raster data with Matplotlib ## Setting up the Python Environment +Like in the previous tutorials, we will create a pixi environment. Do this by creating a directory for this tutorial, copying the following text in a `pixi.toml` file and run `pixi install`. + +```toml +[workspace] +authors = ["Your Name "] +channels = ["conda-forge"] +name = "raster" +platforms = ["linux-64"] +version = "0.1.0" + +[tasks] + +[dependencies] +python = "*" +numpy = "*" +matplotlib = "*" +owslib = "*" +gdal = "*" +geopandas = "*" +rasterio = "*" +rasterstats = "*" +affine = "*" +ipykernel = "*" +``` -Make a directory structure for this tutorial: +Create the necessary directories for this tutorial (for this we use the nifty [Pathlib package](https://docs.python.org/3/library/pathlib.html), the standard path handling library in python! ): -```{r, eval=FALSE,engine='bash'} -cd ~/Documents/ -mkdir PythonRaster #or give the directory a name to your liking -cd ./PythonRaster -mkdir data -mkdir output +```{python} +from pathlib import Path + +base = Path.home() # This references the location of your script +(base / "data").mkdir(exist_ok=True) ``` -Like in the previous tutorials, we will create a conda environment with a `.yaml` file: -``` -name: raster -dependencies: - - python - - numpy - - matplotlib - - spyder - - owslib - - gdal - - geopandas - - rasterio - - rasterstats - - affine - - osmnx -``` +From now on, if you see the format combining strings and variables together with `/`'s like: `base / 'some_dir_name'`, it is Pathlib based path handling. -After creation, activate the environment, open Spyder, create a script in the root directory, and start coding. +Use this directory for the rest of this tutorial. # Reading raster data and accessing metadata -There are numerous way to access raster data in Python. In fact, most of these methods are not limited to python, in R you can use similar implementations just as well. The other way around, from some of the methods introduced earlier there are also python implementation. And there are a lot more ways, we can't cover everything... +There are many ways to work with raster data, you have been introduced to some in R and bash. In Python we can do similar things, often using the same underlying software (gdal for example). + +Before we will look into how to deal with local files and data processing, we will introduce web services and will show you how to access and store remote (online hosted) data locally. This is useful, because we can rely on the owner of the data (governments for example) updating the data, making our analysis pipelines make use of up to date data. Think about a yearly update of some dataset, where the source data is renewed 'automagically' each year. + +Conveniently, the data that we will access and store locally, will be used throughout this tutorial to introduce libraries that can be used for reading, writing and processing raster data in Python. + +Lastly, we will look a more recent development in the area of analyzing (sometimes very large and multidimensional) remotely stored raster datasets. ## From a Web Coverage Service -A Web Coverage Service (WCS) loads raster data in a similar way as Web Feature Services (WFS) load vector data. [Web Coverage Services](https://www.ogc.org/standards/wcs) are a standard by the Open Geospatial Consortium and allow the downloading of geospatial raster data with multiple types of format encoding: GeoTIFF, netCDF, JPEG2000 etc. A [Web Map Service](https://www.ogc.org/standards/wms) [WMS] also exists for rasters; it allows downloading of images but without the data values. +A Web Coverage Service (WCS) loads raster data in a similar way as Web Feature Services (WFS) load vector data. [Web Coverage Services](https://www.ogc.org/standards/wcs) are a standard by the Open Geospatial Consortium and allow the downloading of geospatial raster data with multiple types of format encoding: GeoTIFF, netCDF, JPEG2000 etc. A [Web Map Service](https://www.ogc.org/standards/wms) [WMS] is another dataservice for raster data. An important difference between them is that a WCS serves the raw raster data (such as elevation in meters for Digital Elevation Models), and a WMS serves visualizations of data, for example a nice elevation basemap with 3 bands for Red Green and Blue (RGB) instead of the raw data. -Today we will work with elevation rasters. More specifically, we will have a look at the WCS of the AHN dataset. AHN stands for "Actueel Hoogtebestand Nederland" and is a Digital Elevation Model [DEM] that covers the Netherlands. Access the web coverage service to have a look at the contents: +Today we will work with elevation rasters. More specifically, we will have a look at the WCS of the AHN dataset. AHN stands for "Actueel Hoogtebestand Nederland" and is a Digital Elevation Model [DEM] that covers the Netherlands. Access the web coverage service to have a look at the contents. For this we will use OWSLib: -```{python, eval=FALSE} +```{python} from owslib.wcs import WebCoverageService # Access the WCS by proving the url and optional arguments @@ -95,36 +117,34 @@ wcs = WebCoverageService('https://service.pdok.nl/rws/ahn/wcs/v1_0?SERVICE=WCS&r print(list(wcs.contents)) ``` -Running the last line of code shows that the Web Coverage Service of the AHN3 contains two rasters: 0.5m DSM, and 0.5m DTM. Raster data of AHN has the projected coordinate system `RD_New (EPSG: 28992)`. +Running the last line of code shows that the Web Coverage Service of the AHN3 contains two rasters with the identifiers `dtm_05m` and `dsm_05m`, corresponding to a 0.5m resolution DSM, and 0.5m resolution DTM. Raster data of AHN has the projected coordinate system `RD_New (EPSG: 28992)`. The difference between a DEM, DSM and DTM is explained in this question on [GIS StackExchange](https://gis.stackexchange.com/questions/5701/what-is-the-difference-between-dem-dsm-and-dtm/5704) (Thanks [@underdark](https://gis.stackexchange.com/users/187/underdark)!). We can also check what types of operations are available for this WCS: -```{python, eval=FALSE} +```{python} # Get all operations and print the name of each of them print([op.name for op in wcs.operations]) ``` -You will see that the Web Coverage Service allows accessing the data (GetCoverage), the metadata (DescribeCoverage), and the capabilities (GetCapabilities). These are all standard protocols defined by the OGC. +You will see that the Web Coverage Service allows accessing the data (`GetCoverage`), the metadata (`DescribeCoverage`), and the capabilities (`GetCapabilities`). These are all standard protocols defined by the OGC. Several functions are available to access specific metadata of each individual raster, for example: -```{python, eval=FALSE} +```{python} # Take the 0.5m DSM as an example cvg = wcs.contents['dsm_05m'] # Print supported reference systems, the bounding box defined in WGS 84 coordinates, and supported file formats -print(cvg.supportedCRS) -print(cvg.boundingBoxWGS84) -print(cvg.supportedFormats) +print(f'Available CRS options: {cvg.supportedCRS}') +print(f'Bounding box is WGS84: {cvg.boundingBoxWGS84}') +print(f'Supported formats: {cvg.supportedFormats}') ``` -Let us have a look at the data itself. As we do not want to overload the web service, we download once and store the data locally. +Let us have a look at the data itself. Calling the GetCoverage function will send a request to the server where the data is stored and download the data. As we do not want to overload the web service, we call this function once, download the data and store it locally. -Download the Digital Surface Model [DSM], which is the the 'dsm_05m' version, and Digital Terrain Model [DTM], which is the 'dtm_05m' version, to a local file. The difference between a DEM, DSM and DTM is explained on the [GIS StackExchange](https://gis.stackexchange.com/questions/5701/what-is-the-difference-between-dem-dsm-and-dtm/5704). - -```{python, eval=FALSE} -import os +Download the Digital Surface Model [DSM], which we can access through the 'dsm_05m' identifier, and Digital Terrain Model [DTM], which is the 'dtm_05m' version, to a local file. +```{python} # Define a bounding box in the available crs (see before) by picking a point and drawing a 1x1 km box around it x, y = 174100, 444100 bbox = (x - 500, y - 500, x + 500, y + 500) @@ -134,31 +154,26 @@ response = wcs.getCoverage(identifier='dsm_05m', bbox=bbox, format='GEOTIFF', crs='urn:ogc:def:crs:EPSG::28992', resx=0.5, resy=0.5) # Write the data to a local file in the 'data' directory -with open('data/AHN3_05m_DSM.tif', 'wb') as file: - file.write(response.read()) +with open(base / "data" / "AHN3_05m_DSM.tif", 'wb') as file: + _ = file.write(response.read()) # file.write returns the number of bytes written # Do the same for the DTM response = wcs.getCoverage(identifier='dtm_05m', bbox=bbox, format='GEOTIFF', crs='urn:ogc:def:crs:EPSG::28992', resx=0.5, resy=0.5) -with open('data/AHN3_05m_DTM.tif', 'wb') as file: - file.write(response.read()) +with open(base / "data" / "AHN3_05m_DTM.tif", 'wb') as file: + _ = file.write(response.read()) ``` -Before continuing, please check if this step was successful (*Hint: you can check if files have been written into corresponding directory*). +That's a very short introduction to webservices and accessing with Python. The datasets that you now stored locally we will use in the rest of the tutorial. Before continuing, please check if these steps were successful (*Check if files have been written into corresponding directory*). ## From a file with GDAL -[GDAL](https://gdal.org/) is the fundament under most spatial operations, reading and writing and a lot more. GDAL is a C++ library that can handle raster and vector geospatial data formats. There are APIs to access GDAL functionality in Python, but also in Java, R and C. When opening a raster file in GDAL, the object has a hierarchical structure starting at the Dataset level. A Dataset has a Geotransform (metadata) and can contain one or more Bands. Each Band has a Data array and potentially Overviews. +[GDAL](https://gdal.org/) is the fundament under most spatial operations, reading and writing data and a lot more. GDAL is a C++ library that can handle raster and vector geospatial data formats. There are APIs to access GDAL functionality in Python, but also in Java, R and C. When opening a raster file in GDAL, the object has a hierarchical structure starting at the Dataset level. A Dataset has a Geotransform (metadata) and can contain one or more Bands. Each Band has a Data array and potentially Overviews. -
-
-gdal structure -
GDAL class structure, adapted from Garrard, 2016, Geoprocessing with Python.
-
-
+![GDAL class structure, adapted from Garrard, 2016, Geoprocessing with Python.](./images/gdal.png){fig-alt="gdal structure" width="90%"} -As you can see handling spatial data with GDAL can become a bit confusing. But since it is so fundamental it is good to get familiar with the basics of GDAL. Luckily there are packages that build upon GDAL that make life a bit easier, but they all use GDAL under the hood. More on those packages later, first let's have a look at opening geotiff in GDAL. +As you can see handling spatial data with GDAL can become a bit confusing. But since it is so fundamental it is good to get familiar with the very basics of GDAL. Luckily there are packages that build upon GDAL that make life a bit easier, but they all use GDAL under the hood. More on those packages later, first let's have a look at opening geotiff in GDAL. Let us open the file we just saved. You will see you first get the dataset (even though there is only one), before the data array can be accessed. @@ -166,7 +181,7 @@ Let us open the file we just saved. You will see you first get the dataset (even from osgeo import gdal # Open dataset, gdal automatically selects the correct driver -ds = gdal.Open("data/AHN3_05m_DSM.tif" ) +ds = gdal.Open(str(base / "data" / "AHN3_05m_DSM.tif")) # Get the band (band number 1) band = ds.GetRasterBand(1) @@ -179,30 +194,33 @@ print(data) ds = None ``` -```{block, type="alert alert-success"} -> **Question 1**: Why do we set ds to None at the end of your script? What may happen if you do not do that? +::: {.callout-note appearance="simple"} +**Question 1**: What happening with `ds = None` at the end of your script? Is it important? What may happen if you do not do that?
*Click for answer* - Keeping files open may leave you vulnerable to losing data, (Geo)Pandas manage resources under the hood so you don't explicitly need to close files, but for the case of GDAL, and as you will later see, Rasterio, it's important to close your files or open them with a context manager `with open ...` + Setting `ds` to None, makes python forget the dataset, closing the dataset, it`s a C thing. Keeping files open may leave you vulnerable to losing data, (Geo)Pandas manages resources under the hood so you don't explicitly need to close files, but for the case of GDAL, and as you will later see, Rasterio, it's important to close your files. Another way to handle this is using contexts, for this we would open them with a context manager `with open ...`. More on that later.
-``` +::: ## From a file with Rasterio - -[Rasterio](https://Rasterio.readthedocs.io/en/latest/intro.html) reads and writes multiple raster formats based on GDAL, provides raster processing functions based on NumPy arrays and GeoJSON, and integrates Matplotlib in the module `rasterio.plot` for visualization. - -The rest of the tutorial below is a complete route of handling a raster dataset. We will use the DEMs from a the WCS for our study area, handle it with Rasterio, calculate new information (CHM), overlay it with vector data representing buildings and visualize it. - +GDAL can be tricky to work with but it allows for a lot of flexibility. There are tools that build upon GDAL, +making integration with other software more intuitive. One of them is Rasterio. As [Rasterio explains on their website](https://Rasterio.readthedocs.io/en/latest/intro.html), +the goal of Rasterio is to the standard geospatial abstraction library that can use modern python features, and frees users from C related pitfalls. +It allows to read and write the same raster formats as GDAL can, provides raster processing functions, +and can be integrated with other packages using NumPy and GeoJSON, and allows for easy visualization based upon MatPlotLib. + +The rest of the tutorial below is a complete route of handling a raster dataset. We will use the DEMs from the WCS for our study area, handle it with Rasterio, +calculate new information (CHM), overlay it with vector data representing buildings and visualize it. Let us read in the raster data we just stored from the WCS with Rasterio and plot it with `rasterio.plot`: -```{python, eval=FALSE} +```{python} import rasterio from rasterio.plot import show import matplotlib.pyplot as plt -# Open the two rasters -dsm = rasterio.open("data/AHN3_05m_DSM.tif", driver="GTiff") -dtm = rasterio.open("data/AHN3_05m_DTM.tif", driver="GTiff") +# Open the two rasters +dsm = rasterio.open(base / "data" / "AHN3_05m_DSM.tif", driver="GTiff") +dtm = rasterio.open(base / "data" / "AHN3_05m_DTM.tif", driver="GTiff") # Metadata functions from Rasterio print(dsm.meta) @@ -213,21 +231,19 @@ plt.figure(figsize=(5, 5), dpi=300) # adjust size and resolution show(dsm, title='Digital Surface Model', cmap='gist_ncar') ``` -Water pixels of the Netherlands - -```{block, type="alert alert-success"} -> **Question 2**: Adjust the code above to take a look at the DTM. Note the gaps that appear. What are these gaps? +::: {.callout-note appearance="simple"} +**Question 2**: Adjust the code above to take a look at the DTM. Note the gaps that appear. What are these gaps?
*Click for answer* These are buildings.
-``` +::: The metadata shows the driver, datatype, nodata value, width of raster in number of cells, height of raster in number of cells, number of raster bands in the dataset, coordinate reference system, and transformation values. -In the back-end, raster layers in Rasterio are stored as NumPy arrays, which appear when the data are read with the method `.read()`: +Rasterio allows us to access the data values in a raster as NumPy arrays. We can use the `.read()` method to access these: -```{python, eval=FALSE} +```{python} # Rasterio object print(type(dsm)) @@ -237,40 +253,8 @@ print(type(dsm_data)) print(dsm_data) ``` -## STAC -In the examples above, we have looked at single images or relatively small areas. In the past years the amount of data that we are capturing has been growing. Websvervices are not suitable for sharing very large quantities of multimodal or multidimensional data. Searching and accessing these volumes of data can be done using the Spatial Temporal Asset Catalogue (STAC). - -This is a very short, and very incomplete description of what STAC is and how to use it. For a more elaborate tutorial visit the dedicated [STAC tutorial](https://geoscripting-wur.github.io/STAC/). +[NumPy](https://numpy.org/doc/stable/user/whatisnumpy.html) is a very common Python Library providing support for large, multi-dimensional arrays and fast mathematical operations. Because it is so common, other libraries will be able to read NumPy arrays. This makes it possible to read raster data into other libraries, such as the machine learning in scikit-learn. -STAC is a standard with a strong community working on enabling easier acces to data about our planet. It provides a standardized structure for accessing spatiotemporal datasets. The starting point is usually a STAC catalog, for example [https://stac.ecodatacube.eu/](https://stac.ecodatacube.eu/?.language=en). This website is a visual representation of a `catalog.json` file, that can be accessed by clicking on the source button in the top right. It is possible to search the catalog programatically, and is discussed in the [STAC Tutorial](https://geoscripting-wur.github.io/STAC/). An alternative is to browse through the viewer and find relevant datasets there. - -A *STAC catalog* consists of a links to *collections*, *items* or other catalogs. A STAC collection is a collection of STAC items with similar traits. For example [`https://s3.ecodatacube.eu/arco/stac/oc_iso.10694.1995.mg.cm3/collection.json`](https://s3.ecodatacube.eu/arco/stac/oc_iso.10694.1995.mg.cm3/collection.json) (that can be found through the ecodatacube catalog). This collection, is a collection of STAC items regarding the soil organic carbon density (SOCD). In this case it links to datasets at different depths, at different timeframes. - -Generally these separate datasets can be found by a url stored in the items. These urls point, in the case of raster data, to a Cloud Optimized GeoTiff (COG). This is a Tiff file as we know it, it also ends at `.tiff`, but it contains some indexing and other metadata that makes the file searchable remotely instead of having to download the entire file before being able to for example mask a part of it. - -```{python, eval=FALSE} -import rasterio -from rasterio.mask import mask -from shapely import box -import matplotlib.pyplot as plt - -# Define a bounding box in the available crs (see before) by picking a point and drawing a 1x1 km box around it -bbox = box( 4021321,3213709, 4028479, 3217978) # In EPSG:3035 - same as raster - -# get url from item asset link -asset_url = 'https://s3.ecodatacube.eu/arco/ndvi_glad.landsat.ard2.seasconv.m.yearly_p25_30m_s_20220101_20221231_eu_epsg.3035_v20231127.tif' - -# open raster directly from S3 (requires rasterio with HTTP enabled, which is default) -with rasterio.open(asset_url) as src: - # crop the raster with the polygon - out_image, out_transform = mask(src, [bbox], crop=True) - -# plot the cropped raster -plt.imshow(out_image[0], cmap="viridis") -plt.title("Cropped raster over Wageningen") -plt.colorbar(label="Value") -plt.show() -``` # Processing raster data Now that we have some options to read data into python, let's have a look at what we can do with it. @@ -279,7 +263,7 @@ Now that we have some options to read data into python, let's have a look at wha A Canopy Height Model (CHM) gives an indication of the height of trees and/or buildings. It can be created by subtracting a Digital Terrain Model from a Digital Surface Model. In the resulting raster, each cell value represents the height above the underlying surface topography. -```{python, eval=FALSE} +```{python} import numpy as np # Access the data from the two rasters @@ -289,11 +273,17 @@ dtm_data = dtm.read() # Set our nodata to np.nan (this is important for later) dsm_data[dsm_data == dsm.nodata] = np.nan dtm_data[dtm_data == dtm.nodata] = np.nan + +# Close open rasterio datasets so their files can be removed +dsm.close() +dtm.close() ``` +Similar to a gdal dataset, we have to close rasterio datasets. If you don't do this, you are firstly not able to delete the files but it can also lead to other strange behaviour. + Earlier, we noticed that the DTM included gaps. Let's first fill these gaps using the `fillnodata()` function from `rasterio.fill`. For more information, see the [documentation](https://rasterio.readthedocs.io/en/latest/api/rasterio.fill.html). -```{python, eval=FALSE} +```{python} from rasterio.fill import fillnodata # Create a mask to specify which pixels to fill (0=fill, 1=do not fill) @@ -305,9 +295,9 @@ dtm_mask[np.isnan(dtm_data)] = 0 dtm_data = fillnodata(dtm_data, mask=dtm_mask) ``` -Now, let's can create our CHM: +Now, we can create a CHM ([remember](https://gis.stackexchange.com/questions/5701/what-is-the-difference-between-dem-dsm-and-dtm/5704?)): -```{python, eval=FALSE} +```{python} # Subtract the NumPy arrays chm = dsm_data - dtm_data @@ -318,27 +308,34 @@ print(chm) kwargs = dsm.meta # Save the chm as a raster -with rasterio.open('data/AHN3_05m_CHM.tif', 'w', **kwargs) as file: +with rasterio.open(base / "data" / "AHN3_05m_CHM.tif", 'w', **kwargs) as file: file.write(chm.astype(rasterio.float32)) + +``` + +The actual raster arithmetic is happening in the first line: `chm = dsm_data - dtm_data`. dsm_data and dtm_data are plain numpy arrays, without spatial information. If we want to write this data back to a `.tif`, we need to do include this spatial information. All this information is stored in the metadata of a rasterio object. Since we subtracted two rasters with the same spatial dimensions (the same number of rows, columns and the same CRS for example), we can re-use this metadata to write a raster with the new data. Run the following code block to see what exactly is in this metadata: + +```{python} +# We use pprint instead of print to pretty print a dictionary +import pprint +pprint.pp(dsm.meta) ``` -```{block, type="alert alert-success"} -> **Question 3**: Where is the CHM the highest in the study area? Is it what you expected? +::: {.callout-note appearance="simple"} +**Question 3**: Where is the CHM the highest in the study area? Is it what you expected?
*Click for answer* Think about where you have the most forests on campus.
-``` - +::: - -We have now applied the basic concepts of creating a Canopy Height Model! +We have now applied the basic raster arithmetic and created a Canopy Height Model! ## Computing heights of buildings -Using our CHM, let's determine the average heights of the buildings in our study area. The first step is to download building data from the BAG Web Feature Service that we also used in the vector tutorial. Note that we make use of the `bbox` from an earlier codeblock for this. +Using our CHM, let's determine the average heights of the buildings in our study area. The first step is knowing where the buildings are. For this we use the building data from the BAG Web Feature Service that we also used in the vector tutorial. Note that we make use of the `bbox` from an earlier codeblock for this. -```{python, eval=FALSE} +```{python} import geopandas as gpd import json from owslib.wfs import WebFeatureService @@ -360,19 +357,13 @@ buildings_gdf = gpd.GeoDataFrame.from_features(data['features']) buildings_gdf.crs = 28992 ``` - - -The next step is to perform zonal statistics to get the average height value per building polygon. We will do this with the module Rasterstats, which can use a `GeoDataFrame` and a `.tif` file for this task. Here, we make it output a [GeoJSON](http://geojson.org/). +Getting the average per building polygon can be done using a common operation called zonal statistics. There are several implementations of this in python, we will use the [Rasterstats](https://pythonhosted.org/rasterstats/) library. [`Rasterstats.zonal_stats`](https://pythonhosted.org/rasterstats/) has 3 inputs, vector data, rasterdata and the type of statistic that needs to be calculated. See the vector and raster datasources pages in the documentation to see what inputs are supported for those. We will use a `GeoDataFrame` and a `.tif` file for this task. Using the `geojson_out` parameter we make it output a [GeoJSON](http://geojson.org/). -```{python, eval=FALSE} +```{python} import rasterstats as rs # Apply the zonal statistics function with gdf and tif as input -chm_buildings = rs.zonal_stats(buildings_gdf, "data/AHN3_05m_CHM.tif", prefix='CHM_', geojson_out=True) +chm_buildings = rs.zonal_stats(buildings_gdf, base / "data" / "AHN3_05m_CHM.tif", prefix='CHM_', geojson_out=True) # Convert GeoJSON to GeoDataFrame buildings_gdf = gpd.GeoDataFrame.from_features(chm_buildings) @@ -383,7 +374,7 @@ print(buildings_gdf['CHM_mean']) A quick visualization shows us the heights derived from the raster data on the map: -```{python, eval=FALSE} +```{python} # Create one plot with figure size 10 by 10 fig, ax = plt.subplots(1, figsize=(10, 10)) @@ -393,36 +384,22 @@ buildings_gdf.plot(ax=ax, column='CHM_mean', k=6, cmap=plt.cm.viridis, linewidth=1, edgecolor='black', legend=True) ax.set_facecolor("lightgray") -# Make sure to get an equal scale in the x and y direction -plt.axis('equal') - # Visualize figure plt.show() ``` -Buildings on Wageningen Campus and their height - -```{block, type="alert alert-success"} -> **Question 4**: Why do we want an equal scale in the x and y direction for this figure? -
- *Click for answer* - To visualize the buildings properly, otherwise their geometries will be skewed. -
-``` - - ## Other functionality Note that this tutorial only scratches the surface of the possibilities of Rasterio. It can do most if not all things you did in `R` in the Vector - Raster tutorial. Rasterio for example also allows you to do [masking](https://rasterio.readthedocs.io/en/latest/topics/masking-by-shapefile.html), [reprojecting](https://rasterio.readthedocs.io/en/latest/topics/reproject.html), and [resampling](https://rasterio.readthedocs.io/en/latest/topics/resampling.html). -# More on writing raster data to a file +# Writing raster data to a file As you've seen before, to store the NumPy array as a raster file, Rasterio needs the accompanying metadata. It is possible to use the metadata of an existing raster (which we did before), but it is also possible to create it from scratch. To create metadata from scratch, the CRS can be defined with a function from Rasterio and the transformation can be defined using Affine. Affine is a Python module that facilitates [affine transformations](https://www.quora.com/In-an-intuitive-explanation-what-is-an-affine-transformation-of-image), i.e. scaling, rotating, mirroring or skewing of images/rasters/arrays. Rasterio can write most [raster formats from GDAL](https://www.gdal.org/formats_list.html). [The developers recommend using GeoTiff driver](https://github.com/mapbox/rasterio/issues/731) for writing as it is the best-tested and best-supported format. -```{python, eval=FALSE} +```{python} import affine # Specify the components of the crs (we know them from the DSM) @@ -432,24 +409,25 @@ kwargs = {'driver': 'GTiff', 'width': 2000, 'height': 2000, 'count': 1, - 'crs': rasterio.crs.CRS({'init': 'epsg:28992'}), + 'crs': rasterio.crs.CRS.from_epsg(28992), 'transform': affine.Affine(0.5, 0.0, 173600.0, 0.0, -0.5, 444600.0)} # Write the raster file -with rasterio.open('data/AHN3_05m_CHM_affine.tif', 'w', **kwargs) as file: +with rasterio.open(base / "data" / "AHN3_05m_CHM_affine.tif", 'w', **kwargs) as file: file.write(chm.astype(rasterio.float32)) ``` # More on raster data visualization +Raster data can be visualized by passing NumPy arrays to Matplotlib directly or by making use of a method in Rasterio that accesses Matplotlib for you. Using Matplotlib +directly allows more flexibility, such as tweaking the legend, axis and labels, and is more suitable for professional purposes. The visualization using Rasterio requires +less code and can give a quick idea of your raster data. We show both approaches below. Let's first make a visualization of the DSM using Matplotlib: -Raster data can be visualized by passing NumPy arrays to Matplotlib directly or by making use of a method in Rasterio that accesses Matplotlib for you. Using Matplotlib directly allows more flexibility, such as tweaking the legend, axis and labels, and is more suitable for professional purposes. The visualization using Rasterio requires less code and can give a quick idea of your raster data. We show both approaches below. Let's first make a visualization of the DSM using Matplotlib: - -```{python, eval=FALSE} +```{python} # Create one plot with figure size 10 by 10 fig, ax = plt.subplots(figsize=(10, 10), dpi=200) -# imshow() is the main raster plotting method in Matplotlib -# Again, ensure an equal scale in the x and y direction +# rasterio's imshow() is the main raster plotting method in Matplotlib +# Ensure an equal scale in the x and y direction dsmplot = ax.imshow(dsm_data[0], cmap='Oranges', extent=bbox, aspect='equal') # Title (do not do this for a scientific report, use a caption instead) @@ -465,14 +443,13 @@ ax.set_axis_off() plt.show() ``` -Digital Surface Model of WUR Campus - If you do not like the orange colourmap of Matplotlib, it is also possible to pick [another colourmap](https://Matplotlib.org/examples/color/colormaps_reference.html). The second approach with Rasterio only requires one line of code to make a plot. By creating subplots, the figures can be combined (this can be done with Matplotlib directly as well). -```{python, eval=FALSE} -# Figure with three subplots, unpack directly +```{python} +# Figure with 1 row with 3 columns (1,3), so 3 subplots. +# They are unpacked directly, plt.subplot returns fig and a tuple of the 3 axes fig, (axdsm, axdtm, axchm) = plt.subplots(1, 3, figsize=(15, 7), dpi=200) # Populate the three subplots with raster data @@ -482,11 +459,9 @@ show(chm, ax=axchm, title='CHM') plt.show() ``` -Canopy Height, Digital Surface and Terrain Model of WUR Campus - -Rasterio can also create simple histograms by calling functions of Matplotlib. +Rasterio can also create simple histograms by calling functions of Matplotlib. Let's see if the 3 different elevation models are different comparing their histograms. For a bit of efficiency, we will stack the three models and store them as a three band raster. We will open it again and look at its histogram. -```{python, eval=FALSE} +```{python} from rasterio.plot import show_hist import numpy as np @@ -499,26 +474,61 @@ three_band_meta = dsm.meta.copy() three_band_meta.update(count=3) # Write the 3-band raster to file -with rasterio.open('data/AHN3_05m_3band.tif', 'w', **three_band_meta) as dst: +with rasterio.open(base / "data" / "AHN3_05m_3band.tif", 'w', **three_band_meta) as dst: dst.write(three_band_array.astype(rasterio.float32)) -with rasterio.open('data/AHN3_05m_3band.tif') as raster: +# Open it again and plot the histogram +with rasterio.open(base / "data" / "AHN3_05m_3band.tif") as raster: show_hist(raster, bins=50, lw=0.0, stacked=False, alpha=0.3, histtype='stepfilled', title="Histogram", label = ['dsm', 'dtm', 'chm']) ``` -Histograms of Canopy Height, Digital Surface and Terrain Model of WUR Campus -```{block, type="alert alert-success"} -> **Question 5**: What is represented on the x and y axis? The default axis labels are DN (x) and Frequency (y); if you were to change them, what labels would you pick to better reflect the content of the plots? +::: {.callout-note appearance="simple"} +**Question 4**: What is represented on the x and y axis? The default axis labels are DN (x) and Frequency (y); if you were to change them, what labels would you pick to better reflect the content of the plots?
*Click for answer* The y axis represents the count of pixels. Meanwhile the x axis represents the pixel's DN (digital value), in this tutorial since we are looking at elevation this value is actually meters. For example, in the first plot (DSM) you can see that most pixel values are in the 10 to 15 meter range
-``` +::: + + +## STAC +In the examples above, we have looked at single images or relatively small areas. In the past years the amount of data that we are capturing has been growing. Web services are not suitable for sharing very large quantities of multimodal or multidimensional data. Searching and accessing these volumes of data can be done using the Spatial Temporal Asset Catalogue (STAC). + +This is a short (and incomplete) description of what STAC is and how to use it. For a more elaborate tutorial visit the dedicated [STAC tutorial](https://geoscripting-wur.github.io/STAC/). + +STAC is a standard with a strong community working on enabling easier access to data about our planet. It provides a standardized structure for accessing spatiotemporal datasets. The starting point is usually a STAC catalog, for example [https://stac.ecodatacube.eu/](https://stac.ecodatacube.eu/?.language=en). This website is a visual representation of a `catalog.json` file, that can be accessed by clicking on the source button in the top right. It is possible to search the catalog programmatically, and is discussed in the [STAC Tutorial](https://geoscripting-wur.github.io/STAC/). An alternative is to browse through the viewer and find relevant datasets there. +A *STAC catalog* consists of a links to *collections*, *items* or other catalogs. A STAC collection is a collection of STAC items with similar traits. For example [`https://s3.ecodatacube.eu/arco/stac/oc_iso.10694.1995.mg.cm3/collection.json`](https://s3.ecodatacube.eu/arco/stac/oc_iso.10694.1995.mg.cm3/collection.json) (that can be found through the ecodatacube catalog). This collection, is a collection of STAC items regarding the soil organic carbon density (SOCD). In this case it links to datasets at different depths, at different timeframes. + +Generally these separate datasets can be found by a url stored in the items. These urls point, in the case of raster data, to a Cloud Optimized GeoTiff (COG). This is a Tiff file as we know it, it also ends at `.tiff`, but it contains some indexing and other metadata that makes the file searchable remotely instead of having to download the entire file before being able to for example mask a part of it. + +```{python} +import rasterio +from rasterio.mask import mask +from shapely import box +import matplotlib.pyplot as plt +# Redefine the bounding box in the available crs (see before), now in EPSG:3035 to match the raster +x, y = 4024900, 3215843.5 +bbox = box(x - 3579, y - 2134.5, x + 3579, y + 2134.5) # In EPSG:3035 - same as raster + +# get url from item asset link +asset_url = 'https://s3.ecodatacube.eu/arco/ndvi_glad.landsat.ard2.seasconv.m.yearly_p25_30m_s_20220101_20221231_eu_epsg.3035_v20231127.tif' + +# open raster directly from S3 (requires rasterio with HTTP enabled, which is default) +with rasterio.open(asset_url) as src: + # crop the raster with the polygon + out_image, out_transform = mask(src, [bbox], crop=True) + +# plot the cropped raster +plt.imshow(out_image[0], cmap="viridis") +plt.title("Cropped raster over Wageningen") +plt.colorbar(label="Value") +plt.show() +``` # More info * [Tutorial working with rasters in Python with Rasterio](https://geohackweek.github.io/raster/04-workingwithrasters/) @@ -526,4 +536,19 @@ with rasterio.open('data/AHN3_05m_3band.tif') as raster: * [Landsat satellite images](https://earthexplorer.usgs.gov/) * [Resampled landsat satellite images](http://espa.cr.usgs.gov/index/) * [Sentinel satellite images](https://scihub.copernicus.eu/dhus/#/home) - \ No newline at end of file + + + +```{python} +#| include: false + +# Clean up directories after rendering +import shutil + +# Close open rasterio datasets so their files can be removed +dsm.close() +dtm.close() + +shutil.rmtree(base / "data") + +``` \ No newline at end of file diff --git a/pixi.lock b/pixi.lock new file mode 100644 index 0000000..e8d60a3 --- /dev/null +++ b/pixi.lock @@ -0,0 +1,5297 @@ +version: 7 +platforms: +- name: win-64 + virtual-packages: + - __win=10.0 + - __archspec=0=x86_64 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + packages: + win-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/affine-3.0.1-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.7.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohttp-3.14.3-pyhf64b827_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/async-timeout-5.0.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asyncssh-2.24.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/autopep8-2.0.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.7.0-py314h680f03e_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.15.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/binaryornot-0.6.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/black-26.5.1-pyh866005b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-h5f6438b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/branca-0.8.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cattrs-26.2.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/chardet-7.6.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.5.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cookiecutter-2.7.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.7-py314hd8ed1ab_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/diff-match-patch-20241021-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docstring-to-markdown-0.17-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/flake8-7.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/folium-0.20.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/frozenlist-1.8.0-pyhf298e5d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.4-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/inflection-0.5.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/intervaltree-3.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.31.0-pyh6dadd2b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.17.1-pyhe2676ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/isort-9.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhcf101f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-6.1.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.6.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.20.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.6.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyh6dadd2b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.7.0-pyh7428d3b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/lsprotocol-2025.0.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mapclassify-2.11.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.3.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-11.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/multidict-6.7.1-pyh62beb40_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.26.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.11.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.17.1-hb502eef_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.17.1-h08b4883_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.11.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/osmnx-2.1.1-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/osmnx-base-2.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/owslib-0.36.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.11.8-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.53-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/propcache-0.5.2-pyh7db6752_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyconify-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyflakes-3.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygithub-2.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.13.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pylint-4.0.8-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pylint-venv-3.0.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyls-spyder-0.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyopenssl-26.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.22.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.7-h4df99d1_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-lsp-black-2.0.0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-lsp-jsonrpc-1.1.2-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-lsp-ruff-2.3.4-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-lsp-server-1.15.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-lsp-server-base-1.15.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-slugify-9.0.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-9_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytoolconfig-1.3.1-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyuca-1.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/qdarkstyle-3.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/qstylizer-0.2.4-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/qtawesome-1.4.2-pyh9208f05_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/qtconsole-5.7.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/qtconsole-base-5.7.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/qtpy-2.4.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rasterstats-0.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rio-vrt-0.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rope-1.14.0-pyh5ded981_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rtree-1.4.1-pyh11ca60a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-84.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.9.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/spyder-6.1.7-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/spyder-kernels-3.1.6-win_pyh7428d3b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/superqt-0.8.2-pyh9208f05_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/text-unidecode-1.3-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/textdistance-4.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/three-merge-0.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.5.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.15.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.16.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.8.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/whatthepatch-1.0.7-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2026.9.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/yapf-0.43.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/yarl-1.24.5-pyh7db6752_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/astroid-4.0.4-py314h86ab7b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bcrypt-5.0.0-py314h9f07db2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/blosc-1.21.6-hfd34d9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-1.2.0-hc8c2fe1_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.2.0-hd477307_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.2.0-py314h85cf176_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_10.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cairo-1.18.4-h477c42c_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.1.1-py314h5a2d7ad_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.4.0-py314hf309875_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cryptography-50.0.1-py311h67a9792_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.21-py314hb98de8c_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/double-conversion-3.4.0-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/fiona-1.10.1-py314hcb00e3b_7.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.18.3-hd47e2ca_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/fonttools-4.65.0-py314h2359020_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.14.3-h57928b3_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/freexl-2.0.0-h0f64aeb_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/fribidi-1.0.16-hfd05255_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/fzf-0.74.4-h11686cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/gdal-3.13.3-np2py314h4074017_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/geos-3.14.1-h62f7316_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/glib-2.90.0-h6d70850_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/glib-tools-2.90.0-hafa6b35_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.15-h5112557_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/gst-plugins-base-1.26.11-h88486b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/gstreamer-1.26.11-hae9036a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.3-h5112557_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/jellyfish-1.2.1-py314h170c82c_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.5.1-py314hf309875_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h719d79b_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.19.1-hf2c6c5f_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.2.0-hd936e49_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarchive-3.8.9-gpl_h8fdc8af_101.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-11_h8455456_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.2.0-hf02afa3_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.2.0-h84f9c24_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.2.0-he2a975b_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-11_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-23.1.1-default_hacd6ee9_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.22.0-hdb0ef4a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h1a1d4e4_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.1-hac47afa_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.7.0-h3d046cb_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.3-h57928b3_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.3-hdbac1cb_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgdal-core-3.13.3-hcd51406_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.90.0-ha564072_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libharfbuzz-14.4.0-h03b5201_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.13.0-default_h049141e_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwy-1.4.0-h2419aca_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-devel-0.22.5-h5728263_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.2.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libjxl-0.12.0-h932607e_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libkml-1.3.0-h68a222c_1023.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-11_hf9ab0e9_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libogg-1.3.5-h2466b09_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-hdc8cecf_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpsl-0.23.1-h9b16d47_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpython-3.14.7-h4f90d01_106_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libraqm-0.11.0-h50d6d30_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/librttopo-1.1.0-haa95264_21.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.22-h6a83c73_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libspatialindex-2.1.0-h2854ae6_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libspatialite-5.1.0-gpl_hc1bbfae_121.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.4-hf5d6505_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h734d217_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.2-h8f73337_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libvorbis-1.3.7-h5112557_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libvulkan-loader-1.4.357.0-h477610d_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-1.6.0-h4d5522a_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.4-h3cfd58e_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.4-he095d88_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-devel-2.15.4-he095d88_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxslt-1.1.45-ha5384fd_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-23.1.1-h49e36cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lxml-6.1.3-py314h3fc22ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lz4-c-1.10.0-h6a83c73_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lzo-2.10-h6a83c73_1003.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py314h2359020_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.11.1-py314h30c6bc1_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.11.1-py314h2061cd4_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/minizip-4.2.2-hdc83b33_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2026.1.0-hac47afa_235.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/muparser-2.3.5-h5112557_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.5.3-py314h02f10f6_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.4-h90fa87c_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.4-hf411b9b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-3.0.5-py314hf700ef7_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pandoc-3.11-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.58.2-h13911b6_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.47-h8466c1e_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-12.3.0-py314h6acc0e1_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pixman-0.46.4-h5112557_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/proj-9.8.1-hd30e2cd_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.2.2-py314hc5dbbe4_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pynacl-1.6.2-py311he66da3d_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyogrio-0.13.0-py314he172734_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyproj-3.8.0-py314h9d82244_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyqt-5.15.11-py314h6044788_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyqt5-sip-12.17.0-py314h13fbf68_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyqtwebengine-5.15.11-py314hc416207_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyside6-6.11.2-py314h0c0e1ae_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.7-h53f6dd8_106_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-gssapi-1.12.0-py314h66979ce_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pytokens-0.4.1-py314hc5dbbe4_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-312-py314hf700ef7_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-ctypes-0.2.3-py314h86ab7b2_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py314h2359020_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-27.2.0-py312h343a6d4_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-hc790b64_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/qt-main-5.15.15-hc95f6a6_8.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/qt-webengine-5.15.15-h087ee03_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/qt6-main-6.11.2-pl5321hfcac499_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/rasterio-1.5.1-py314h0f7306d_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-2026.6.3-py314h9f07db2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ruff-0.16.7-hcc30601_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.9.1-np2py314h1b5b07a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.18.1-py314h67d5eaa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/shapely-2.1.2-py314h76f3c27_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/simplejson-4.1.2-py314h5a2d7ad_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/sip-6.10.0-py314h13fbf68_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/snappy-1.2.2-h7fa0ca8_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/spyder-base-6.1.7-py314h86ab7b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/sqlite-3.53.4-hdb435a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2023.1.0-hdcfe883_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h967ab96_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.8-py314h5a2d7ad_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ujson-6.0.0-py314hb98de8c_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/uriparser-0.9.8-h5a68840_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.5-ha367084_41.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36247-habf1de7_41.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36247-habf1de7_41.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/watchdog-6.0.0-py314hb821551_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/wrapt-2.4.0-py314hc5dbbe4_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xerces-c-3.3.0-hac47afa_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-h3a581c9_12.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.3.2-hfd05255_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-ng-2.3.3-h0261ad2_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_7.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + sha256: 2a7204314663eeda5dec482a956f0e2eaf289bd5b9953eaaaad0e81aa64638f2 + md5: 3845f3d75991bae0fb90884662f4327c + depends: + - cpython + - python-gil + license: MIT + license_family: MIT + run_exports: {} + size: 8144 + timestamp: 1784221492234 +- conda: https://conda.anaconda.org/conda-forge/noarch/affine-3.0.1-pyhecae5ae_0.conda + sha256: 8801cd5b4e0f0203b7a18e8def15929f3413e93e2da88d5b918b735454106f85 + md5: aeb404cab9e719a49264ab40928f80c8 + depends: + - attrs >=21.3.0 + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 22619 + timestamp: 1788134268940 +- conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.7.1-pyhd8ed1ab_0.conda + sha256: 5ef589e5fd3736439781a9d48e68ce1e723b7081a471c02169908198eba4f448 + md5: e51e09bf3b91c62b7461a9f94e92c2c9 + depends: + - python >=3.10 + license: PSF-2.0 + license_family: PSF + run_exports: {} + size: 24690 + timestamp: 1782986823268 +- conda: https://conda.anaconda.org/conda-forge/noarch/aiohttp-3.14.3-pyhf64b827_0.conda + sha256: fc6c1bb125730997452998e10beb41df299688c9f00e5a248a82c3cea7601eed + md5: 060cc9e1c541fbb6949ab7114e93ce0c + depends: + - aiohappyeyeballs >=2.5.0 + - aiosignal >=1.4.0 + - async-timeout >=4.0,<6.0 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.10 + - typing_extensions >=4.4 + - yarl >=1.17.0,<2.0 + track_features: + - aiohttp_no_compile + license: MIT AND Apache-2.0 + license_family: Apache + run_exports: {} + size: 522561 + timestamp: 1784900504858 +- conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.conda + sha256: 8dc149a6828d19bf104ea96382a9d04dae185d4a03cc6beb1bc7b84c428e3ca2 + md5: 421a865222cd0c9d83ff08bc78bf3a61 + depends: + - frozenlist >=1.1.0 + - python >=3.9 + - typing_extensions >=4.2 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 13688 + timestamp: 1751626573984 +- conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda + sha256: 6c4456a138919dae9edd3ac1a74b6fbe5fd66c05675f54df2f8ab8c8d0cc6cea + md5: 1fd9696649f65fd6611fcdb4ffec738a + depends: + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 18684 + timestamp: 1733750512696 +- conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda + sha256: 792da8131b1b53ff667bd6fc617ea9087b570305ccb9913deb36b8e12b3b5141 + md5: 85c4f19f377424eafc4ed7911b291642 + depends: + - python >=3.10 + - python-dateutil >=2.7.0 + - python-tzdata + - python + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 113854 + timestamp: 1760831179410 +- conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.2-pyhd8ed1ab_0.conda + sha256: fbbd8ce60cbd5c16f3fe559eb644551f94285caff30985ea961ff851c1cf25ac + md5: 89d495168582cb00428dad699d149624 + depends: + - python >=3.10 + constrains: + - astroid >=2,<5 + license: Apache-2.0 + license_family: Apache + run_exports: {} + size: 34639 + timestamp: 1783975742052 +- conda: https://conda.anaconda.org/conda-forge/noarch/async-timeout-5.0.1-pyhcf101f3_2.conda + sha256: 6638b68ab2675d0bed1f73562a4e75a61863b903be1538282cddb56c8e8f75bd + md5: 0d0ef7e4a0996b2c4ac2175a12b3bf69 + depends: + - python >=3.10 + - python + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 13559 + timestamp: 1767290444597 +- conda: https://conda.anaconda.org/conda-forge/noarch/asyncssh-2.24.0-pyhd8ed1ab_0.conda + sha256: e4e6ae9f34fb7202703e24bb63fda4d2548bed03fd23ba09bddc16ac34ff75d6 + md5: 82628df96af7812294c8c8385d62d6f4 + depends: + - cryptography >=39.0 + - pyopenssl >=23.0.0 + - python >=3.10 + - python-gssapi >=1.2.0 + - typing_extensions >=4.0.0 + license: EPL-1.0 + run_exports: {} + size: 254210 + timestamp: 1787084185107 +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda + sha256: 1b6124230bb4e571b1b9401537ecff575b7b109cc3a21ee019f65e083b8399ab + md5: c6b0543676ecb1fb2d7643941fe375f2 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 64927 + timestamp: 1773935801332 +- conda: https://conda.anaconda.org/conda-forge/noarch/autopep8-2.0.4-pyhd8ed1ab_0.conda + sha256: 5d9de00093c8757939df773754a76341f908bd7d6aaa65005e8dbae5632bac73 + md5: 1053857605b5139c8f9818a029a71913 + depends: + - packaging + - pycodestyle >=2.10.0 + - python >=3.6 + - tomli + license: MIT + license_family: MIT + run_exports: {} + size: 45709 + timestamp: 1693061409657 +- conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda + sha256: a14a9ad02101aab25570543a59c5193043b73dc311a25650134ed9e6cb691770 + md5: f1976ce927373500cc19d3c0b2c85177 + depends: + - python >=3.10 + - python + constrains: + - pytz >=2015.7 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 7684321 + timestamp: 1772555330347 +- conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda + sha256: e1c3dc8b5aa6e12145423fed262b4754d70fec601339896b9ccf483178f690a6 + md5: 767d508c1a67e02ae8f50e44cacfadb2 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 7069 + timestamp: 1733218168786 +- conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhcf101f3_2.conda + sha256: 25abdb37e186f0d6ac3b774a63c81c5bc4bf554b5096b51343fa5e7c381193b1 + md5: bea46844deb274b2cc2a3a941745fa73 + depends: + - python >=3.10 + - backports + - python + license: MIT + license_family: MIT + run_exports: {} + size: 35739 + timestamp: 1767290467820 +- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.7.0-py314h680f03e_1.conda + noarch: generic + sha256: ad0f78582ee64ec1c66a3daac32986e81b400d3ac719e5a3cbdb22e55065760e + md5: 67924260a851b5273e39f9b28b6b5e24 + depends: + - python >=3.14 + license: BSD-3-Clause AND MIT AND EPL-2.0 + run_exports: {} + size: 7539 + timestamp: 1788491291925 +- conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.15.0-pyha770c72_0.conda + sha256: aed4b9dcf68ec2a75e5645fed14d77fd884d38d2e52bfa6ef4b278d90cd88781 + md5: 3b261da3fe9b4168738712832410b022 + depends: + - python >=3.10 + - soupsieve >=1.2 + - typing-extensions + license: MIT + license_family: MIT + run_exports: {} + size: 92704 + timestamp: 1780853175566 +- conda: https://conda.anaconda.org/conda-forge/noarch/binaryornot-0.6.0-pyhcf101f3_0.conda + sha256: 1513cf9ab5285c823f90214eb8e638c0d065d3fa11120bfb7bb3cff1eb7a98d0 + md5: 980ed7a17e9279d5c0063d080cf13d0c + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 21898 + timestamp: 1773003768810 +- conda: https://conda.anaconda.org/conda-forge/noarch/black-26.5.1-pyh866005b_0.conda + sha256: f194e91242b26a7fd2244bf0ab0acb59c3f20ecbfe81d095d753e9183defbfb7 + md5: 651a8c2065be6883e86ec0e8471ed5ce + depends: + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9 + - platformdirs >=2 + - python >=3.11 + - pytokens >=0.4 + license: MIT + license_family: MIT + run_exports: {} + size: 176838 + timestamp: 1779460936776 +- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_0.conda + sha256: e03ba1a2b93fe0383c57920a9dc6b4e0c2c7972a3f214d531ed3c21dc8f8c717 + md5: b1a27250d70881943cca0dd6b4ba0956 + depends: + - python >=3.10 + - webencodings + - python + constrains: + - tinycss >=1.1.0,<1.5 + license: Apache-2.0 AND MIT + run_exports: {} + size: 141952 + timestamp: 1763589981635 +- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-h5f6438b_0.conda + sha256: f85f6b2c7938d8c20c80ce5b7e6349fafbb49294641b5648273c5f892b150768 + md5: 08a03378bc5293c6f97637323802f480 + depends: + - bleach ==6.3.0 pyhcf101f3_0 + - tinycss2 + license: Apache-2.0 AND MIT + run_exports: {} + size: 4386 + timestamp: 1763589981639 +- conda: https://conda.anaconda.org/conda-forge/noarch/branca-0.8.2-pyhd8ed1ab_0.conda + sha256: 1acf87c77d920edd098ddc91fa785efc10de871465dee0f463815b176e019e8b + md5: 1fcdf88e7a8c296d3df8409bf0690db4 + depends: + - jinja2 >=3 + - python >=3.10 + license: MIT + license_family: MIT + run_exports: {} + size: 30176 + timestamp: 1759755695447 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-h4c7d964_0.conda + sha256: 95e8e74062a5fe5f870ac8c90302b6e89945165fdaed7810606e84ddee6aac12 + md5: e27d2ac27b096dc51fedfcf775a53f9b + depends: + - __win + license: ISC + run_exports: {} + size: 132136 + timestamp: 1784754918886 +- conda: https://conda.anaconda.org/conda-forge/noarch/cattrs-26.2.0-pyh5ded981_0.conda + sha256: 1947ac548c91080b478bf90f94615e79f42632af59c41e2dbb575225a3e9f50e + md5: 5ab2877dc7e9fe13e16472cb35fc3cdb + depends: + - python >=3.11 + - attrs >=25.4.0 + - typing_extensions >=4.14.0 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 60888 + timestamp: 1788768842920 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + sha256: fb167de4388e64e52aa3907ed099afab944c1fa6e5f74b281a312dae1bcf7f3b + md5: 37e13edbe3b48f1095a9d085ef9cd83b + depends: + - python >=3.10 + license: ISC + run_exports: {} + size: 137015 + timestamp: 1784717699092 +- conda: https://conda.anaconda.org/conda-forge/noarch/chardet-7.6.0-pyhcf101f3_0.conda + sha256: 80874e53c80c2c0c96d718b5cd95e9a16c619e9ecf8a796768d4e125a3dcff83 + md5: c63ff7d1ea0ff4efbbdce9e64a4a176a + depends: + - python >=3.10 + - python + license: 0BSD + run_exports: {} + size: 672550 + timestamp: 1786923257918 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.5.1-pyhd8ed1ab_0.conda + sha256: cb60ef3e0631c8bacb4f7057196dee4496091a22baa3bb4b9bccb12c7e1c921b + md5: e0ac3accc64e23e40969d660e5f58ac8 + depends: + - python >=3.10 + license: MIT + license_family: MIT + run_exports: {} + size: 64487 + timestamp: 1786835648298 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.5.0-pyh5ded981_0.conda + sha256: 9afb0c2c089330321a219c7ee5a25313bd574d4024be606cbb33e7a5735df662 + md5: dea5b13a211bbf99876deb980b408a66 + depends: + - python >=3.11 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 112341 + timestamp: 1788802215348 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1.2-pyhd8ed1ab_0.conda + sha256: ba1ee6e2b2be3da41d70d0d51d1159010de900aa3f33fceaea8c52e9bd30a26e + md5: e9b05deb91c013e5224672a4ba9cf8d1 + depends: + - click >=4.0 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 12683 + timestamp: 1750848314962 +- conda: https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_2.conda + sha256: 1a52ae1febfcfb8f56211d1483a1ac4419b0028b7c3e9e61960a298978a42396 + md5: 55c7804f428719241a90b152016085a1 + depends: + - click >=4.0 + - python >=3.9,<4.0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 12521 + timestamp: 1733750069604 +- conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda + sha256: 4c287c2721d8a34c94928be8fe0e9a85754e90189dd4384a31b1806856b50a67 + md5: 61b8078a0905b12529abc622406cb62c + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 27353 + timestamp: 1765303462831 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda + sha256: 576a44729314ad9e4e5ebe055fbf48beb8116b60e58f9070278985b2b634f212 + md5: 2da13f2b299d8e1995bafbbe9689a2f7 + depends: + - python >=3.9 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 14690 + timestamp: 1753453984907 +- conda: https://conda.anaconda.org/conda-forge/noarch/cookiecutter-2.7.1-pyhcf101f3_0.conda + sha256: 4a8f3d2ca173925e4cf87b2d0ebd96ff4a9b6f25115cde0f1563eaf52f45f75a + md5: 99d0a571c453f147f32426905f976dea + depends: + - arrow + - binaryornot >=0.4.4 + - click >=7.0,<9.0.0 + - jinja2 >=2.7,<4.0.0 + - python >=3.10 + - python-slugify >=4.0.0 + - pyyaml >=5.3.1 + - requests >=2.23.0 + - rich + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 113921 + timestamp: 1772630675330 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.7-py314hd8ed1ab_106.conda + noarch: generic + sha256: fd701880cf6f696420aa5b4b530dbdf0c83a16bdb50aeb760b3159eec5c416bf + md5: 3b52b830ac00367685c08f98f50963bf + depends: + - python >=3.14,<3.15.0a0 + - python_abi * *_cp314 + license: Python-2.0 + run_exports: {} + size: 51289 + timestamp: 1788383537525 +- conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + sha256: bb47aec5338695ff8efbddbc669064a3b10fe34ad881fb8ad5d64fbfa6910ed1 + md5: 4c2a8fef270f6c69591889b93f9f55c1 + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 14778 + timestamp: 1764466758386 +- conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.3.1-pyhd8ed1ab_0.conda + sha256: 430bd9d731b265f0bedb3183ac3ecfaa1656390c092b6e864ff8cc1229843c8c + md5: 61dcf784d59ef0bd62c57d982b154ace + depends: + - python >=3.10 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 16102 + timestamp: 1779115228886 +- conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + sha256: 9717a059677553562a8f38ff07f3b9f61727bd614f505658b0a5ecbcf8df89be + md5: 961b3a227b437d82ad7054484cfa71b2 + depends: + - python >=3.6 + license: PSF-2.0 + license_family: PSF + run_exports: {} + size: 24062 + timestamp: 1615232388757 +- conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.3.1-pyhd8ed1ab_1.conda + sha256: 7d57a7b8266043ffb99d092ebc25e89a0a2490bed4146b9432c83c2c476fa94d + md5: 5498feb783ab29db6ca8845f68fa0f03 + depends: + - python >=3.10 + - wrapt <3,>=1.10 + license: MIT + license_family: MIT + run_exports: {} + size: 15896 + timestamp: 1768934186726 +- conda: https://conda.anaconda.org/conda-forge/noarch/diff-match-patch-20241021-pyhd8ed1ab_1.conda + sha256: 6122688de2d28c7beb479126ffb6bed38b1a06db48b461156d57f3e88f0b4a4a + md5: b132505f3e484a9519370e867842ba24 + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 41859 + timestamp: 1734637659366 +- conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.4.1-pyhcf101f3_0.conda + sha256: 1ef84c0cc4efd0c2d58c3cb365945edbd9ee42a1c54514d1ccba4b641005f757 + md5: 080a808fce955026bf82107d955d32da + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 95462 + timestamp: 1768863743943 +- conda: https://conda.anaconda.org/conda-forge/noarch/docstring-to-markdown-0.17-pyhe01879c_0.conda + sha256: 350662774c4648177ef2bd82eabfe7e0adb30524502f453d35fadff9c5a69b1f + md5: 66cb4c80ff13d7971adba487a5d12e74 + depends: + - python >=3.9 + - importlib-metadata >=3.6 + - typing_extensions >=4.6 + - python + license: LGPL-2.1-or-later + run_exports: {} + size: 46364 + timestamp: 1746284388518 +- conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda + sha256: 0d605569a77350fb681f9ed8d357cc71649b59a304099dc9d09fbeec5e84a65e + md5: d6bd3cd217e62bbd7efe67ff224cd667 + depends: + - python >=3.10 + license: CC-PDDC AND BSD-3-Clause AND BSD-2-Clause AND ZPL-2.1 + run_exports: {} + size: 438002 + timestamp: 1766092633160 +- conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + sha256: 210c8165a58fdbf16e626aac93cc4c14dbd551a01d1516be5ecad795d2422cad + md5: ff9efb7f7469aed3c4a8106ffa29593c + depends: + - python >=3.10 + license: MIT + license_family: MIT + run_exports: {} + size: 30753 + timestamp: 1756729456476 +- conda: https://conda.anaconda.org/conda-forge/noarch/flake8-7.1.2-pyhd8ed1ab_0.conda + sha256: a8ac1bf60dcc317e35614bfb5e49ff63a4874ccfc8212c3771fe0837946e9afe + md5: 5811f74de55030cb5f4054ab9a846139 + depends: + - mccabe >=0.7.0,<0.8.0 + - pycodestyle >=2.12.0,<2.13.0 + - pyflakes >=3.2.0,<3.3.0 + - python >=3.9 + license: MIT + license_family: MIT + run_exports: {} + size: 110777 + timestamp: 1739898510905 +- conda: https://conda.anaconda.org/conda-forge/noarch/folium-0.20.0-pyhd8ed1ab_0.conda + sha256: 782fa186d7677fd3bc1ff7adb4cc3585f7d2c7177c30bcbce21f8c177135c520 + md5: a6997a7dcd6673c0692c61dfeaea14ab + depends: + - branca >=0.6.0 + - jinja2 >=2.9 + - numpy + - python >=3.9 + - requests + - xyzservices + license: MIT + license_family: MIT + run_exports: {} + size: 82665 + timestamp: 1750113928159 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b + md5: 0c96522c6bdaed4b1566d11387caaf45 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 397370 + timestamp: 1566932522327 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c + md5: 34893075a5c9e55cdafac56607368fc6 + license: OFL-1.1 + license_family: Other + run_exports: {} + size: 96530 + timestamp: 1620479909603 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 + md5: 4d59c254e01d9cde7957100457e2d5fb + license: OFL-1.1 + license_family: Other + run_exports: {} + size: 700814 + timestamp: 1620479612257 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 + md5: 49023d73832ef61042f6a237cb2687e7 + license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 + license_family: Other + run_exports: {} + size: 1620504 + timestamp: 1727511233259 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 + md5: fee5683a3f04bd15cbd8318b096a27ab + depends: + - fonts-conda-forge + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 3667 + timestamp: 1566974674465 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 + md5: a7970cd949a077b7cb9696379d338681 + depends: + - font-ttf-ubuntu + - font-ttf-inconsolata + - font-ttf-dejavu-sans-mono + - font-ttf-source-code-pro + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 4059 + timestamp: 1762351264405 +- conda: https://conda.anaconda.org/conda-forge/noarch/frozenlist-1.8.0-pyhf298e5d_0.conda + sha256: 5f5a4e502981700b40ffbce6e3601ff5f95305839b5d5c49d1ef1c4ed33aadde + md5: 7a2d9f4d9f57da47251b2050b149bdf8 + depends: + - python >=3.10 + track_features: + - frozenlist_no_compile + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 19878 + timestamp: 1779999782801 +- conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.4-pyhd8ed1ab_0.conda + sha256: cd478c0835106afce2478d6dcc525854219c4e710c7b446e2dd5042bfc9da082 + md5: 99d77e0f92f7b0b977f77cfb49c7eaf6 + depends: + - folium + - geopandas-base 1.1.4 pyha770c72_0 + - mapclassify >=2.5.0 + - matplotlib-base + - pyogrio >=0.7.2 + - pyproj >=3.5.0 + - python >=3.10 + - xyzservices + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 8267 + timestamp: 1782507446937 +- conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.4-pyha770c72_0.conda + sha256: 77d0527d91c2a4bba135fdffb30557c88bacc22d7440c6632502609dd1ef0ab6 + md5: 6e31007c02f361338281bb78c5b84e7c + depends: + - numpy >=1.24 + - packaging + - pandas >=2.0.0 + - python >=3.10 + - shapely >=2.0.0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 255909 + timestamp: 1782507445933 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + sha256: 307dd6ec90140c3cf4171071b0e5e870abec314f4565c1edd5bc433e942cdcc0 + md5: e652ac7756069c456d0da2a922cd7df5 + depends: + - python >=3.10 + - hyperframe >=6.1,<7 + - hpack >=4.2,<5 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 100789 + timestamp: 1785796355216 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + sha256: fdcea5d7cb314485d3907192ef024c704311548c5b0cbeb390cd1951051e29d2 + md5: b395909221b9bd1df066e5930e18855b + depends: + - python >=3.10 + license: MIT + license_family: MIT + run_exports: {} + size: 32884 + timestamp: 1782283986153 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 + md5: 8e6923fc12f1fe8f8c4e5c9f343256ac + depends: + - python >=3.9 + license: MIT + license_family: MIT + run_exports: {} + size: 17397 + timestamp: 1737618427549 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + sha256: 1c35a59c1545ad0fdaddf1fbde7bcfa6ef41a8d68c3a2b0b4a291be00676163e + md5: a39ae05027e9b707742e41b30d296b75 + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 177433 + timestamp: 1787059857580 +- conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.1-pyhd8ed1ab_0.conda + sha256: 4e787f9ccc31053ccea56d98ecd284a4f788988a3f9c4627db72fdd0b127529b + md5: ebc56022e4ef7e74a829be94c53797ca + depends: + - python >=3.10 + license: MIT + license_family: MIT + run_exports: {} + size: 21467 + timestamp: 1787649248672 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.1-pyhcf101f3_0.conda + sha256: 95a074a7d3f58b3494c068d4789c364dcb591c56b70ca6b12f149a540f9aeea4 + md5: 77ec68e0aa61c3fff9ecbf840f93d64e + depends: + - python >=3.10 + - zipp >=3.20 + - python + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 34920 + timestamp: 1787943971257 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda + sha256: a563a51aa522998172838e867e6dedcf630bc45796e8612f5a1f6d73e9c8125a + md5: 0ba6225c279baf7ea9473a62ea0ec9ae + depends: + - python >=3.10 + - zipp >=3.1.0 + constrains: + - importlib-resources >=7.1.0,<7.1.1.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 34809 + timestamp: 1776068839274 +- conda: https://conda.anaconda.org/conda-forge/noarch/inflection-0.5.1-pyhd8ed1ab_1.conda + sha256: 8911490cb120f760ca1234288a2767ef6de4ee47416bfda0cc1c3919ff001da4 + md5: 12fcab817a0b8df370db76ce08556b60 + depends: + - python >=3.9 + license: MIT + license_family: MIT + run_exports: {} + size: 11730 + timestamp: 1734732240967 +- conda: https://conda.anaconda.org/conda-forge/noarch/intervaltree-3.1.0-pyhd8ed1ab_1.conda + sha256: 5d7f0d432772b2a1a750cd61b522e9c283dad04058a130656c95ad3321a308c5 + md5: e32bb5b0369e819c4dde653d4c4572f3 + depends: + - python >=2.7 + - sortedcontainers + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 27592 + timestamp: 1683532332879 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.31.0-pyh6dadd2b_0.conda + sha256: 620bed30fed3942e52f63f0e7a9effdcaacf4aa2214145e052f3af143f211dec + md5: 192487fef6ebc9f726eaffb119a84286 + depends: + - python + - __win + - comm >=0.1.1 + - debugpy >=1.6.5 + - ipython >=7.23.1 + - jupyter_client >=8.0.0 + - jupyter_core >=4.12,!=5.0.* + - matplotlib-inline >=0.1 + - nest-asyncio >=1.4 + - packaging >=22 + - psutil >=5.7 + - python >=3.10 + - pyzmq >=25 + - tornado >=6.2 + - traitlets >=5.4.0 + - python + constrains: + - appnope >=0.1.2 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 128350 + timestamp: 1760967073264 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.17.1-pyhe2676ad_0.conda + sha256: 0269b9ccc59fad27d6787ef3e4d87cf214e6ebe2b2015fd50038df24d24701d0 + md5: 5c9214b277a8d24de70ef51bbf967c63 + depends: + - __win + - ipython_pygments_lexers >=1.0.0 + - jedi >=0.18.2 + - matplotlib-inline >=0.1.6 + - prompt-toolkit >=3.0.41,<3.1.0 + - psutil >=7 + - pygments >=2.14.0 + - python >=3.11 + - stack_data >=0.6.0 + - traitlets >=5.13.0 + - typing_extensions >=4.6 + - colorama >=0.4.4 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 729793 + timestamp: 1788260382682 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda + sha256: 894682a42a7d659ae12878dbcb274516a7031bbea9104e92f8e88c1f2765a104 + md5: bd80ba060603cc228d9d81c257093119 + depends: + - pygments + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 13993 + timestamp: 1737123723464 +- conda: https://conda.anaconda.org/conda-forge/noarch/isort-9.0.1-pyhd8ed1ab_0.conda + sha256: 4975afff44b4c3b63804010d6998aae26996bbfe987132e24c8953f5d5d6c550 + md5: e8665745d29e065eb0cb912f535fcdb0 + depends: + - importlib-metadata >=4.6.0 + - mypy_extensions >=1.1.0 + - python >=3.10,<4.0 + license: MIT + license_family: MIT + run_exports: {} + size: 80778 + timestamp: 1787873673455 +- conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhcf101f3_3.conda + sha256: 3cc991f0f09dfd00d2626e745ba68da03e4f1dcbb7b36dd20f7a7373643cd5d5 + md5: d59568bad316413c89831456e691de29 + depends: + - python >=3.10 + - more-itertools + - python + license: MIT + license_family: MIT + run_exports: {} + size: 14831 + timestamp: 1767294269456 +- conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-6.1.2-pyhcf101f3_0.conda + sha256: 108b3919db8ef81b5585b38a3fedbe9eeccdf8fa576c250a13559a1188f597cc + md5: b9d2b1ffa307961f6bb7d83c8ba8a8be + depends: + - python >=3.10 + - backports.tarfile + - python + license: MIT + license_family: MIT + run_exports: {} + size: 16222 + timestamp: 1776862415793 +- conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.6.0-pyhcf101f3_0.conda + sha256: d23b9e8e8d5968699ec2bc9f8d182598e86e494dbe8a3a71b4a53b1be9a3cb16 + md5: 8665b873062a31a90b563bf493f9fb2c + depends: + - python >=3.10 + - more-itertools + - python + license: MIT + license_family: MIT + run_exports: {} + size: 18997 + timestamp: 1784015600777 +- conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.20.0-pyhcf101f3_0.conda + sha256: 744143551c1c7b528b82533fb641b9d7db20b2203abc4c2635c387fa6c089fc3 + md5: c2b3d37aa1411031126036ee76a8a861 + depends: + - python >=3.10 + - parso >=0.8.6,<0.9.0 + - python + license: Apache-2.0 AND MIT + run_exports: {} + size: 2715215 + timestamp: 1782251948616 +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + sha256: fc9ca7348a4f25fed2079f2153ecdcf5f9cf2a0bc36c4172420ca09e1849df7b + md5: 04558c96691bed63104678757beb4f8d + depends: + - markupsafe >=2.0 + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 120685 + timestamp: 1764517220861 +- conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.6.0-pyhcf101f3_0.conda + sha256: 96b76ace583404ce4fbc234baa6cdb3de485887913104d4ac51994f9b6656696 + md5: 4ebc70ef1af2e21cdc8edb1bfa1ec28d + depends: + - python >=3.10 + - cloudpickle >=3.0 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 228858 + timestamp: 1788177170105 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_1.conda + sha256: 328756a4555941d57af4a5f553e5d8598e9f3b37db028f557e30f9f0b3086db6 + md5: 204b5ca91eba7738790ecc333facbbbe + depends: + - attrs >=22.2.0 + - jsonschema-specifications >=2023.3.6 + - python >=3.10 + - referencing >=0.28.4 + - rpds-py >=0.25.0 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 82084 + timestamp: 1787579299493 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda + sha256: 0a4f3b132f0faca10c89fdf3b60e15abb62ded6fa80aebfc007d05965192aa04 + md5: 439cd0f567d697b20a8f45cb70a1005a + depends: + - python >=3.10 + - referencing >=0.31.0 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 19236 + timestamp: 1757335715225 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.10.0-pyhcf101f3_0.conda + sha256: 94f11bbdbac51a68415fb0a8bb441fb3475c0138e778664a3fb48f5698688ebf + md5: 85130259a26c023f53108dc9ab1cfb44 + depends: + - jupyter_core >=5.1 + - python >=3.10 + - python-dateutil >=2.8.2 + - pyzmq >=25.0 + - tornado >=6.4.1 + - traitlets >=5.3 + - typing_extensions >=4.13.0 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 118962 + timestamp: 1787929615607 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyh6dadd2b_0.conda + sha256: ed709a6c25b731e01563521ef338b93986cd14b5bc17f35e9382000864872ccc + md5: a8db462b01221e9f5135be466faeb3e0 + depends: + - __win + - pywin32 + - platformdirs >=2.5 + - python >=3.10 + - traitlets >=5.3 + - python + constrains: + - pywin32 >=300 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 64679 + timestamp: 1760643889625 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda + sha256: dc24b900742fdaf1e077d9a3458fd865711de80bca95fe3c6d46610c532c6ef0 + md5: fd312693df06da3578383232528c468d + depends: + - pygments >=2.4.1,<3 + - python >=3.9 + constrains: + - jupyterlab >=4.0.8,<5.0.0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 18711 + timestamp: 1733328194037 +- conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.7.0-pyh7428d3b_0.conda + sha256: ed76a29fd1dbaf1bb24058191386618315ab9e35da9ef9a76da232cd6885165b + md5: e91b0f2040c580527ccc54665aa7cdba + depends: + - __win + - importlib-metadata >=4.11.4 + - importlib_resources + - jaraco.classes + - jaraco.context + - jaraco.functools + - python >=3.10 + - pywin32-ctypes >=0.2.0 + license: MIT + license_family: MIT + run_exports: {} + size: 38153 + timestamp: 1763320939579 +- conda: https://conda.anaconda.org/conda-forge/noarch/lsprotocol-2025.0.0-pyhe01879c_0.conda + sha256: c530344ab48b6bf44a441f742e99898c481fba8ef9b96037adf261beda0f936f + md5: f0680112562ae328ef9ce60545879cf9 + depends: + - attrs >=21.3.0 + - cattrs !=23.2.1 + - python >=3.9 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 155528 + timestamp: 1750264551204 +- conda: https://conda.anaconda.org/conda-forge/noarch/mapclassify-2.11.0-pyhd8ed1ab_0.conda + sha256: 791137f3e107c73315c74bb0c7be34e5f7c36da1828efbc4584544311121484c + md5: 0323c95182d828bb1bcf708c4077db3b + depends: + - networkx >=3.4 + - numpy >=2.0 + - pandas >=2.3 + - python >=3.12 + - scikit-learn >=1.5 + - scipy >=1.14 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 448635 + timestamp: 1786480374013 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda + sha256: 0c4c35376fe920714390d46e4b8d31c876d65f18e1655899e0763ec25f2a902f + md5: 6d03368f2b2b0a5fb6839df53b2eb5e0 + depends: + - mdurl >=0.1,<1 + - python >=3.10 + license: MIT + license_family: MIT + run_exports: {} + size: 69017 + timestamp: 1778169663339 +- conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda + sha256: 35b43d7343f74452307fd018a1cca92b8f68961ff8e2ab6a81ce0a703c9a3764 + md5: 9acc1c385be401d533ff70ef5b50dae6 + depends: + - python >=3.10 + - traitlets + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 15725 + timestamp: 1778264403247 +- conda: https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_1.conda + sha256: 9b0037171dad0100f0296699a11ae7d355237b55f42f9094aebc0f41512d96a1 + md5: 827064ddfe0de2917fb29f1da4f8f533 + depends: + - python >=3.9 + license: MIT + license_family: MIT + run_exports: {} + size: 12934 + timestamp: 1733216573915 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 + md5: 592132998493b3ff25fd7479396e8351 + depends: + - python >=3.9 + license: MIT + license_family: MIT + run_exports: {} + size: 14465 + timestamp: 1733255681319 +- conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.3.4-pyhcf101f3_0.conda + sha256: 306af633cb4ac85d04024d7c243ac2031c488bf5b0912207e7304c27a5d65a85 + md5: 1c0ebec41ef9214160da1ee6a0880fce + depends: + - python >=3.10 + - typing_extensions + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 93811 + timestamp: 1784722859728 +- conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-11.1.0-pyhcf101f3_0.conda + sha256: 6725c1c8db9d025db763e1bba1acdcff2eb2ae20a7766a71512ea84081033288 + md5: 0e694257dbf916540b749c3ffc808efe + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 71270 + timestamp: 1779478190496 +- conda: https://conda.anaconda.org/conda-forge/noarch/multidict-6.7.1-pyh62beb40_0.conda + sha256: e9933d2526345a4a1c08b76f2322dd482122b683369b0536605353b5b153d755 + md5: ad92dba7ca0af0e3dca083a0fa6a3423 + depends: + - python >=3.10 + - typing-extensions >=4.1.0 + track_features: + - multidict_no_compile + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 37745 + timestamp: 1771610804457 +- conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + sha256: d09c47c2cf456de5c09fa66d2c3c5035aa1fa228a1983a433c47b876aa16ce90 + md5: 37293a85a0f4f77bbd9cf7aaefc62609 + depends: + - python >=3.9 + license: Apache-2.0 + license_family: Apache + run_exports: {} + size: 15851 + timestamp: 1749895533014 +- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + sha256: 6ed158e4e5dd8f6a10ad9e525631e35cee8557718f83de7a4e3966b1f772c4b1 + md5: e9c622e0d00fa24a6292279af3ab6d06 + depends: + - python >=3.9 + license: MIT + license_family: MIT + run_exports: {} + size: 11766 + timestamp: 1745776666688 +- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.26.0-pyh5ded981_0.conda + sha256: 54b91bd1aa1687b92f9e2fa5169bbf9f2bc1c428179109dd9e9fcc6b2e8c9479 + md5: afb7146667be7c8121f5f8337be60680 + depends: + - python >=3.11 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 296900 + timestamp: 1788964134075 +- conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.11.0-pyhcf101f3_1.conda + sha256: e67b9cec57bbf729a13c158abc6f6f9483324a3b3d454198c4df647bf1484163 + md5: 078709c0ef924f3bc331d0a9b5eae3d7 + depends: + - python >=3.10 + - jupyter_client >=7.0.0 + - jupyter_core >=5.4 + - nbformat >=5.2.0 + - traitlets >=5.13 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 29971 + timestamp: 1788212974885 +- conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.17.1-hb502eef_0.conda + sha256: 6b6d96cca8e9dd34e0735b59534831e1f8206b7366c79c71e08da6ee55c50683 + md5: 02669c36935d23e5258c5dd1a5e601ab + depends: + - nbconvert-core ==7.17.1 pyhcf101f3_0 + - nbconvert-pandoc ==7.17.1 h08b4883_0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 5364 + timestamp: 1775615493260 +- conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.1-pyhcf101f3_0.conda + sha256: ab2ac79c5892c5434d50b3542d96645bdaa06d025b6e03734be29200de248ac2 + md5: 2bce0d047658a91b99441390b9b27045 + depends: + - beautifulsoup4 + - bleach-with-css !=5.0.0 + - defusedxml + - importlib-metadata >=3.6 + - jinja2 >=3.0 + - jupyter_core >=4.7 + - jupyterlab_pygments + - markupsafe >=2.0 + - mistune >=2.0.3,<4 + - nbclient >=0.5.0 + - nbformat >=5.7 + - packaging + - pandocfilters >=1.4.1 + - pygments >=2.4.1 + - python >=3.10 + - traitlets >=5.1 + - python + constrains: + - pandoc >=2.9.2,<4.0.0 + - nbconvert ==7.17.1 *_0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 202229 + timestamp: 1775615493260 +- conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.17.1-h08b4883_0.conda + sha256: b576268b5b3da13b703a15d28d218fd1b552511726253575025930091e6206ae + md5: f635af333701d2ed89d70ba9adb8e2ee + depends: + - nbconvert-core ==7.17.1 pyhcf101f3_0 + - pandoc + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 5840 + timestamp: 1775615493260 +- conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.11.1-pyhcf101f3_0.conda + sha256: d85d76827ff732e1639f50f45e4d7d3387a27abd857b194dcbb5bb4166c2a7c2 + md5: 2fbbf92e1173ae024f0b12759c1e64a1 + depends: + - jsonschema >=2.6 + - jupyter_core >=4.12,!=5.0.* + - python >=3.10 + - python-fastjsonschema >=2.15 + - traitlets >=5.1 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 107750 + timestamp: 1787133512599 +- conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + sha256: bb7b21d7fd0445ddc0631f64e66d91a179de4ba920b8381f29b9d006a42788c0 + md5: 598fd7d4d0de2455fb74f56063969a97 + depends: + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 11543 + timestamp: 1733325673691 +- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + sha256: f6a82172afc50e54741f6f84527ef10424326611503c64e359e25a19a8e4c1c6 + md5: a2c1eeadae7a309daed9d62c96012a2b + depends: + - python >=3.11 + - python + constrains: + - numpy >=1.25 + - scipy >=1.11.2 + - matplotlib-base >=3.8 + - pandas >=2.0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 1587439 + timestamp: 1765215107045 +- conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda + sha256: 482d94fce136c4352b18c6397b9faf0a3149bfb12499ab1ffebad8db0cb6678f + md5: 3aa4b625f20f55cf68e92df5e5bf3c39 + depends: + - python >=3.10 + - sphinx >=6 + - tomli >=1.1.0 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 65801 + timestamp: 1764715638266 +- conda: https://conda.anaconda.org/conda-forge/noarch/osmnx-2.1.1-ha770c72_0.conda + noarch: python + sha256: 564c603045f3cb59fdd068a0d30c57d63980cdb0cd9d8abeafb17b4beaedcb42 + md5: 1a6e04eca581e716700624cecd69a2b0 + depends: + - matplotlib-base >=3.6 + - osmnx-base 2.1.1 pyhd8ed1ab_0 + - rasterio >=1.4 + - rio-vrt >=0.3 + - scikit-learn >=1.2 + - scipy >=1.10 + license: MIT + license_family: MIT + run_exports: {} + size: 7423 + timestamp: 1784695550398 +- conda: https://conda.anaconda.org/conda-forge/noarch/osmnx-base-2.1.1-pyhd8ed1ab_0.conda + sha256: d3eac9b683582cb53518d4ea62c5effd0dcc3440753b659a3636703bb6e4a0b8 + md5: fe3a2671b5da9bbf674dc7af75039b45 + depends: + - geopandas >=1.0.1 + - networkx >=2.5 + - numpy >=1.24 + - pandas >=1.5 + - python >=3.11 + - requests >=2.30 + - shapely >=2.0 + license: MIT + license_family: MIT + run_exports: {} + size: 85308 + timestamp: 1784695549749 +- conda: https://conda.anaconda.org/conda-forge/noarch/owslib-0.36.0-pyhc364b38_0.conda + sha256: 4d600495cfa40cc9e5ed10bb3f4176ebce49434e0354278ebc24166087fe5aca + md5: a315fcc6ca1a05be066fed821c897ae5 + depends: + - python >=3.12 + - lxml + - python-dateutil + - pyyaml + - requests + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 165464 + timestamp: 1780575498231 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + sha256: c432626b16768b8dab228bfb706f7060c2d462a21c516d240f68f2f902b5a044 + md5: 936687ed80f295a1f5dbcf8bd34c252c + depends: + - python >=3.9 + - python + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 116363 + timestamp: 1785888127370 +- conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 + sha256: 2bb9ba9857f4774b85900c2562f7e711d08dd48e2add9bee4e1612fbee27e16f + md5: 457c2c8c08e54905d6954e79cb5b5db9 + depends: + - python !=3.0,!=3.1,!=3.2,!=3.3 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 11627 + timestamp: 1631603397334 +- conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda + sha256: 611882f7944b467281c46644ffde6c5145d1a7730388bcde26e7e86819b0998e + md5: 39894c952938276405a1bd30e4ce2caf + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 82472 + timestamp: 1777722955579 +- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda + sha256: 6eaee417d33f298db79bc7185ab1208604c0e6cf51dade34cd513c6f9db9c6f3 + md5: 11adc78451c998c0fd162584abfa3559 + depends: + - python >=3.10 + license: MPL-2.0 + license_family: MOZILLA + run_exports: {} + size: 56559 + timestamp: 1777271601895 +- conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda + sha256: 202af1de83b585d36445dc1fda94266697341994d1a3328fabde4989e1b3d07a + md5: d0d408b1f18883a944376da5cf8101ea + depends: + - ptyprocess >=0.5 + - python >=3.9 + license: ISC + run_exports: {} + size: 53561 + timestamp: 1733302019362 +- conda: https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda + sha256: e2ac3d66c367dada209fc6da43e645672364b9fd5f9d28b9f016e24b81af475b + md5: 11a9d1d09a3615fc07c3faf79bc0b943 + depends: + - python >=3.9 + license: MIT + license_family: MIT + run_exports: {} + size: 11748 + timestamp: 1733327448200 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.11.8-pyh5ded981_0.conda + sha256: 8cbae1fed8437e63c9bcc691927402edb3809fccb26b15eb095df7dd2eb73e5f + md5: 48e9ecf08b0578a4313f13b2e2b0fd72 + depends: + - python >=3.11 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 27718 + timestamp: 1788959137036 +- conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + sha256: e14aafa63efa0528ca99ba568eaf506eb55a0371d12e6250aaaa61718d2eb62e + md5: d7585b6550ad04c8c5e21097ada2888e + depends: + - python >=3.9 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 25877 + timestamp: 1764896838868 +- conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_3.conda + sha256: bae453e5cecf19cab23c2e8929c6e30f4866d996a8058be16c797ed4b935461f + md5: fd5062942bfa1b0bd5e0d2a4397b099e + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 49052 + timestamp: 1733239818090 +- conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.53-pyha770c72_0.conda + sha256: efe8def2c93aa34cd8d3c9af1dc4c7d312791cf769d8b2b615e32733e6df6051 + md5: 39c92a39517316e5001d645ae63d9ab9 + depends: + - python >=3.10 + - wcwidth + constrains: + - prompt_toolkit 3.0.53 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 276081 + timestamp: 1785160613307 +- conda: https://conda.anaconda.org/conda-forge/noarch/propcache-0.5.2-pyh7db6752_0.conda + sha256: c9be65d8dd0b34a795be877359468f2a5cb521c63f264de8c4e5a6141e19df30 + md5: e3cbba0c0ab42143adeefd1d09866695 + depends: + - python >=3.10 + track_features: + - propcache_no_compile + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 19936 + timestamp: 1780037707071 +- conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda + sha256: a7713dfe30faf17508ec359e0bc7e0983f5d94682492469bd462cdaae9c64d83 + md5: 7d9daffbb8d8e0af0f769dbbcd173a54 + depends: + - python >=3.9 + license: ISC + run_exports: {} + size: 19457 + timestamp: 1733302371990 +- conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.4-pyhd8ed1ab_0.conda + sha256: 2151e981a422ef57031482b28df9c8432d54c1f44996e7760774813f167be863 + md5: 35993ea8ef5e76333e6efb6a0ffb3771 + depends: + - python >=3.11 + license: MIT + license_family: MIT + run_exports: {} + size: 18473 + timestamp: 1789159440378 +- conda: https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.12.1-pyhd8ed1ab_1.conda + sha256: 8671d9dcbf458adb6435616ded0fd71925f0fa1b074528604db2f64fac54bf52 + md5: e895db5e6cee923018cbb1656c8ca7fa + depends: + - python >=3.9 + license: MIT + license_family: MIT + run_exports: {} + size: 34350 + timestamp: 1733216302933 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyconify-0.2.1-pyhd8ed1ab_0.conda + sha256: 655e8d5bb3b8d6b9829c3d673f62d2c11d73e55e9fcd932c889e0ede8c302cff + md5: a36f0190135897b1ecfb0b652922cabe + depends: + - python >=3.9 + - requests + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 23211 + timestamp: 1738865313444 +- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda + sha256: e27e0473fc6723311a0bd48b89b616fa1b996a2f7a2b555338cbbcfb9c640568 + md5: 9c5491066224083c41b6d5635ed7107b + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 55886 + timestamp: 1779293633166 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_1.conda + sha256: 83ab8434e3baf6a018914da4f1c2ae9023e23fb41e131b68b3e3f9ca41ecef61 + md5: a36aa6e0119331d3280f4bba043314c7 + depends: + - python >=3.9 + - snowballstemmer >=2.2.0 + - tomli >=1.2.3 + license: MIT + license_family: MIT + run_exports: {} + size: 40236 + timestamp: 1733261742916 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyflakes-3.2.0-pyhd8ed1ab_1.conda + sha256: 22aa7a4d67c3907da5bbf2b97dbe34061c390ea7ba99e9d75ee581956270e129 + md5: 4731450b2c059fc567696242bcb7fc05 + depends: + - python >=3.9 + license: MIT + license_family: MIT + run_exports: {} + size: 58379 + timestamp: 1733216158448 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygithub-2.10.0-pyhd8ed1ab_0.conda + sha256: 9f99219ebad4ce788c9ad07b76398d3d2075d25ae3eeddf788d91e4f5c594eb0 + md5: f8688c6bd088a1812aa44701af0dad90 + depends: + - cryptography >=3.4.0 + - deprecated + - pyjwt >=2.4.0 + - pynacl >=1.4.0 + - python >=3.7 + - python-dateutil + - requests >=2.14.0 + - typing-extensions >=4.0.0 + - urllib3 >=1.26.0 + license: LGPL-3.0-only + license_family: LGPL + run_exports: {} + size: 189493 + timestamp: 1787231951044 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + sha256: f5f015ff1bc3e1b7fc08eee096b1865234189ae0b82bebdb86a5369116e42fa0 + md5: 2882dee445dfa45b0c5afce3ffb7730a + depends: + - python >=3.10 + - python + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 959376 + timestamp: 1786995678795 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.13.0-pyhcf101f3_0.conda + sha256: 58cda7489477fecb859ec95bf73cba7e4634db1a517e29e0d3086d7ec71733ae + md5: edb808d7f7396478ab6e457e697b8ec5 + depends: + - python >=3.10 + - typing_extensions >=4.0 + - python + constrains: + - cryptography >=3.4.0 + license: MIT + license_family: MIT + run_exports: {} + size: 33417 + timestamp: 1779400286454 +- conda: https://conda.anaconda.org/conda-forge/noarch/pylint-4.0.8-pyhcf101f3_0.conda + sha256: 9e037b4f94e5f7f8accd214d6611970b9949ae4eb8f8da9f0b2044dda1848d20 + md5: 80d0380362bf3d3c0b4ed5c103d253b5 + depends: + - astroid >=4.0.2,<=4.1.dev0 + - colorama >=0.4.5 + - isort >=5,!=5.13,<10 + - mccabe >=0.6,<0.8 + - platformdirs >=2.2 + - python >=3.10 + - tomli >=1.1 + - tomlkit >=0.10.1 + - dill >=0.3.7 + - python + license: GPL-2.0-or-later + license_family: GPL + run_exports: {} + size: 394288 + timestamp: 1788027350854 +- conda: https://conda.anaconda.org/conda-forge/noarch/pylint-venv-3.0.4-pyhd8ed1ab_1.conda + sha256: 4672f0a4a1a3febd24d0d686f82e3997b22d8c5e48b7e58e6fb05bb655715e34 + md5: ad668c59132b510f9d9845d4a6410af7 + depends: + - python >=3.9 + license: MIT + license_family: MIT + run_exports: {} + size: 11217 + timestamp: 1734789381663 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyls-spyder-0.4.0-pyhd8ed1ab_1.conda + sha256: 6510f09383449453a054bb62b6fac3cb9defb1580ffa8b6fbe294a6ce061f9be + md5: d8ab2d4bb3685f4ded64fbb951ab59c8 + depends: + - python >=3.9 + - python-lsp-server >=1.0.1 + license: MIT + license_family: MIT + run_exports: {} + size: 12176 + timestamp: 1736029962406 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyopenssl-26.4.0-pyhcf101f3_0.conda + sha256: 59e6b7719944ef4e9526a45c840659cbd720677680fee869d9bd266cdc72c59b + md5: a72c0cc58a3d3b40ecd180882de7f502 + depends: + - python >=3.10 + - cryptography >=49.0.0,<51 + - typing_extensions >=4.9 + - python + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 129871 + timestamp: 1785639559206 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + sha256: 417fba4783e528ee732afa82999300859b065dc59927344b4859c64aae7182de + md5: 3687cc0b82a8b4c17e1f0eb7e47163d5 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 110893 + timestamp: 1769003998136 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda + sha256: d016e04b0e12063fbee4a2d5fbb9b39a8d191b5a0042f0b8459188aedeabb0ca + md5: e2fd202833c4a981ce8a65974fe4abd1 + depends: + - __win + - python >=3.9 + - win_inet_pton + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 21784 + timestamp: 1733217448189 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664 + md5: 5b8d21249ff20967101ffa321cab24e8 + depends: + - python >=3.9 + - six >=1.5 + - python + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 233310 + timestamp: 1751104122689 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.22.2-pyhcf101f3_0.conda + sha256: fc4a704822df22defce49d0fb811fdc036a1fd3b579aeaa601228e9cfd198b3d + md5: aa75b7f096d17621bc307b3025b29461 + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 254446 + timestamp: 1786892280524 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.7-h4df99d1_106.conda + sha256: 801ef80bc9f9394d9b3b5cae5a90c33cbbc33004b3e93195b93af818aad8888b + md5: b672ecb44198ade19ef249bf99f4b1ff + depends: + - cpython 3.14.7.* + - python_abi * *_cp314 + license: Python-2.0 + run_exports: {} + size: 51276 + timestamp: 1788383547342 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-lsp-black-2.0.0-pyhff2d567_1.conda + sha256: fadfcbd4aa6ed015dbc96cb898e66044063f02c8342bf267ed2cc99e4e437276 + md5: 4b3980de0e40419f70599f56067f63b6 + depends: + - black >=23.11.0 + - python >=3.9 + - python-lsp-server >=1.4.0 + - tomli + license: MIT + license_family: MIT + run_exports: {} + size: 12611 + timestamp: 1736030033740 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-lsp-jsonrpc-1.1.2-pyhff2d567_1.conda + sha256: 32d11f2f41acd2c388de417d0bf117ba22d8a11e3d08a97546f959966eb08854 + md5: 1e4f4f40c7ec8a0e220d5b7740c94568 + depends: + - python >=3.9 + - ujson >=3.0.0 + license: MIT + license_family: MIT + run_exports: {} + size: 13946 + timestamp: 1736013560597 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-lsp-ruff-2.3.4-pyh5ded981_0.conda + sha256: 5e863077819b709fb71d57dd06e2b7f130256cbbeac831a232f5be562adb7b39 + md5: 3dde85fa845ce5844b378ad726c88787 + depends: + - lsprotocol >=2023.0.1 + - cattrs !=23.2.1 + - python >=3.11 + - python-lsp-server-base + - ruff >=0.8.0 + - tomli >=1.1.0 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 22687 + timestamp: 1788874996969 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-lsp-server-1.15.0-pyh332efcf_0.conda + sha256: 7cead79cc00c96a06bba1dadc3732f57835b013453ca6b0aa6c0ac7f31cd3f0c + md5: 18af07b464e0ab6851b2432d1d15472d + depends: + - autopep8 >=2.0.4,<2.1.0 + - flake8 >=7.1.0,<8.0.0 + - mccabe >=0.7.0,<0.8.0 + - pycodestyle >=2.12.0,<2.13.0 + - pydocstyle >=6.3.0,<6.4.0 + - pyflakes >=3.2.0,<3.3.0 + - pylint >=3.1.0,<4.1.0 + - python >=3.10 + - python-lsp-server-base 1.15.0 pyhd8ed1ab_0 + - rope >=1.11.0 + - whatthepatch >=1.0.2,<2.0.0 + - yapf >=0.33.0 + license: MIT + license_family: MIT + run_exports: {} + size: 8195 + timestamp: 1785177754350 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-lsp-server-base-1.15.0-pyhd8ed1ab_0.conda + sha256: e77216362f7f87c503bf70fd11adfc8e68b2d13baa3e31a52cc153398c110f9e + md5: e3206c9455c2da988f5b1384c8958e1e + depends: + - black + - docstring-to-markdown + - importlib-metadata >=4.8.3 + - jedi >=0.17.2,<0.21 + - pluggy >=1.0.0 + - python >=3.10 + - python-lsp-jsonrpc >=1.1.0,<2.0.0 + - ujson >=3.0.0 + license: MIT + license_family: MIT + run_exports: {} + size: 64676 + timestamp: 1785177743404 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-slugify-9.0.0-pyh5ded981_0.conda + sha256: 07976d58746a7a903d076f8bd87fbbc09d64c4c7e5a6f1a88ab8b315aa1f8326 + md5: 1d67e7eaa0d0bd69743ccd1d2589cecb + depends: + - python >=3.11 + - text-unidecode >=1.3 + - python + constrains: + - awesome-slugify <0 + - slugify <0 + - anyascii >=0.3.2 + - unidecode >=1.1.1 + license: MIT + license_family: MIT + run_exports: {} + size: 23505 + timestamp: 1788980710413 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.3-pyhd8ed1ab_0.conda + sha256: 3f05db78cf8be33cf6dbc469664b8e3a01f3980d61d6d6bef48669b171896d8a + md5: eefc8d916bd2e708d76d40398ef9a1ee + depends: + - python >=3.10 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 146862 + timestamp: 1783704822814 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-9_cp314.conda + build_number: 9 + sha256: e7f8e965bbfb98e08feb2365cacdad8bb218fa5b5a0a2752f747287f425f213c + md5: 350d89b50d7de805abf2e63e29dee451 + constrains: + - python 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 6791 + timestamp: 1788302824440 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytoolconfig-1.3.1-pyh5ded981_0.conda + sha256: b62c3a715f40da7dc70286c41c2f8d3b13388680226cca7d4f412428e206f155 + md5: 0cafd37f742a632ea08571596bc1ea0d + depends: + - packaging >=23.2 + - python >=3.11 + - tomli >=2.0.1 + - python + license: LGPL-3.0-or-later + run_exports: {} + size: 23691 + timestamp: 1789534127723 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyuca-1.2-pyhd8ed1ab_2.conda + sha256: b9fdcd5db70888197666db294f35786ecffcc87b4e25ba3255a80c00f94d4f40 + md5: 9170b1b8b46b45398d728db43954df9e + depends: + - python >=3.9 + license: MIT + license_family: MIT + run_exports: {} + size: 587443 + timestamp: 1734685625275 +- conda: https://conda.anaconda.org/conda-forge/noarch/qdarkstyle-3.2.3-pyhd8ed1ab_1.conda + sha256: 0a5a40838f724bcfe575c9324ddd9b84fb8711aed5a70c203f5f538d9f5b9631 + md5: b5d204064e9c816535282a94f30a40c9 + depends: + - python >=3.9 + - qtpy >=2.0 + license: MIT + license_family: MIT + run_exports: {} + size: 630017 + timestamp: 1736088748069 +- conda: https://conda.anaconda.org/conda-forge/noarch/qstylizer-0.2.4-pyhff2d567_0.conda + sha256: ed6085a9d40b03c257401e6334c0013774bfc98c04ff4e2406d99471ac07e7a9 + md5: 3fd86b7a305f1464841cfcd722a931ad + depends: + - inflection >0.3.0,<1.0 + - python >=3.9 + - tinycss2 >=1.1.0,<2.0 + license: MIT + license_family: MIT + run_exports: {} + size: 19049 + timestamp: 1732205032979 +- conda: https://conda.anaconda.org/conda-forge/noarch/qtawesome-1.4.2-pyh9208f05_0.conda + sha256: 9cd01044d3fa382e0701a0825ba9f03428a5124aac84ca69478fca31b588c8b9 + md5: 896a5896ee8709d6b3939c9b2f65a441 + depends: + - python >=3.10 + - qtpy + license: MIT + license_family: MIT + run_exports: {} + size: 1784137 + timestamp: 1775848014921 +- conda: https://conda.anaconda.org/conda-forge/noarch/qtconsole-5.7.2-pyhd8ed1ab_0.conda + sha256: 890fdf416cb1cb29bfe502fb1b038b60a87a6cdffc0a78db6b9688d8ae75f0c8 + md5: 506f8b95ef2554db6160f0e8b8994313 + depends: + - pyqt + - python >=3.9 + - qtconsole-base >=5.7.2,<5.7.3.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 8549 + timestamp: 1774450526675 +- conda: https://conda.anaconda.org/conda-forge/noarch/qtconsole-base-5.7.2-pyha770c72_0.conda + sha256: 45dfcd222fc03cff4b68b666272bfb106b83307bedab65640d1ce4a27ecd6e60 + md5: adc01873b0ddaa51e92ce8014a7ebb21 + depends: + - ipykernel >=4.1 + - ipython_pygments_lexers + - jupyter_client >=4.1 + - jupyter_core + - packaging + - pygments + - python >=3.9 + - qtpy >=2.4.0 + - traitlets + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 103142 + timestamp: 1774450507445 +- conda: https://conda.anaconda.org/conda-forge/noarch/qtpy-2.4.3-pyhd8ed1ab_1.conda + sha256: b17dd9d2ee7a4f60fb13712883cd2664aa1339df4b29eb7ae0f4423b31778b00 + md5: b49c000df5aca26d36b3f078ba85e03a + depends: + - packaging + - python >=3.9 + license: MIT + license_family: MIT + run_exports: {} + size: 63041 + timestamp: 1749167192680 +- conda: https://conda.anaconda.org/conda-forge/noarch/rasterstats-0.21.0-pyhcf101f3_0.conda + sha256: 183b225db9a5da05aeb5240291aaa3494bff8322b196d75f5094ee6a7d4e654b + md5: 290f97c3fcfab8323023b10cbb4f6cc2 + depends: + - python >=3.10 + - affine + - click >7.1,!=8.2.1 + - cligj >=0.4 + - numpy >=1.9 + - pyogrio + - rasterio >=1.0 + - simplejson + - shapely + - fiona + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 24082 + timestamp: 1779718549710 +- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda + sha256: 0577eedfb347ff94d0f2fa6c052c502989b028216996b45c7f21236f25864414 + md5: 870293df500ca7e18bedefa5838a22ab + depends: + - attrs >=22.2.0 + - python >=3.10 + - rpds-py >=0.7.0 + - typing_extensions >=4.4.0 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 51788 + timestamp: 1760379115194 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda + sha256: 1715246b19c9f85ee022933b4845f2fc14ac9184981b7b7d9b728bec8e9588da + md5: 4a85203c1d80c1059086ae860836ffb9 + depends: + - python >=3.10 + - certifi >=2023.5.7 + - charset-normalizer >=2,<4 + - idna >=2.5,<4 + - urllib3 >=1.26,<3 + - python + constrains: + - chardet >=3.0.2,<8 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 68709 + timestamp: 1778851103479 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda + sha256: 3d6ba2c0fcdac3196ba2f0615b4104e532525ffa1335b50a2878be5ff488814a + md5: 0242025a3c804966bf71aa04eee82f66 + depends: + - markdown-it-py >=2.2.0 + - pygments >=2.13.0,<3.0.0 + - python >=3.10 + - typing_extensions >=4.0.0,<5.0.0 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 208577 + timestamp: 1775991661559 +- conda: https://conda.anaconda.org/conda-forge/noarch/rio-vrt-0.3.1-pyhd8ed1ab_1.conda + sha256: 921d562e4f1103907cba0320db2905803c9c398532be2ff80e9e65658c9327f8 + md5: d2bf9b603975ac8c81ae049392852468 + depends: + - python >=3.9 + - rasterio + license: MIT + license_family: MIT + run_exports: {} + size: 12771 + timestamp: 1734898736388 +- conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda + sha256: 30f3c04fcfb64c44d821d392a4a0b8915650dbd900c8befc20ade8fde8ec6aa2 + md5: 0dc48b4b570931adc8641e55c6c17fe4 + depends: + - python >=3.10 + license: 0BSD OR CC0-1.0 + run_exports: {} + size: 13814 + timestamp: 1766003022813 +- conda: https://conda.anaconda.org/conda-forge/noarch/rope-1.14.0-pyh5ded981_1.conda + sha256: 5f0c9c36d9687c4e099c66d2840d79dd8369ab7c9d4455b92187350761d27d95 + md5: a0ba05f3cc23d4ba86fca254b19da71f + depends: + - python >=3.11 + - pytoolconfig >=1.2.2 + - python + license: LGPL-3.0-or-later + license_family: LGPL + run_exports: {} + size: 162992 + timestamp: 1788261075087 +- conda: https://conda.anaconda.org/conda-forge/noarch/rtree-1.4.1-pyh11ca60a_0.conda + sha256: 461ddd1d84c180bb682560b50d538e9e264ee5cc78cab5eb2a0f21cc24815bed + md5: 73f0eccab422ca6a96d904a805d68fa3 + depends: + - libspatialindex + - python >=3.9 + license: MIT + license_family: MIT + run_exports: {} + size: 41185 + timestamp: 1755128422366 +- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-84.0.0-pyh332efcf_0.conda + sha256: 9e200ee5f9ff19a4d94e4b51c4856d53dec849f91032f345cf0c6bc3d51a7183 + md5: 62ac906f1cd582c6c264c95625cb9d6f + depends: + - python >=3.10 + license: MIT + license_family: MIT + run_exports: {} + size: 524488 + timestamp: 1786282924579 +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d + md5: 3339e3b65d58accf4ca4fb8748ab16b3 + depends: + - python >=3.9 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 18455 + timestamp: 1753199211006 +- conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda + sha256: ad89284ea94821c20ff87e64b948e4afc690cf5202d14c009355b0594cf23aea + md5: 46b6abe31482f6bca064b965696ae807 + depends: + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 74456 + timestamp: 1780468201547 +- conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda + sha256: 61f9373709e7d9009e3a062b135dbe44b16e684a4fcfe2dd624143bc0f80d402 + md5: 9aa358575bbd4be126eaa5e0039f835c + depends: + - numpy + - pyparsing >=2.1.6 + - python >=3.9 + license: MIT + license_family: MIT + run_exports: {} + size: 11313 + timestamp: 1733818738919 +- conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda + sha256: d1e3e06b5cf26093047e63c8cc77b70d970411c5cbc0cb1fad461a8a8df599f7 + md5: 0401a17ae845fa72c7210e206ec5647d + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 28657 + timestamp: 1738440459037 +- conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.9.2-pyhd8ed1ab_0.conda + sha256: 056d7a2e91e303a9ee37e580f6dde0511fc3fb72476581cc337aacf2cc747613 + md5: ba33e6c8a46ee373fdf6dd8665212778 + depends: + - python >=3.10 + license: MIT + license_family: MIT + run_exports: {} + size: 39439 + timestamp: 1786202135509 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda + sha256: 035ca4b17afca3d53650380dd94c564555b7ec2b4f8818111f98c15c7a991b7b + md5: aabfbc2813712b71ba8beb217a978498 + depends: + - alabaster >=0.7.14 + - babel >=2.13 + - colorama >=0.4.6 + - docutils >=0.21,<0.23 + - imagesize >=1.3 + - jinja2 >=3.1 + - packaging >=23.0 + - pygments >=2.17 + - python >=3.12 + - requests >=2.30.0 + - roman-numerals >=1.0.0 + - snowballstemmer >=2.2 + - sphinxcontrib-applehelp >=1.0.7 + - sphinxcontrib-devhelp >=1.0.6 + - sphinxcontrib-htmlhelp >=2.0.6 + - sphinxcontrib-jsmath >=1.0.1 + - sphinxcontrib-qthelp >=1.0.6 + - sphinxcontrib-serializinghtml >=1.1.9 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 1584836 + timestamp: 1767271941650 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda + sha256: d7433a344a9ad32a680b881c81b0034bc61618d12c39dd6e3309abeffa9577ba + md5: 16e3f039c0aa6446513e94ab18a8784b + depends: + - python >=3.9 + - sphinx >=5 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 29752 + timestamp: 1733754216334 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda + sha256: 55d5076005d20b84b20bee7844e686b7e60eb9f683af04492e598a622b12d53d + md5: 910f28a05c178feba832f842155cbfff + depends: + - python >=3.9 + - sphinx >=5 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 24536 + timestamp: 1733754232002 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda + sha256: c1492c0262ccf16694bdcd3bb62aa4627878ea8782d5cd3876614ffeb62b3996 + md5: e9fb3fe8a5b758b4aff187d434f94f03 + depends: + - python >=3.9 + - sphinx >=5 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 32895 + timestamp: 1733754385092 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda + sha256: 578bef5ec630e5b2b8810d898bbbf79b9ae66d49b7938bcc3efc364e679f2a62 + md5: fa839b5ff59e192f411ccc7dae6588bb + depends: + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 10462 + timestamp: 1733753857224 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda + sha256: c664fefae4acdb5fae973bdde25836faf451f41d04342b64a358f9a7753c92ca + md5: 00534ebcc0375929b45c3039b5ba7636 + depends: + - python >=3.9 + - sphinx >=5 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 26959 + timestamp: 1733753505008 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-2.0.0-pyhd8ed1ab_0.conda + sha256: 20b49741065fd7d3fabf98caf6d19b6436badb06b6d41f66b58f1fc2b52f37a1 + md5: f77df1fcf9af03b7287342638befca77 + depends: + - python >=3.10 + - sphinx >=5 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 30640 + timestamp: 1781260357443 +- conda: https://conda.anaconda.org/conda-forge/noarch/spyder-6.1.7-hd8ed1ab_0.conda + noarch: python + sha256: 65634d624830d7d788a1e32ac87271f9884fbf51fe28d6953bdfdfdc891c9ef2 + md5: 8a0cfe9fdd0489834eea4ce123e231b5 + depends: + - pyqt >=5.15,<5.16 + - pyqtwebengine >=5.15,<5.16 + - qtconsole >=5.7.2,<5.8.0 + - spyder-base 6.1.7 *0 + license: MIT + license_family: MIT + run_exports: {} + size: 119569 + timestamp: 1787880245015 +- conda: https://conda.anaconda.org/conda-forge/noarch/spyder-kernels-3.1.6-win_pyh7428d3b_0.conda + sha256: d0aeba0f5430b066e54e7376c8e254eb82a3e373e1c4e1020d5b99936e38bd64 + md5: 1552e6b6142b353b693dae2e2836eced + depends: + - __win + - cloudpickle + - ipykernel >=6.29.3,<7.0.0 + - ipython >=8.15.0,<10.0.0,!=8.17.1,!=9.1.0,!=9.2.0,!=9.3.0,!=9.4.0 + - jupyter_client >=7.4.9,<9.0.0 + - python >=3.9 + - pyzmq >=24.0.0 + - traitlets >=5.14.3 + license: MIT + license_family: MIT + run_exports: {} + size: 72529 + timestamp: 1787767292161 +- conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + sha256: 570da295d421661af487f1595045760526964f41471021056e993e73089e9c41 + md5: b1b505328da7a6b246787df4b5a49fbc + depends: + - asttokens + - executing + - pure_eval + - python >=3.9 + license: MIT + license_family: MIT + run_exports: {} + size: 26988 + timestamp: 1733569565672 +- conda: https://conda.anaconda.org/conda-forge/noarch/superqt-0.8.2-pyh9208f05_0.conda + sha256: 9399c15ebb5fc6c8420798e0d239409728b2f3e46c142c0f72d5f5a164ca44c7 + md5: f98df78ba799abb3f903f6be57a07dfb + depends: + - pyconify >=0.1.4 + - pygments >=2.4.0 + - python >=3.10 + - qtpy >=2.4.0 + - typing_extensions >=4.5.0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 82389 + timestamp: 1782583538546 +- conda: https://conda.anaconda.org/conda-forge/noarch/text-unidecode-1.3-pyhd8ed1ab_2.conda + sha256: 4770807cc5a217638c9aea3f05ea55718a82c50f32462df196b5472aff02787f + md5: 23b4ba5619c4752976eb7ba1f5acb7e8 + depends: + - python >=3.9 + license: Artistic-1.0-Perl + license_family: OTHER + run_exports: {} + size: 65532 + timestamp: 1733750024391 +- conda: https://conda.anaconda.org/conda-forge/noarch/textdistance-4.6.3-pyhd8ed1ab_1.conda + sha256: 622f166c54ba81e1b8be5e0758a4be54e222f01d343a7b76c038cafeefb2ff71 + md5: 3e8a552940767bfb63b80fe0978f1825 + depends: + - python >=3.9 + license: MIT + license_family: MIT + run_exports: {} + size: 30550 + timestamp: 1736082926229 +- conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + sha256: 6016672e0e72c4cf23c0cf7b1986283bd86a9c17e8d319212d78d8e9ae42fdfd + md5: 9d64911b31d57ca443e9f1e36b04385f + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 23869 + timestamp: 1741878358548 +- conda: https://conda.anaconda.org/conda-forge/noarch/three-merge-0.1.1-pyhd8ed1ab_1.conda + sha256: 08125dbdbd7f1268645ccab77f7003ad13f776f5faa230ca826ce77300141143 + md5: bede74cd2b59ee320ee4222411549f2f + depends: + - diff-match-patch + - python >=3.9 + license: MIT + license_family: MIT + run_exports: {} + size: 11239 + timestamp: 1736031836273 +- conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.5.1-pyhcf101f3_0.conda + sha256: 7c803480dbfb8b536b9bf6287fa2aa0a4f970f8c09075694174eb4550a4524cd + md5: c0d0b883e97906f7524e2aac94be0e0d + depends: + - python >=3.10 + - webencodings >=0.4 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 30571 + timestamp: 1764621508086 +- conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda + sha256: fd30e43699cb22ab32ff3134d3acf12d6010b5bbaa63293c37076b50009b91f8 + md5: d0fc809fa4c4d85e959ce4ab6e1de800 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 24017 + timestamp: 1764486833072 +- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + sha256: 91cafdb64268e43e0e10d30bd1bef5af392e69f00edd34dfaf909f69ab2da6bd + md5: b5325cf06a000c5b14970462ff5e4d58 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 21561 + timestamp: 1774492402955 +- conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.15.1-pyhcf101f3_0.conda + sha256: 5cf833b4d199688b7652fb322ecc134de9555e9444d9249750de9a153421ad0a + md5: e4942e2de7436ff28be7f5645cf3c8d6 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 49054 + timestamp: 1784287707171 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.16.1-pyhcf101f3_0.conda + sha256: 03dba5917f944c6684ab44c81daacac1624cd148e4b2cae215dcec594a210c48 + md5: a79bf97561232a31447b6246c2153ab5 + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 116935 + timestamp: 1785761789772 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + sha256: b141933ece3518f6d7b75dfb59451e2f26b405a44c18e2518a83e9a02e09315c + md5: c680b5747e8c4c8f23dca0bb7042a8fc + depends: + - typing_extensions ==4.16.0 pyhcf101f3_0 + license: PSF-2.0 + license_family: PSF + run_exports: {} + size: 94080 + timestamp: 1783002732887 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + sha256: 2d888f90af0686044882c74193ec80a90ec1943145d94a7b1b048958acda1848 + md5: c70ad746c22219b9700931707482992c + depends: + - python >=3.10 + - python + license: PSF-2.0 + license_family: PSF + run_exports: {} + size: 52631 + timestamp: 1783002732887 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + sha256: b928c30ddcb0e3f544c6eade8352737e6e610e263276b90232db6a578ef899d8 + md5: fcb489df604d100968b737f2cb6076c6 + license: LicenseRef-Public-Domain + run_exports: {} + size: 118849 + timestamp: 1784250406640 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda + sha256: feff959a816f7988a0893201aa9727bbb7ee1e9cec2c4f0428269b489eb93fb4 + md5: cbb88288f74dbe6ada1c6c7d0a97223e + depends: + - backports.zstd >=1.0.0 + - brotli-python >=1.2.0 + - h2 >=4,<5 + - pysocks >=1.5.6,<2.0,!=1.5.7 + - python >=3.10 + license: MIT + license_family: MIT + run_exports: {} + size: 103560 + timestamp: 1778188657149 +- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.8.3-pyhcf101f3_0.conda + sha256: 3b0599d59d70bbe792702d1b5404ac501c9c25bd7b2fd9ccbb5da8ad6587a703 + md5: f62991f907a9830ab003b12d07dd3478 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 146490 + timestamp: 1788174996551 +- conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda + sha256: 19ff205e138bb056a46f9e3839935a2e60bd1cf01c8241a5e172a422fed4f9c6 + md5: 2841eb5bfc75ce15e9a0054b98dcd64d + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 15496 + timestamp: 1733236131358 +- conda: https://conda.anaconda.org/conda-forge/noarch/whatthepatch-1.0.7-pyhd8ed1ab_1.conda + sha256: c45d2dd1e13abd26916890bbbce2dd1e95925184254f3e82e0af56ffd0c8fae8 + md5: c0617d951edc1e90c2809ec104865d7c + depends: + - python >=3.9 + license: MIT + license_family: MIT + run_exports: {} + size: 17016 + timestamp: 1736040941174 +- conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda + sha256: 93807369ab91f230cf9e6e2a237eaa812492fe00face5b38068735858fba954f + md5: 46e441ba871f524e2b067929da3051c2 + depends: + - __win + - python >=3.9 + license: LicenseRef-Public-Domain + run_exports: {} + size: 9555 + timestamp: 1733130678956 +- conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2026.9.1-pyhd8ed1ab_0.conda + sha256: b9439f1716ff580ce56e9b4a4df7ea92e5ed2bdc9567d25cdff223d62c3183a8 + md5: 5d7c149ba9c728d4951f3fe6d3ce0f84 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 53963 + timestamp: 1788530754725 +- conda: https://conda.anaconda.org/conda-forge/noarch/yapf-0.43.0-pyhd8ed1ab_1.conda + sha256: a84c77c78445ee71813059ad960b043e334b24250900f4cec96a9ef78e45208a + md5: ad1a2c858e3c14deae4f274580123151 + depends: + - importlib-metadata >=6.6.0 + - platformdirs >=3.5.1 + - python >=3.9 + - tomli >=2.0.1 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 179278 + timestamp: 1736192836846 +- conda: https://conda.anaconda.org/conda-forge/noarch/yarl-1.24.5-pyh7db6752_0.conda + sha256: 38924f1b1aa7327f5771ca32f7eb0c5f06ab4f66b9de731d2ff6991f95645973 + md5: d86ff9d3d72b1d318c315d8531eebc45 + depends: + - idna >=2.0 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.10 + track_features: + - yarl_no_compile + license: Apache-2.0 + license_family: Apache + run_exports: {} + size: 96070 + timestamp: 1784526424667 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda + sha256: 210bd31c22bb88f5e2a167df24c95bb5f152b2ada7502f9b8c49d1f5366db423 + md5: ba3dcdc8584155c97c648ae9c044b7a3 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 24190 + timestamp: 1779159948016 +- conda: https://conda.anaconda.org/conda-forge/win-64/astroid-4.0.4-py314h86ab7b2_0.conda + sha256: 18d45f2251b15637c73f3d9a5818601797a9ee89b0bb0203bf810dac27d1294a + md5: d104588051bc8b8c592cfd1ccdbf0a6b + depends: + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + license: LGPL-2.1-or-later + license_family: LGPL + run_exports: {} + size: 541771 + timestamp: 1770634544810 +- conda: https://conda.anaconda.org/conda-forge/win-64/bcrypt-5.0.0-py314h9f07db2_2.conda + sha256: a9debbc954946dea1eb1766ffa387b08f9f9ef6a69cca83119cfb8470ae02724 + md5: d82a9bff471aa762c7734bf620f05a1a + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 165324 + timestamp: 1788505808632 +- conda: https://conda.anaconda.org/conda-forge/win-64/blosc-1.21.6-hfd34d9b_1.conda + sha256: 9303a7a0e03cf118eab3691013f6d6cbd1cbac66efbc70d89b20f5d0145257c0 + md5: 357d7be4146d5fec543bfaa96a8a40de + depends: + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - zstd >=1.5.6,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - blosc >=1.21.6,<2.0a0 + size: 49840 + timestamp: 1733513605730 +- conda: https://conda.anaconda.org/conda-forge/win-64/brotli-1.2.0-hc8c2fe1_4.conda + sha256: 7a4110b57f0e957ca4cfd2fc60cede2ccea42b80b404f646339bd874ace18845 + md5: bdbb2939efe8af10e7c5885367395710 + depends: + - brotli-bin 1.2.0 hd477307_4 + - libbrotlidec 1.2.0 h84f9c24_4 + - libbrotlienc 1.2.0 he2a975b_4 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - libbrotlicommon >=1.2.0,<1.3.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + size: 20944 + timestamp: 1788480420397 +- conda: https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.2.0-hd477307_4.conda + sha256: 740b171b2cdf793891b36e1e2f81d7829e9b93c8a0d1a72d9ffaebef58eab016 + md5: 5353bd43aaade891fc9b614c5d537ce3 + depends: + - libbrotlidec 1.2.0 h84f9c24_4 + - libbrotlienc 1.2.0 he2a975b_4 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: {} + size: 23077 + timestamp: 1788480410898 +- conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.2.0-py314h85cf176_4.conda + sha256: 77cba8469644eccf05a5be5216ae2c71471ae09e9febc6ef39eb73ac07de08c3 + md5: a0d7c645ae6b82fda8a2eb24a1de7b43 + depends: + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - libbrotlicommon 1.2.0 hf02afa3_4 + license: MIT + license_family: MIT + run_exports: {} + size: 336837 + timestamp: 1788480517368 +- conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_10.conda + sha256: 04767466ee9227c9c57ab2c6503e0149177d34111c7418d2f420297acb1eb229 + md5: c3301c058362f340100d91cd8be0393f + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: bzip2-1.0.6 + license_family: BSD + run_exports: + weak: + - bzip2 >=1.0.8,<2.0a0 + size: 55919 + timestamp: 1785906343696 +- conda: https://conda.anaconda.org/conda-forge/win-64/cairo-1.18.4-h477c42c_3.conda + sha256: 167be08bde10daeefc505673966c470e8e236195c4edc2000a8d2441bc72a28b + md5: 37e4ca2dd35c4171f0587d985976b30e + depends: + - fontconfig >=2.18.3,<3.0a0 + - fonts-conda-ecosystem + - icu >=78.3,<79.0a0 + - libexpat >=2.8.1,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libglib >=2.88.3,<3.0a0 + - libpng >=1.6.58,<1.7.0a0 + - libzlib >=1.3.2,<2.0a0 + - pixman >=0.46.4,<1.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LGPL-2.1-only or MPL-1.1 + run_exports: + weak: + - cairo >=1.18.4,<2.0a0 + size: 1535591 + timestamp: 1788221425576 +- conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.1.1-py314h5a2d7ad_3.conda + sha256: 400e8869acc3e5a0633b9a8ccd6695ce8d36b63675708b8d3f5e1c018406ef6a + md5: 178930300441541491ece1cae80240b9 + depends: + - pycparser + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: {} + size: 347452 + timestamp: 1788485352441 +- conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.4.0-py314hf309875_0.conda + sha256: df6741a268c01f56aabfb0304c40668272434c582fdde79c4acb62c136a69c7d + md5: 37458bd6fbd8d164635028e899e7f669 + depends: + - numpy >=2.0 + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + run_exports: {} + size: 252880 + timestamp: 1789310449421 +- conda: https://conda.anaconda.org/conda-forge/win-64/cryptography-50.0.1-py311h67a9792_1.conda + noarch: python + sha256: e1e3716a7c88d989fe8f8b294f3e39f6fa7c4556195022827596f3c5a1df9985 + md5: 7ca65928a31ee66f85c6ed35746f944d + depends: + - python + - cffi >=2.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - openssl >=3.5.8,<4.0a0 + - _python_abi3_support 1.* + - cpython >=3.11 + license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT + run_exports: {} + size: 1782824 + timestamp: 1789121498891 +- conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.21-py314hb98de8c_2.conda + sha256: f89771a7f79f00ac045964df7bf65a35a17bc4c4568e071d35fd3088c747491f + md5: 6842f85c2fdbed5153706e90a060791b + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + run_exports: {} + size: 4028261 + timestamp: 1789240473710 +- conda: https://conda.anaconda.org/conda-forge/win-64/double-conversion-3.4.0-hac47afa_0.conda + sha256: 09e30a170e0da3e9847d449b594b5e55e6ae2852edd3a3680e05753a5e015605 + md5: 3d3caf4ccc6415023640af4b1b33060a + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - double-conversion >=3.4.0,<3.5.0a0 + size: 70943 + timestamp: 1765193243911 +- conda: https://conda.anaconda.org/conda-forge/win-64/fiona-1.10.1-py314hcb00e3b_7.conda + sha256: 0f30c87aeeef397b7818037cb4bb016560c9441e9a0ec69371bf5e9b2bd7cfe8 + md5: 47c71cc6a001bd356d8634af938c36f5 + depends: + - python + - attrs >=19.2.0 + - click >=8.0,<9.dev0 + - cligj >=0.5 + - click-plugins >=1.0 + - pyparsing + - shapely + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libgdal-core >=3.13.3,<3.14.0a0 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 1222701 + timestamp: 1788472931375 +- conda: https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.18.3-hd47e2ca_1.conda + sha256: f26139e3c774a6434c8a73381c08e3d2a4c2f9d9ef9587c66aab8836211ee2ec + md5: ed95670fed91b091fe34ba6cae6677d7 + depends: + - libexpat >=2.8.1,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libiconv >=1.18,<2.0a0 + - libintl >=0.22.5,<1.0a0 + - libzlib >=1.3.2,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - fontconfig >=2.18.3,<3.0a0 + - fonts-conda-ecosystem + size: 217988 + timestamp: 1786667461139 +- conda: https://conda.anaconda.org/conda-forge/win-64/fonttools-4.65.0-py314h2359020_0.conda + sha256: f8f56c0aaca4e4b4a1a4a659fd9a67ff7d99cc49d9ee9058890b6882350c6d43 + md5: 3edddcd54b0f845321333dec9d665e75 + depends: + - brotli + - munkres + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: {} + size: 2711417 + timestamp: 1789076387067 +- conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.14.3-h57928b3_2.conda + sha256: 32f7dd8ffe62fd485e9e6570e871f5be45af74c84fde62241a2417046a373efd + md5: 6fc6c09c05a099d58efd9b2e96598e41 + depends: + - libfreetype 2.14.3 h57928b3_2 + - libfreetype6 2.14.3 hdbac1cb_2 + - zlib + license: GPL-2.0-only OR FTL + run_exports: + weak: + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + size: 186945 + timestamp: 1786641050416 +- conda: https://conda.anaconda.org/conda-forge/win-64/freexl-2.0.0-h0f64aeb_3.conda + sha256: 857183489abc5a088b20b221bd78c7ea91aa23a065291149bb4c8a32981e6bc9 + md5: 9f0212e4c4bdf5f8f52a1f9793d86311 + depends: + - libexpat >=2.8.1,<3.0a0 + - libiconv >=1.18,<2.0a0 + - minizip >=4.2.2,<5.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MPL-1.1 + license_family: MOZILLA + run_exports: + weak: + - freexl >=2.0.0,<3.0a0 + size: 79171 + timestamp: 1788125519179 +- conda: https://conda.anaconda.org/conda-forge/win-64/fribidi-1.0.16-hfd05255_2.conda + sha256: be42a535d36f1e075f2ae3264bb62028ab396408da6a6ab0ac98e61d0224eb7c + md5: 130c9b1af59ff14131c661cc14e4a632 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LGPL-2.1-or-later + run_exports: + weak: + - fribidi >=1.0.16,<2.0a0 + size: 66044 + timestamp: 1788385642269 +- conda: https://conda.anaconda.org/conda-forge/win-64/fzf-0.74.4-h11686cb_0.conda + sha256: 2b8763a1f3bdcc12784131285598c7de312eb86ddf7bff6d937ca75c53d7347c + md5: 650078c81e03093b631dc46236bc4471 + license: MIT + license_family: MIT + run_exports: {} + size: 4711605 + timestamp: 1789348287737 +- conda: https://conda.anaconda.org/conda-forge/win-64/gdal-3.13.3-np2py314h4074017_1.conda + sha256: 258f6481485407b09305e954ea4ce13b7ef81707570fb2d6b5f71ae76bea72f5 + md5: 82f583da6cbb107f5c481e631dd569cc + depends: + - python + - libgdal-core 3.13.3.* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libdeflate >=1.25,<1.26.0a0 + - blosc >=1.21.6,<2.0a0 + - libkml >=1.3.0,<1.4.0a0 + - muparser >=2.3.5,<2.4.0a0 + - xerces-c >=3.3.0,<3.4.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - pcre2 >=10.47,<10.48.0a0 + - openssl >=3.5.8,<4.0a0 + - libxml2 + - libxml2-16 >=2.15.3 + - libjpeg-turbo >=3.2.0,<4.0a0 + - libarchive >=3.8.9,<3.9.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - lerc >=4.2.0,<5.0a0 + - zstd >=1.5.7,<1.6.0a0 + - libexpat >=2.8.1,<3.0a0 + - libsqlite >=3.53.4,<4.0a0 + - libjxl >=0.12.0,<0.13.0a0 + - geos >=3.14.1,<3.14.2.0a0 + - libspatialite >=5.1.0,<5.2.0a0 + - libpng >=1.6.58,<1.7.0a0 + - libiconv >=1.18,<2.0a0 + - libcurl >=8.21.0,<9.0a0 + - proj >=9.8.1,<9.9.0a0 + - libzlib >=1.3.2,<2.0a0 + - numpy >=1.25,<3 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + run_exports: {} + size: 2336810 + timestamp: 1788235611204 +- conda: https://conda.anaconda.org/conda-forge/win-64/geos-3.14.1-h62f7316_0.conda + sha256: 70c51f6e7d2e2d68dd8fafe3a2c821764b7e33f2e66379a6b5691e942c73b7d3 + md5: f3405ff0366fe7ee04580acf8e422d16 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LGPL-2.1-only + run_exports: + weak: + - geos >=3.14.1,<3.14.2.0a0 + size: 1723817 + timestamp: 1787894635500 +- conda: https://conda.anaconda.org/conda-forge/win-64/glib-2.90.0-h6d70850_0.conda + sha256: 03069b2545dd9da17fc5fd9a60e1c1671fae63190118e51502b955f5244bb00a + md5: d029a1240cbb9ab85bcd881d68e69a47 + depends: + - python * + - packaging + - libglib ==2.90.0 ha564072_0 + - glib-tools ==2.90.0 hafa6b35_0 + - libintl-devel + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libintl >=0.22.5,<1.0a0 + license: LGPL-2.1-or-later + run_exports: + weak: + - libglib >=2.90.0,<3.0a0 + size: 76493 + timestamp: 1789478046525 +- conda: https://conda.anaconda.org/conda-forge/win-64/glib-tools-2.90.0-hafa6b35_0.conda + sha256: fa8096d631d7ef9cdffb6d27e41eef9f0c4ea83cc99632d7ea765c6b60c5f9f5 + md5: faa5f9e5f68fa2b9bddae821fe303e8b + depends: + - libglib ==2.90.0 ha564072_0 + - libffi + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libintl >=0.22.5,<1.0a0 + license: LGPL-2.1-or-later + run_exports: {} + size: 251781 + timestamp: 1789478046525 +- conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.15-h5112557_1.conda + sha256: 93a59bdf944fb6f947bd7ad2f293d5d80db3a90f8ff8dfabc591e3752141e46f + md5: 79538e7a7bc024084eda5989f73fde35 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: LGPL-2.0-or-later + license_family: LGPL + run_exports: + weak: + - graphite2 >=1.3.15,<2.0a0 + size: 98064 + timestamp: 1786118492029 +- conda: https://conda.anaconda.org/conda-forge/win-64/gst-plugins-base-1.26.11-h88486b4_0.conda + sha256: 68e518906536886fdf9e9e839a90747e44bacc2e0c2005ab335d265ba074623b + md5: 5c22a369b4efc69768bdc311c2114778 + depends: + - gstreamer ==1.26.11 hae9036a_0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libexpat >=2.7.5,<3.0a0 + - libvorbis >=1.3.7,<1.4.0a0 + - libogg >=1.3.5,<1.4.0a0 + - gstreamer >=1.26.11,<1.27.0a0 + - libzlib >=1.3.2,<2.0a0 + - pango >=1.56.4,<2.0a0 + - libintl >=0.22.5,<1.0a0 + - libglib >=2.86.4,<3.0a0 + license: LGPL-2.0-or-later + license_family: LGPL + run_exports: + weak: + - gst-plugins-base >=1.26.11,<1.27.0a0 + size: 5071873 + timestamp: 1776268416801 +- conda: https://conda.anaconda.org/conda-forge/win-64/gstreamer-1.26.11-hae9036a_0.conda + sha256: 45d85b9efbcddc88632cb8a982da1aee8f7b40e226087374a4099ca90a2b81d0 + md5: 8b55f5b5964749e457d28ddffbd15e14 + depends: + - glib >=2.86.4,<3.0a0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libzlib >=1.3.2,<2.0a0 + - libintl >=0.22.5,<1.0a0 + - libglib >=2.86.4,<3.0a0 + - libiconv >=1.18,<2.0a0 + license: LGPL-2.0-or-later + license_family: LGPL + run_exports: + weak: + - gstreamer >=1.26.11,<1.27.0a0 + size: 3541310 + timestamp: 1776268416801 +- conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.3-h5112557_2.conda + sha256: 75c549b55b673e15de8785a8e5dd85bca7eb612eee0ff4dc8d7bdaa15eacbdbb + md5: e596942e8ee6ee17fdcf1e6a77757a66 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + run_exports: + weak: + - icu >=78.3,<79.0a0 + size: 16835644 + timestamp: 1784916416303 +- conda: https://conda.anaconda.org/conda-forge/win-64/jellyfish-1.2.1-py314h170c82c_1.conda + sha256: 3e3a71ff68e5f8938bb5abf61baa2a4494d10bc9a4c462f60047edc51ce869ae + md5: fa7546560cd62776ba6a833cebdce82f + depends: + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 196748 + timestamp: 1764104849701 +- conda: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.5.1-py314hf309875_1.conda + sha256: d396583366135a781b150f31fcf1a2e6c1f0cb95545de5a5236240b36c62bb46 + md5: 112da4db82886f7c2b8496a4e44da64e + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 73162 + timestamp: 1788505720829 +- conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h719d79b_2.conda + sha256: 63ff03324e903eb01a715ccf357df56d66224e61952fd6615d86490ebefb3285 + md5: 93f5a01dec294a2228f757fe2f3432d4 + depends: + - openssl >=3.5.7,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - krb5 >=1.22.2,<1.23.0a0 + size: 753425 + timestamp: 1786762169034 +- conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.19.1-hf2c6c5f_3.conda + sha256: 7c5f96b473b721a4279708b448591dc3d89ed274280ff480dea1b4f9b13e1fcd + md5: a817b8a8f09864652c8700bd1893fe81 + depends: + - libjpeg-turbo >=3.2.0,<4.0a0 + - libtiff >=4.7.2,<4.8.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - lcms2 >=2.19.1,<3.0a0 + size: 525499 + timestamp: 1789052032238 +- conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.2.0-hd936e49_0.conda + sha256: 93d666f63f284ef77b87b0b1f77b70f7d36d315a132f9afa64bc0012d937ba39 + md5: add59e2b60ac9d4299d17c938185c75a + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - lerc >=4.2.0,<5.0a0 + size: 175297 + timestamp: 1785036247761 +- conda: https://conda.anaconda.org/conda-forge/win-64/libarchive-3.8.9-gpl_h8fdc8af_101.conda + sha256: 71cb6e49282d2aee1eb0249a290dc2333b0063ac2ecec69116ad569d822a0aaf + md5: 74c32a74e1b188a4e14fc359c721e4b9 + depends: + - bzip2 >=1.0.8,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libxml2 + - libxml2-16 >=2.15.3 + - libzlib >=1.3.2,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - lzo >=2.10,<3.0a0 + - openssl >=3.5.7,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-2-Clause + license_family: BSD + run_exports: + weak: + - libarchive >=3.8.9,<3.9.0a0 + size: 1151402 + timestamp: 1787292629824 +- conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-11_h8455456_mkl.conda + build_number: 11 + sha256: 51a38b02bacb5a4b546d41aeb0f7921ee85c0ec1009fdcb58635bcad06f2eb1a + md5: a63c8b08343d276a552c395f495987fa + depends: + - mkl >=2026.1.0,<2027.0a0 + constrains: + - blas 2.311 mkl + - libcblas 3.11.0 11*_mkl + - liblapack 3.11.0 11*_mkl + - liblapacke 3.11.0 11*_mkl + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libblas >=3.11.0,<4.0a0 + size: 67059 + timestamp: 1789061341346 +- conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.2.0-hf02afa3_4.conda + sha256: 88247c467f77d99abfe2596fa5c91c2ec0f2942d6fc292d5729ab3538d1b0a0f + md5: 35d7e4a581c8364e8c675f6b95d183d0 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - libbrotlicommon >=1.2.0,<1.3.0a0 + size: 82689 + timestamp: 1788480379020 +- conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.2.0-h84f9c24_4.conda + sha256: ddcf50274ccdd863c176190726c524903e0b875aa13e9d60c3755b2fa221fc62 + md5: 1b4637ca71b21c0d31ab28c3c0b34c8e + depends: + - libbrotlicommon 1.2.0 hf02afa3_4 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - libbrotlidec >=1.2.0,<1.3.0a0 + size: 34700 + timestamp: 1788480390151 +- conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.2.0-he2a975b_4.conda + sha256: d6744e57961728e12e4ac8e54bb0edd235a1c34d663a9df0dd153f9540a799bc + md5: 562b5e39b7797423e7fd04bae1c6ad70 + depends: + - libbrotlicommon 1.2.0 hf02afa3_4 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - libbrotlienc >=1.2.0,<1.3.0a0 + size: 253586 + timestamp: 1788480399742 +- conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-11_h2a3cdd5_mkl.conda + build_number: 11 + sha256: 9a2d431ead1463a7a96a38bedc901705c325c5bbafd7a2bcc5a198fbfcdea29e + md5: c9f8a732af97d55997f9ac6d0c02e3f2 + depends: + - libblas 3.11.0 11_h8455456_mkl + constrains: + - blas 2.311 mkl + - liblapack 3.11.0 11*_mkl + - liblapacke 3.11.0 11*_mkl + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libcblas >=3.11.0,<4.0a0 + size: 67465 + timestamp: 1789061353350 +- conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-23.1.1-default_hacd6ee9_0.conda + sha256: fe65ead3f55a912a5f0a8d18a4931af7406217406579ac3b8e97cdae23eed514 + md5: b81422067866a3c0d719793b233df58e + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - llvm-openmp >=23.1.1 + - libxml2 + - libxml2-16 >=2.15.4 + - libzlib >=1.3.2,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + run_exports: + weak: + - libclang13 >=23.1.1 + size: 37503036 + timestamp: 1788986245860 +- conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.22.0-hdb0ef4a_0.conda + sha256: 5fe063cffa90ad3ef04e25c76b1a79cdbc4f6c43747164a7dcdd89c4faebb84e + md5: e8405e754eaac42d66f957222fcfd876 + depends: + - krb5 >=1.22.2,<1.23.0a0 + - libpsl >=0.23.1,<0.24.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: curl + license_family: MIT + run_exports: + weak: + - libcurl >=8.22.0,<9.0a0 + size: 413226 + timestamp: 1788340784214 +- conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h1a1d4e4_1.conda + sha256: af1cda21d4653f594fbef20aa4e1ff158a546902b3307ef8af9a9b44b43862d2 + md5: e4e122e124676a49eebf241399ad8393 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - libdeflate >=1.25,<1.26.0a0 + size: 157828 + timestamp: 1785908793271 +- conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.1-hac47afa_1.conda + sha256: 1a54d874addda73b6f7164d5f3905821277a1831bcc05edd74b3085391688571 + md5: ccc490c81ffe14181861beac0e8f3169 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - expat 2.8.1.* + license: MIT + license_family: MIT + run_exports: {} + size: 71631 + timestamp: 1781203724164 +- conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.7.0-h3d046cb_1.conda + sha256: 613e8077c5cca5df7fe84ade7d5050301bee3c6c4c450ffe61d34a349ab4f11c + md5: ceb38b0ba900847d8da4289c3c8e5708 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - libffi >=3.7.0,<3.8.0a0 + size: 49992 + timestamp: 1787753517346 +- conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.3-h57928b3_2.conda + sha256: d794d7fddb6eea50e18a62fa27ab3819f40d51bad00b90cf4ca591fb0d4006c2 + md5: 740f99c3c91079c03874b809fedace1b + depends: + - libfreetype6 >=2.14.3 + license: GPL-2.0-only OR FTL + run_exports: {} + size: 8742 + timestamp: 1786641045882 +- conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.3-hdbac1cb_2.conda + sha256: cbc650854003e434d4ff6c7b1a2667e38a4242ad8a391a1c5ff89721624065ce + md5: 8157483eb7ed3fcba71aad3b50a97131 + depends: + - libpng >=1.6.58,<1.7.0a0 + - libzlib >=1.3.2,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - freetype >=2.14.3 + license: GPL-2.0-only OR FTL + run_exports: {} + size: 340385 + timestamp: 1786641044865 +- conda: https://conda.anaconda.org/conda-forge/win-64/libgdal-core-3.13.3-hcd51406_1.conda + sha256: 08a7f54d669392f34fd95ef53da1fd7babd10c7735bf8762992f98c0c9cdd74f + md5: 0553b074c878e31b9090ec0542228ac1 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libdeflate >=1.25,<1.26.0a0 + - blosc >=1.21.6,<2.0a0 + - libkml >=1.3.0,<1.4.0a0 + - muparser >=2.3.5,<2.4.0a0 + - xerces-c >=3.3.0,<3.4.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - pcre2 >=10.47,<10.48.0a0 + - openssl >=3.5.8,<4.0a0 + - libxml2 + - libxml2-16 >=2.15.3 + - libjpeg-turbo >=3.2.0,<4.0a0 + - libarchive >=3.8.9,<3.9.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - lerc >=4.2.0,<5.0a0 + - zstd >=1.5.7,<1.6.0a0 + - libexpat >=2.8.1,<3.0a0 + - libsqlite >=3.53.4,<4.0a0 + - libjxl >=0.12.0,<0.13.0a0 + - geos >=3.14.1,<3.14.2.0a0 + - libspatialite >=5.1.0,<5.2.0a0 + - libpng >=1.6.58,<1.7.0a0 + - libiconv >=1.18,<2.0a0 + - libcurl >=8.21.0,<9.0a0 + - proj >=9.8.1,<9.9.0a0 + - libzlib >=1.3.2,<2.0a0 + constrains: + - libgdal 3.13.3.* + license: MIT + license_family: MIT + run_exports: + weak: + - libgdal-core >=3.13.3,<3.14.0a0 + size: 11341531 + timestamp: 1788235611204 +- conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.90.0-ha564072_0.conda + sha256: 55d9fad9d0884111826500629285dbd35c827e3f2b5fe04b50e3d7d67c71425e + md5: 29c689012c8a53a0e36a70dfd43227e4 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libffi >=3.7.0,<3.8.0a0 + - libintl >=0.22.5,<1.0a0 + - libiconv >=1.18,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - pcre2 >=10.47,<10.48.0a0 + constrains: + - glib >2.66 + license: LGPL-2.1-or-later + run_exports: + weak: + - libglib >=2.90.0,<3.0a0 + size: 4572716 + timestamp: 1789478046525 +- conda: https://conda.anaconda.org/conda-forge/win-64/libharfbuzz-14.4.0-h03b5201_1.conda + sha256: 582f1fadfdc44e82ff937e1de5f6eff19f7114ce10a8051e306510220cb30275 + md5: d7b92075b7461e40fd8e90f08669a742 + depends: + - cairo >=1.18.4,<2.0a0 + - graphite2 >=1.3.15,<2.0a0 + - icu >=78.3,<79.0a0 + - libexpat >=2.8.1,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libglib >=2.88.3,<3.0a0 + - libpng >=1.6.58,<1.7.0a0 + - libzlib >=1.3.2,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: {} + size: 1055447 + timestamp: 1788405777960 +- conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.13.0-default_h049141e_1000.conda + sha256: 2ee12e37223dfcd0acd050c80a91150c482b6e2899198521e1800dce66662467 + md5: 6a01c986e30292c715038d2788aa1385 + depends: + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - libxml2 + - libxml2-16 >=2.14.6 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libhwloc >=2.13.0,<2.13.1.0a0 + size: 2396128 + timestamp: 1770954127918 +- conda: https://conda.anaconda.org/conda-forge/win-64/libhwy-1.4.0-h2419aca_1.conda + sha256: a6dc4360c00eca941d31ad94e8e4a102f38ce9de1668fac83118f1ad457577d2 + md5: 972a4e44d5a8c3447769414fd3518d5d + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 OR BSD-3-Clause + run_exports: + weak: + - libhwy >=1.4.0,<1.5.0a0 + size: 563336 + timestamp: 1787282448113 +- conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_3.conda + sha256: 35e04e3ddac7720fc7c550a1c9f998604299d6a7bd1f3ec9b2825d825061daa2 + md5: a8a2abdf0f901bc4779d9b7be0845921 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LGPL-2.1-only + run_exports: + weak: + - libiconv >=1.18,<2.0a0 + size: 694899 + timestamp: 1787033851701 +- conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_4.conda + sha256: 85b50be2209f3b8a873830ec9894477d260f4c7ba9540e65959f5812bf7219f8 + md5: 36d6e0045173974521fabd42bd5033d6 + depends: + - libiconv >=1.18,<2.0a0 + license: LGPL-2.1-or-later + run_exports: + weak: + - libintl >=0.22.5,<1.0a0 + size: 96669 + timestamp: 1787841116808 +- conda: https://conda.anaconda.org/conda-forge/win-64/libintl-devel-0.22.5-h5728263_4.conda + sha256: b8d12a5661331ff91da2faff3d62bec2703317b5c4630685a67d657d1570931b + md5: 221ab9cd4a37b69000ada916ce209355 + depends: + - libiconv >=1.18,<2.0a0 + - libintl 0.22.5 h5728263_4 + license: LGPL-2.1-or-later + run_exports: + weak: + - libintl >=0.22.5,<1.0a0 + size: 42414 + timestamp: 1787841194162 +- conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.2.0-hfd05255_1.conda + sha256: df78ab4c0eecb3dd9331898f96baeed8e5ca1c363346332517abeb0b614b9a53 + md5: fc2c23bacefd1e733f1e1d6cd3b2aaeb + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + run_exports: + weak: + - libjpeg-turbo >=3.2.0,<4.0a0 + size: 990125 + timestamp: 1785896494014 +- conda: https://conda.anaconda.org/conda-forge/win-64/libjxl-0.12.0-h932607e_2.conda + sha256: c0381a39fd601430ebe7e2686543f5b1685d2374d8bb7be0aabf4d4705327efa + md5: cf415a2296a1d862e93559645c91fd30 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libhwy >=1.4.0,<1.5.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libjxl >=0.12.0,<0.13.0a0 + size: 1199700 + timestamp: 1786691396735 +- conda: https://conda.anaconda.org/conda-forge/win-64/libkml-1.3.0-h68a222c_1023.conda + sha256: 6b2c6506dc7d7bb3bc4128d575e4ae6c2cf18d3f9828a4be331e0b5e49edf108 + md5: b44e0d9eb84c6c086d809787aab0a1da + depends: + - libexpat >=2.7.5,<3.0a0 + - libzlib >=1.3.2,<2.0a0 + - ucrt >=10.0.20348.0 + - uriparser >=0.9.8,<1.0a0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 1668156 + timestamp: 1777026660593 +- conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-11_hf9ab0e9_mkl.conda + build_number: 11 + sha256: 460a2b9896bbee9a3cdfef26d1fdce056028291eef104564082de9e9f566bba6 + md5: 79bdf20fd2666b8a3485a6021c935b3a + depends: + - libblas 3.11.0 11_h8455456_mkl + constrains: + - blas 2.311 mkl + - libcblas 3.11.0 11*_mkl + - liblapacke 3.11.0 11*_mkl + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - liblapack >=3.11.0,<3.12.0a0 + size: 79503 + timestamp: 1789061364082 +- conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_1.conda + sha256: d36c4a1e1f80fd08e18a407e03622ff2f34dfdd022da6488ad19603dea19e6d5 + md5: 880a0c8549479b198af21ba5dc49b109 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - xz 5.8.3.* + license: 0BSD + run_exports: + weak: + - liblzma >=5.8.3,<6.0a0 + size: 105809 + timestamp: 1786348717883 +- conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_2.conda + sha256: f07e451de3db1836b87f7aedf95c8e65cdb06c0e6105329ba24bb5f7b5c75e2a + md5: 5ae92fd6614edd024576e14069d7ad4c + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 89109 + timestamp: 1786650384519 +- conda: https://conda.anaconda.org/conda-forge/win-64/libogg-1.3.5-h2466b09_1.conda + sha256: c63e5fb169dbd192aacdcee6e37235407f106b8ca9c9036942a25e0366cbc73c + md5: b67ed8c9ca072695ff482e50d888a523 + depends: + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - ucrt >=10.0.20348.0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libogg >=1.3.5,<1.4.0a0 + size: 35040 + timestamp: 1745826086628 +- conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-hdc8cecf_1.conda + sha256: 8c49c32adf3ba2c59783630b82377f54ab72204ea99e2bafc90a47a8e25c1032 + md5: 5aa7348e73691187c81d51616f17e48a + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libzlib >=1.3.2,<2.0a0 + license: zlib-acknowledgement + run_exports: + weak: + - libpng >=1.6.58,<1.7.0a0 + size: 385462 + timestamp: 1786616543374 +- conda: https://conda.anaconda.org/conda-forge/win-64/libpsl-0.23.1-h9b16d47_1.conda + sha256: e53fe3b09f82b59b644264133d6d148ac31bb5451b7583cff55690bf038f2f62 + md5: 39cdf8c4f59e4d253cfa8091c8b3d7de + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - icu >=78.3,<79.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - libpsl >=0.23.1,<0.24.0a0 + size: 73511 + timestamp: 1786970749988 +- conda: https://conda.anaconda.org/conda-forge/win-64/libpython-3.14.7-h4f90d01_106_cp314.conda + build_number: 106 + sha256: 95b7bd6fec10031b44b20276e57c11d71cd1095f966aa84c1bba5ece0eea64d2 + md5: 2d48db2a15a7b768bb563d2675c99b2c + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Python-2.0 + run_exports: {} + size: 51250 + timestamp: 1788384361391 +- conda: https://conda.anaconda.org/conda-forge/win-64/libraqm-0.11.0-h50d6d30_0.conda + sha256: 1bc52f781355e233411a7aaebbb155d9fd53efa2a1fc6c621250833d80cc5ab1 + md5: df92be5685f712989830bdb7ee39383a + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libharfbuzz >=14.2.1 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - fribidi >=1.0.16,<2.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - libraqm >=0.11.0,<0.12.0a0 + size: 33471 + timestamp: 1784850324004 +- conda: https://conda.anaconda.org/conda-forge/win-64/librttopo-1.1.0-haa95264_21.conda + sha256: 3bc0c7f406034cdbee213776be48a986ee9b4101050d5b81ff2e0b41250c6831 + md5: cb5256b35c49fa51f405513668617077 + depends: + - geos >=3.14.1,<3.14.2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: GPL-2.0-or-later + license_family: GPL + run_exports: + weak: + - librttopo >=1.1.0,<1.2.0a0 + size: 407364 + timestamp: 1789161207817 +- conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.22-h6a83c73_3.conda + sha256: 6ffc0f69a71a4b440414d32ae2960202c570431a4605069ad2762b5c04b45f16 + md5: 44aa173fe5fec2e3ba2f884cf90253c6 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: ISC + run_exports: + weak: + - libsodium >=1.0.22,<1.0.23.0a0 + size: 280822 + timestamp: 1789425326114 +- conda: https://conda.anaconda.org/conda-forge/win-64/libspatialindex-2.1.0-h2854ae6_1.conda + sha256: 96302435f559cbc576ad75cc9c12f753c1b0cb73cde3ffc8d47d571d610f8868 + md5: 8657ea6a7937edbe4f1003c41217a708 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + run_exports: + weak: + - libspatialindex >=2.1.0,<2.1.1.0a0 + size: 314651 + timestamp: 1781556469008 +- conda: https://conda.anaconda.org/conda-forge/win-64/libspatialite-5.1.0-gpl_hc1bbfae_121.conda + sha256: 7fdab31179edfd1cb9342c9612ccee884b3fb750ba32330ab571721251b3a34a + md5: 8b656a8dfd1bed10482192b7ecf8bddf + depends: + - freexl >=2 + - freexl >=2.0.0,<3.0a0 + - geos >=3.14.1,<3.14.2.0a0 + - librttopo >=1.1.0,<1.2.0a0 + - libsqlite >=3.53.4,<4.0a0 + - libxml2 + - libxml2-16 >=2.15.4 + - libxml2-devel + - libzlib >=1.3.2,<2.0a0 + - proj >=9.8.1,<9.9.0a0 + - sqlite + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - zlib + license: MPL-1.1 + license_family: MOZILLA + run_exports: + weak: + - libspatialite >=5.1.0,<5.2.0a0 + size: 8310698 + timestamp: 1789168171968 +- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.4-hf5d6505_1.conda + sha256: 0a45d7c0f20146fff787a106f8fa187872e309c70975ff8f0936e188914c26ad + md5: a72d495965b144bb7da033642d389047 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: blessing + run_exports: + weak: + - libsqlite >=3.53.4,<4.0a0 + size: 1314919 + timestamp: 1787051140039 +- conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h734d217_1.conda + sha256: 1097b08429b4f53f5751a32c6d99a083d227ca7f7812c0b239eea124cec073a0 + md5: a21dd9ca39e74910bb96989feb916420 + depends: + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.7,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libssh2 >=1.11.1,<2.0a0 + size: 295149 + timestamp: 1786713186180 +- conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.2-h8f73337_1.conda + sha256: 3575a092e3e52625a1767804a4ebd321becaadf61b63dcd6735ebb88c0b3c359 + md5: 970dbe48f843e7fbd179a9b6c22f865a + depends: + - lerc >=4.2.0,<5.0a0 + - libdeflate >=1.25,<1.26.0a0 + - libjpeg-turbo >=3.2.0,<4.0a0 + - liblzma >=5.8.3,<6.0a0 + - libzlib >=1.3.2,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - zstd >=1.5.7,<1.6.0a0 + license: HPND + run_exports: + weak: + - libtiff >=4.7.2,<4.8.0a0 + size: 1014211 + timestamp: 1787755773611 +- conda: https://conda.anaconda.org/conda-forge/win-64/libvorbis-1.3.7-h5112557_2.conda + sha256: 429124709c73b2e8fae5570bdc6b42f5418a7551ba72e591bb960b752e87b365 + md5: 42a8a56c60882da5d451aa95b8455111 + depends: + - libogg + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libogg >=1.3.5,<1.4.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libvorbis >=1.3.7,<1.4.0a0 + size: 243401 + timestamp: 1753879416570 +- conda: https://conda.anaconda.org/conda-forge/win-64/libvulkan-loader-1.4.357.0-h477610d_2.conda + sha256: 4b094443126c5fc38d200eb0ea335b67e64d966d7aa737bb3141217a787b0c73 + md5: aaeed7feddbfd7454f8853a5eae8d902 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + constrains: + - libvulkan-headers 1.4.357.0.* + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - libvulkan-loader >=1.4.357.0,<2.0a0 + size: 288787 + timestamp: 1787491929908 +- conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-1.6.0-h4d5522a_2.conda + sha256: 184b880fdf0d9353ef9d59591c7afaf48bc7072d3caee53065601194f7a3d73e + md5: 8458b60500206407552ab5f342795b62 + depends: + - libwebp-base 1.6.0.* + - libwebp-base >=1.6.0,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libwebp-base >=1.6.0,<2.0a0 + size: 72236 + timestamp: 1788189079619 +- conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_1.conda + sha256: 4470d98d3178b0d45492eed4808afe421d2e7808352b8d06c2dc29166b75d94d + md5: 35a9475e4cc999d52921f57c181979fc + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - libwebp 1.6.0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libwebp-base >=1.6.0,<2.0a0 + size: 278886 + timestamp: 1785954716703 +- conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda + sha256: 0fccf2d17026255b6e10ace1f191d0a2a18f2d65088fd02430be17c701f8ffe0 + md5: 8a86073cf3b343b87d03f41790d8b4e5 + depends: + - ucrt + constrains: + - pthreads-win32 <0.0a0 + - msys2-conda-epoch <0.0a0 + license: MIT AND BSD-3-Clause-Clear + run_exports: {} + size: 36621 + timestamp: 1759768399557 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.4-h3cfd58e_0.conda + sha256: 9fa71cec30425c9cc8eda6af3574af1faf4fefa5e239c9e037b1f778ef3ce8ac + md5: bab5489f4bd38494ffaa83d6ab924c1f + depends: + - icu >=78.3,<79.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libzlib >=1.3.2,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - libxml2 2.15.4 + license: MIT + license_family: MIT + run_exports: {} + size: 515800 + timestamp: 1788635268845 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.4-he095d88_0.conda + sha256: a19bb3821830f6b1281e782844d5dd265f796dfed2e4812b16c9995a8c778c88 + md5: 3ce54d0f8f24dfab99d82414411640aa + depends: + - icu >=78.3,<79.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libxml2-16 2.15.4 h3cfd58e_0 + - libzlib >=1.3.2,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - libxml2 + - libxml2-16 >=2.15.4 + size: 43845 + timestamp: 1788635276599 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-devel-2.15.4-he095d88_0.conda + sha256: 047e9b29a4489a5c7e13d319232d2f14392d789b3e6ea2cd54ace1fef77f6ecd + md5: d50e00d25a326eb487f9f5540e09b77b + depends: + - icu >=78.3,<79.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libxml2 2.15.4 he095d88_0 + - libxml2-16 2.15.4 h3cfd58e_0 + - libzlib >=1.3.2,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - libxml2 + - libxml2-16 >=2.15.4 + size: 123569 + timestamp: 1788635283467 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxslt-1.1.45-ha5384fd_1.conda + sha256: 7a2402fa33b7e4a99bba6250ce21c36269a8acbfcb3652057dce0f4a60b7f6bd + md5: ea7b3abfe39c180d1dce620867e267d1 + depends: + - libxml2 + - libxml2-16 >=2.15.3 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - libxslt >=1.1.45,<2.0a0 + size: 421402 + timestamp: 1788534969422 +- conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_3.conda + sha256: 0629c2cc0404d3bb29d6baa7b4ba62da80797015e86de050db81ea5a07050527 + md5: 5d2ff29d465097458cc3ff6569151991 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - zlib 1.3.2 *_3 + license: Zlib + license_family: Other + run_exports: + weak: + - libzlib >=1.3.2,<2.0a0 + size: 58529 + timestamp: 1785276664143 +- conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-23.1.1-h49e36cd_0.conda + sha256: 49b0967e84eae82cc2acaf4400629c7b9c08a491b9c8d3343f3f5f2feee7138d + md5: f895db3df946e742c3ce07cfce271bdd + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - intel-openmp <0.0a0 + - openmp 23.1.1|23.1.1.* + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + run_exports: + strong: + - llvm-openmp >=23.1.1 + size: 343428 + timestamp: 1788967655621 +- conda: https://conda.anaconda.org/conda-forge/win-64/lxml-6.1.3-py314h3fc22ad_0.conda + sha256: 97f0956d8aede2221dd3b7daf42d80e693f8e906b55a46d2b03865dd8729b3a7 + md5: 188bc2ebac54e7f94a4334be9039e773 + depends: + - libxml2 + - libxml2-16 >=2.15.4 + - libxslt >=1.1.45,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause and MIT-CMU + run_exports: {} + size: 1275647 + timestamp: 1789036807920 +- conda: https://conda.anaconda.org/conda-forge/win-64/lz4-c-1.10.0-h6a83c73_2.conda + sha256: 6824e36be0f95ae516dc36dddd18f69cbad0e4e07906fcb10a5f26a8dc471903 + md5: 3e0691cb20fcaf922df78ccea08b771a + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: BSD-2-Clause + license_family: BSD + run_exports: + weak: + - lz4-c >=1.10.0,<1.11.0a0 + size: 150673 + timestamp: 1786717127870 +- conda: https://conda.anaconda.org/conda-forge/win-64/lzo-2.10-h6a83c73_1003.conda + sha256: e26c855c4b5d797ba5a9e96a6392d58676981660849b99fdb939aee3164e8323 + md5: 3678b093a471615102e97124f37b233f + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: GPL-2.0-or-later + license_family: GPL + run_exports: + weak: + - lzo >=2.10,<3.0a0 + size: 165289 + timestamp: 1787049159945 +- conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py314h2359020_1.conda + sha256: 02805a0f3cd168dbf13afc5e4aed75cc00fe538ce143527a6471485b36f5887c + md5: 8de7b40f8b30a8fcaa423c2537fe4199 + depends: + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 30022 + timestamp: 1772445159549 +- conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.11.1-py314h30c6bc1_2.conda + sha256: 3599b3ae70c4fd210e83d3e04920b70e763a3c3cc6a589f7a46776a339cf79c0 + md5: d8f7f4bb221698dda04dd955eb6f7e52 + depends: + - matplotlib-base >=3.11.1,<3.11.2.0a0 + - pyside6 >=6.7.2 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - tornado >=5 + license: PSF-2.0 + license_family: PSF + run_exports: {} + size: 15333 + timestamp: 1785211311397 +- conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.11.1-py314h2061cd4_2.conda + sha256: b3f19b71ea556c79b67a599929a4c05618fd4ae03d7412e65adc95ec627670c5 + md5: 88c095cee1bcd48178328c93920870a2 + depends: + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.28.2 + - freetype + - kiwisolver >=1.3.1 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libraqm >=0.11.0,<0.12.0a0 + - numpy >=1.25 + - numpy >=1.25,<3 + - packaging >=20.0 + - pillow >=9 + - pyparsing >=3 + - python >=3.14,<3.15.0a0 + - python-dateutil >=2.7 + - python_abi 3.14.* *_cp314 + - qhull >=2020.2,<2020.3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: PSF-2.0 + license_family: PSF + run_exports: {} + size: 8810362 + timestamp: 1785211292854 +- conda: https://conda.anaconda.org/conda-forge/win-64/minizip-4.2.2-hdc83b33_1.conda + sha256: ea378e49e567baede08d298f43718f14833f8c0ae6066660e4d6b62f6e936f99 + md5: 08101c2ed7f91f83798aa142b964d338 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - zstd >=1.5.7,<1.6.0a0 + - bzip2 >=1.0.8,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libzlib >=1.3.2,<2.0a0 + license: Zlib + run_exports: + weak: + - minizip >=4.2.2,<5.0a0 + size: 128690 + timestamp: 1788896573362 +- conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2026.1.0-hac47afa_235.conda + sha256: bb8abe071f73765446df62924031e6599577e8ac9003264dc4569e78c0fea16d + md5: ace316c48c178d7faa403dee51e30c7b + depends: + - llvm-openmp >=22.1.8 + - tbb >=2023.0.0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LicenseRef-IntelSimplifiedSoftwareOct2022 + license_family: Proprietary + run_exports: {} + size: 114686732 + timestamp: 1787725739779 +- conda: https://conda.anaconda.org/conda-forge/win-64/muparser-2.3.5-h5112557_1.conda + sha256: 65c4ae59ba5b4b557b4ce79632fb0d01cdcfe0894ed742d9f129442353de7b4a + md5: 3084e08306d71a87b785efae1fa22564 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + run_exports: + weak: + - muparser >=2.3.5,<2.4.0a0 + size: 164026 + timestamp: 1788122502315 +- conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.5.3-py314h02f10f6_0.conda + sha256: 03e0def4425d045b9afb2e2c895bcd0233de6f1aeec53575ba00dd262c4f00e4 + md5: 806daade32d05870efd4d63931c12c9d + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - liblapack >=3.9.0,<4.0a0 + - python_abi 3.14.* *_cp314 + - libcblas >=3.9.0,<4.0a0 + - libblas >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - numpy >=1.25,<3 + size: 7514382 + timestamp: 1788731986512 +- conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.4-h90fa87c_2.conda + sha256: d1c630ccd9ae0898b48d84e986f4c330f66a25e535f99efe8cbf03f042b33da5 + md5: d9b2cb1079cf59651722c09aa3a9f840 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libpng >=1.6.58,<1.7.0a0 + - libtiff >=4.7.2,<4.8.0a0 + - libzlib >=1.3.2,<2.0a0 + license: BSD-2-Clause + license_family: BSD + run_exports: + weak: + - openjpeg >=2.5.4,<3.0a0 + size: 274994 + timestamp: 1788425052805 +- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.4-hf411b9b_0.conda + sha256: 9dddb559ba49744d5d94092d8d13cb0567f5c3b3f439f3acf28433d1f4256acc + md5: 73cb1783f47c452be4c309430fbef89f + depends: + - ca-certificates + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - openssl >=3.6.4,<4.0a0 + size: 9474879 + timestamp: 1787699876495 +- conda: https://conda.anaconda.org/conda-forge/win-64/pandas-3.0.5-py314hf700ef7_1.conda + sha256: 399c1d7f7918986d9c1a646f4e789ac24749149598d16b529febc3361e9aad23 + md5: a519b50147401cf6bad2fd188028ad38 + depends: + - python + - numpy >=1.26.0 + - python-dateutil >=2.8.2 + - python-tzdata + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + - numpy >=1.23,<3 + constrains: + - adbc-driver-postgresql >=1.2.0 + - adbc-driver-sqlite >=1.2.0 + - beautifulsoup4 >=4.12.3 + - blosc >=1.21.3 + - bottleneck >=1.4.2 + - fastparquet >=2024.11.0 + - fsspec >=2024.10.0 + - gcsfs >=2024.10.0 + - html5lib >=1.1 + - hypothesis >=6.116.0 + - jinja2 >=3.1.5 + - lxml >=5.3.0 + - matplotlib >=3.9.3 + - numba >=0.60.0 + - numexpr >=2.10.2 + - odfpy >=1.4.1 + - openpyxl >=3.1.5 + - psycopg2 >=2.9.10 + - pyarrow >=13.0.0 + - pyiceberg >=0.8.1 + - pymysql >=1.1.1 + - pyqt5 >=5.15.9 + - pyreadstat >=1.2.8 + - pytables >=3.10.1 + - pytest >=8.3.4 + - pytest-xdist >=3.6.1 + - python-calamine >=0.3.0 + - pytz >=2024.2 + - pyxlsb >=1.0.10 + - qtpy >=2.4.2 + - scipy >=1.14.1 + - s3fs >=2024.10.0 + - sqlalchemy >=2.0.36 + - tabulate >=0.9.0 + - xarray >=2024.10.0 + - xlrd >=2.0.1 + - xlsxwriter >=3.2.0 + - zstandard >=0.23.0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 14103773 + timestamp: 1785276287020 +- conda: https://conda.anaconda.org/conda-forge/win-64/pandoc-3.11-h57928b3_0.conda + sha256: 03b03e1c841f25e738bafe60e20cae65a98951683f14e72aae6a8ac359e0501c + md5: 4587e6544ff96ef0ee50b042f9d3719d + license: GPL-2.0-or-later + license_family: GPL + run_exports: {} + size: 26983655 + timestamp: 1788174492517 +- conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.58.2-h13911b6_1.conda + sha256: 110d2731a105c0b9bd6396ad371401db90bd53179a283ff77f774872beb5bcd4 + md5: 7953b4cc0a7a47a0d91fa2e664269a0c + depends: + - cairo >=1.18.4,<2.0a0 + - fontconfig >=2.18.3,<3.0a0 + - fonts-conda-ecosystem + - fribidi >=1.0.16,<2.0a0 + - libexpat >=2.8.1,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libglib >=2.88.3,<3.0a0 + - libharfbuzz >=14.4.0 + - libpng >=1.6.58,<1.7.0a0 + - libzlib >=1.3.2,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: LGPL-2.1-or-later + run_exports: + weak: + - pango >=1.58.2,<2.0a0 + size: 465040 + timestamp: 1788490491378 +- conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.47-h8466c1e_1.conda + sha256: d8e9ea26b52a09d880d1e5371830c8dd5b4c099a6db64dbdf8236440744b7499 + md5: 009af999dbe2d1db36a37187a4ca4eb4 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - pcre2 >=10.47,<10.48.0a0 + size: 993241 + timestamp: 1787294653206 +- conda: https://conda.anaconda.org/conda-forge/win-64/pillow-12.3.0-py314h6acc0e1_4.conda + sha256: ef77652c99881aa3bf33ca0f41a3d30ee89411f5510130a8593c8dc6fad4f3eb + md5: af66d9a6146d2bfb62fb308c693ffd8a + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libjpeg-turbo >=3.2.0,<4.0a0 + - openjpeg >=2.5.4,<3.0a0 + - zlib-ng >=2.3.3,<2.4.0a0 + - python_abi 3.14.* *_cp314 + - libtiff >=4.7.2,<4.8.0a0 + - lcms2 >=2.19.1,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - tk >=8.6.13,<8.7.0a0 + - libwebp-base >=1.6.0,<2.0a0 + license: HPND + run_exports: {} + size: 988025 + timestamp: 1789122658720 +- conda: https://conda.anaconda.org/conda-forge/win-64/pixman-0.46.4-h5112557_3.conda + sha256: cad8b94c2b00264a15d469eed6dc53aac1c59c6d46f27ad1d91bfaf227cf136a + md5: 27c5be39d9e4d25fe85b89a069360d1e + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + run_exports: + weak: + - pixman >=0.46.4,<1.0a0 + size: 257473 + timestamp: 1786106677325 +- conda: https://conda.anaconda.org/conda-forge/win-64/proj-9.8.1-hd30e2cd_1.conda + sha256: 900c78a977cc0e848c1234064b2469f8b372b9dce1097bb5e9182f56bab1722d + md5: 434616a1662714fe1a75a51ace8c72d6 + depends: + - sqlite + - libtiff + - libcurl + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libcurl >=8.21.0,<9.0a0 + - libtiff >=4.7.2,<4.8.0a0 + - libsqlite >=3.53.4,<4.0a0 + constrains: + - proj4 ==999999999999 + license: MIT + license_family: MIT + run_exports: + weak: + - proj >=9.8.1,<9.9.0a0 + size: 3129858 + timestamp: 1787905007013 +- conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.2.2-py314hc5dbbe4_2.conda + sha256: 5bc133d5b69a7c2679a7c59caa35273460cd5b12b6c40a0ed07f760ae7df4d7d + md5: e5f28a48fe6fade84972e3aba057f400 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 250098 + timestamp: 1788189997310 +- conda: https://conda.anaconda.org/conda-forge/win-64/pynacl-1.6.2-py311he66da3d_5.conda + noarch: python + sha256: 76dca0317bfce61eb94a21c78de8a2d34cdf1a26637fe142ed8e03e59f4bd076 + md5: 4c6ea05051335ae9c74a0314d3e5a267 + depends: + - cffi >=2.0.0 + - python + - six + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - _python_abi3_support 1.* + - cpython >=3.11 + - libsodium >=1.0.22,<1.0.23.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 2330939 + timestamp: 1788957168977 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyogrio-0.13.0-py314he172734_0.conda + sha256: 25a520b775aabf3d85014b99736a968727cf921ee9d52fb03051aadd812b0fb6 + md5: d0026e98c1f21ed4078a3ee378dd0713 + depends: + - libgdal-core >=3.13.1,<3.14.0a0 + - numpy + - packaging + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: {} + size: 937065 + timestamp: 1782492935799 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyproj-3.8.0-py314h9d82244_1.conda + sha256: 7959c448bc18c5ca36aeaa0de322a7fa894aa207f3ea11c9f86d4692cf815ac2 + md5: 58a16b67fe467a91766546b0c6e2f5e3 + depends: + - python + - proj + - certifi + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - proj >=9.8.1,<9.9.0a0 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + run_exports: {} + size: 925319 + timestamp: 1789133213293 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyqt-5.15.11-py314h6044788_2.conda + sha256: 7b6750e275539364fc6e44c08a6c8bd184a95f5e124ad8a50d178307a18ec2f0 + md5: 9e98de0179da61e43bb35332e93d6182 + depends: + - pyqt5-sip 12.17.0 py314h13fbf68_2 + - python >=3.14.0rc3,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - qt-main >=5.15.15,<5.16.0a0 + - sip >=6.10.0,<6.11.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: GPL-3.0-only + license_family: GPL + run_exports: + weak: + - pyqt >=5.15.11,<5.16.0a0 + size: 3900596 + timestamp: 1759498211224 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyqt5-sip-12.17.0-py314h13fbf68_2.conda + sha256: 58e2fd5b1d6656e3434903de150c6d180940085d021b692c25c02a03c29cc75d + md5: 6cfb7d77c383c498eb2fef0aaac5ad45 + depends: + - packaging + - python >=3.14.0rc3,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - sip + - toml + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: GPL-3.0-only + license_family: GPL + run_exports: {} + size: 75572 + timestamp: 1759495899295 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyqtwebengine-5.15.11-py314hc416207_2.conda + sha256: 3af3b5738efc29d1aadb9bdfa8a6cd16f88064567e91c8b0b2fc0ab53abac7a2 + md5: 0b50ef307470af180b8d49cedb454216 + depends: + - pyqt >=5.15.11,<5.16.0a0 + - python >=3.14.0rc3,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - qt-main >=5.15.15,<5.16.0a0 + - qt-webengine >=5.15.15,<5.16.0a0 + - sip >=6.10.0,<6.11.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: GPL-3.0-only + license_family: GPL + run_exports: + weak: + - pyqtwebengine >=5.15.11,<5.16.0a0 + size: 128011 + timestamp: 1759498557904 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyside6-6.11.2-py314h0c0e1ae_1.conda + sha256: 30b0b40b7c550cfedebf2901e06d49e7e514be69df3d674c6dc042d03543a147 + md5: 2a0080a3a7c28a372db3cb629ae1b19f + depends: + - python + - qt6-main 6.11.2.* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libxslt >=1.1.45,<2.0a0 + - libclang13 >=23.1.0 + - libxml2 + - libxml2-16 >=2.15.4 + - qt6-main >=6.11.2,<7.0a0 + - python_abi 3.14.* *_cp314 + - libvulkan-loader >=1.4.357.0,<2.0a0 + license: LGPL-3.0-only + license_family: LGPL + run_exports: {} + size: 11552459 + timestamp: 1788744991512 +- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.7-h53f6dd8_106_cp314.conda + build_number: 106 + sha256: 9fdcb8a5018d91a22484e67ac6c5ae9116f082f953328f43ed4421418740dfb1 + md5: df0b471269a379db0262256e332c1e7c + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.8.1,<3.0a0 + - libffi >=3.7.0,<3.8.0a0 + - liblzma >=5.8.3,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libpython 3.14.7 h4f90d01_106_cp314 + - libsqlite >=3.53.4,<4.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.8,<4.0a0 + - python_abi 3.14.* *_cp314 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - zstd >=1.5.7,<1.6.0a0 + license: Python-2.0 + run_exports: + weak: + - python_abi 3.14.* *_cp314 + noarch: + - python + size: 18377601 + timestamp: 1788384478011 + python_site_packages_path: Lib/site-packages +- conda: https://conda.anaconda.org/conda-forge/win-64/python-gssapi-1.12.0-py314h66979ce_0.conda + sha256: a189870978f05890a29b1f95d76b266d576da747b356173b78185de9fbb6f9c7 + md5: d1b5de37b3f5055a583634d01621b81d + depends: + - decorator + - krb5 >=1.22.2,<1.23.0a0 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: ISC + run_exports: {} + size: 485572 + timestamp: 1788012915957 +- conda: https://conda.anaconda.org/conda-forge/win-64/pytokens-0.4.1-py314hc5dbbe4_2.conda + sha256: 2c97a59ce98b9d29a30bc49f3001b9206ce789edaee7d2773cde8a8a7f78abc4 + md5: 02632a618ced2283cf9a7c4a70a43026 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + run_exports: {} + size: 120434 + timestamp: 1778688861070 +- conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-312-py314hf700ef7_1.conda + sha256: 5a6ddd03a8441c2312a09f998dccb0bdeb1b906b45c9b8cd5e9f5a7965b0a604 + md5: 57992821d70e28562192fa29cff08260 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + license: PSF-2.0 + license_family: PSF + run_exports: {} + size: 4473050 + timestamp: 1787374336870 +- conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-ctypes-0.2.3-py314h86ab7b2_4.conda + sha256: 36a483fe6cfc39af48bd70f7048b54a3ddb9025143fb9953c97138e7dc823e9c + md5: 202999e164caa1307ba59db8f071a88f + depends: + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 58218 + timestamp: 1788533824733 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py314h2359020_1.conda + sha256: a2aff34027aa810ff36a190b75002d2ff6f9fbef71ec66e567616ac3a679d997 + md5: 0cd9b88826d0f8db142071eb830bce56 + depends: + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + run_exports: {} + size: 181257 + timestamp: 1770223460931 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-27.2.0-py312h343a6d4_1.conda + noarch: python + sha256: 205cc72ee1fce3e910cd75530f985f2d83396725586852a0b64d29836109e40f + md5: 8fff1fa5531434db2670ea690e46d3c8 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - zeromq >=4.3.5,<4.3.6.0a0 + - _python_abi3_support 1.* + - cpython >=3.12 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 191808 + timestamp: 1789103793759 +- conda: https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-hc790b64_5.conda + sha256: 887d53486a37bd870da62b8fa2ebe3993f912ad04bd755e7ed7c47ced97cbaa8 + md5: 854fbdff64b572b5c0b470f334d34c11 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: LicenseRef-Qhull + run_exports: + weak: + - qhull >=2020.2,<2020.3.0a0 + size: 1377020 + timestamp: 1720814433486 +- conda: https://conda.anaconda.org/conda-forge/win-64/qt-main-5.15.15-hc95f6a6_8.conda + sha256: e30c4dfc4e0690b9e185c960e18bf5020e52837b5127b47f654f39b3ae11fe4e + md5: cc54806e21c9fb479ce6dd5f8e2e96fc + depends: + - gst-plugins-base >=1.26.10,<1.27.0a0 + - gstreamer >=1.26.10,<1.27.0a0 + - icu >=78.3,<79.0a0 + - krb5 >=1.22.2,<1.23.0a0 + - libclang13 >=22.1.0 + - libglib >=2.86.4,<3.0a0 + - libjpeg-turbo >=3.1.2,<4.0a0 + - libpng >=1.6.55,<1.7.0a0 + - libsqlite >=3.52.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - qt 5.15.15 + license: LGPL-3.0-only + license_family: LGPL + run_exports: + weak: + - qt-main >=5.15.15,<5.16.0a0 + size: 59170602 + timestamp: 1773962814517 +- conda: https://conda.anaconda.org/conda-forge/win-64/qt-webengine-5.15.15-h087ee03_1.conda + sha256: 1f293ab21bb47c2f23efdf8b9c80d14a67a2c717a92430559a54a30762126136 + md5: 016d6420e9c4b0dc53c0a3806a997311 + depends: + - libiconv >=1.17,<2.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.44,<1.7.0a0 + - libsqlite >=3.47.0,<4.0a0 + - libwebp + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - qt-main >=5.15.15,<5.16.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.40.33810 + constrains: + - qt 5.15.3|5.15.4|5.15.6|5.15.8|5.15.15 + license: LGPL-3.0-only + license_family: LGPL + run_exports: + weak: + - qt-webengine >=5.15.15,<5.16.0a0 + size: 54619398 + timestamp: 1729957102131 +- conda: https://conda.anaconda.org/conda-forge/win-64/qt6-main-6.11.2-pl5321hfcac499_0.conda + sha256: 042c94a5a7a89b0b28a24f6ae6a2d3d609751edab78454057973ec5cc3e77d7d + md5: d98a163070d05c6ed4421432ee1bafb8 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libvulkan-loader >=1.4.357.0,<2.0a0 + - icu >=78.3,<79.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libharfbuzz >=14.3.1 + - libzlib >=1.3.2,<2.0a0 + - double-conversion >=3.4.0,<3.5.0a0 + - libglib >=2.88.3,<3.0a0 + - krb5 >=1.22.2,<1.23.0a0 + - pcre2 >=10.47,<10.48.0a0 + - libpng >=1.6.58,<1.7.0a0 + - zstd >=1.5.7,<1.6.0a0 + - libsqlite >=3.53.4,<4.0a0 + - openssl >=3.5.7,<4.0a0 + - libjpeg-turbo >=3.2.0,<4.0a0 + - libtiff >=4.7.2,<4.8.0a0 + - libbrotlicommon >=1.2.0,<1.3.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + - libwebp-base >=1.6.0,<2.0a0 + constrains: + - qt ==6.11.2 + license: LGPL-3.0-only + license_family: LGPL + run_exports: + weak: + - qt6-main >=6.11.2,<7.0a0 + size: 89682645 + timestamp: 1787049046883 +- conda: https://conda.anaconda.org/conda-forge/win-64/rasterio-1.5.1-py314h0f7306d_1.conda + sha256: 932c536ba61e34fbf73845118a25d2ff6d3b533e0693ec5755e5fd67a33e8210 + md5: 6b5756070c6380b7a27401100cc8fff5 + depends: + - affine + - attrs + - certifi + - click >=4,!=8.2.* + - click-plugins + - cligj >=0.5 + - libgdal-core >=3.13.2,<3.14.0a0 + - numpy >=1.25,<3 + - proj >=9.8.1,<9.9.0a0 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - setuptools >=0.9.8 + - snuggs >=1.4.1 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 8892506 + timestamp: 1786313866817 +- conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-2026.6.3-py314h9f07db2_2.conda + sha256: 48083dbd1007c26326a39b2ec89e1eba83e425c2ad2775779c51beb5cba0c46e + md5: c1662c5b6960642f24077fc9328cb0be + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + run_exports: {} + size: 218961 + timestamp: 1788577430937 +- conda: https://conda.anaconda.org/conda-forge/win-64/ruff-0.16.7-hcc30601_0.conda + noarch: python + sha256: 61fa582f421a6edd66874338c149437337e4b19ac1cb3d6a802bebbf04e3b846 + md5: 9bce6eb98ca3a26401f82ce7d486cbe5 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + run_exports: {} + size: 9332759 + timestamp: 1789115768076 +- conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.9.1-np2py314h1b5b07a_0.conda + sha256: 346b1dedac0448ea31b5140c4af1f5b14b5364a99fa0af88aec58f7d7264f04a + md5: ee30f2ad4a7af5b01f4a9cf3c0091edd + depends: + - python + - numpy >=1.24.1 + - scipy >=1.10.0 + - joblib >=1.4.0 + - threadpoolctl >=3.5.0 + - narwhals >=2.0.1 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + - numpy >=1.25,<3 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 9329218 + timestamp: 1789048421824 +- conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.18.1-py314h67d5eaa_0.conda + sha256: 41ebfc8e029fe855b6200f606930f55124790d822bba8df52d24c5e7a31e5f24 + md5: cf69eeaa0405955905a06f0b2771bba4 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - numpy <2.8 + - numpy >=1.25,<3 + - numpy >=2.0.0 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 15192205 + timestamp: 1789137604037 +- conda: https://conda.anaconda.org/conda-forge/win-64/shapely-2.1.2-py314h76f3c27_3.conda + sha256: 93c6f0d6185eff7fe8a4aaad134dbdb68e1f81d4302508fb61cb566d34cdfb1e + md5: 638b8119a8a64f2cea7dc430dd5e6ba7 + depends: + - geos >=3.14.1,<3.14.2.0a0 + - numpy >=1.25,<3 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 620890 + timestamp: 1789120189711 +- conda: https://conda.anaconda.org/conda-forge/win-64/simplejson-4.1.2-py314h5a2d7ad_1.conda + sha256: 1f4117d723ab25bf231162701c763e7c502caea0a65163ede60120543712b14c + md5: 579ef7dd293c37b0e808f8b3b01559a8 + depends: + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: {} + size: 169753 + timestamp: 1788525286329 +- conda: https://conda.anaconda.org/conda-forge/win-64/sip-6.10.0-py314h13fbf68_1.conda + sha256: f795efd64904619c8555f7da67e23b97d2892dc834033050290730b30c40f600 + md5: 616ff579825fcd5782ec14e762291fba + depends: + - packaging + - ply + - python >=3.14.0rc3,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - setuptools + - tomli + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-2-Clause + license_family: BSD + run_exports: + weak: + - sip >=6.10.0,<6.11.0a0 + size: 711961 + timestamp: 1759438141357 +- conda: https://conda.anaconda.org/conda-forge/win-64/snappy-1.2.2-h7fa0ca8_1.conda + sha256: d2deda1350abf8c05978b73cf7fe9147dd5c7f2f9b312692d1b98e52efad53c3 + md5: 3075846de68f942150069d4289aaad63 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - snappy >=1.2.2,<1.3.0a0 + size: 67417 + timestamp: 1762948090450 +- conda: https://conda.anaconda.org/conda-forge/win-64/spyder-base-6.1.7-py314h86ab7b2_0.conda + sha256: c6eb5c43e1b5c2ea6e7cf4467e7704f8cfa1a2c17a1a00e6741703b79a856a7d + md5: a201e4d8451be609a88b3f750395e304 + depends: + - aiohttp >=3.11.2 + - asyncssh >=2.14.0,<3.0.0 + - bcrypt >=4.3.0 + - chardet >=5.2.0,<8.0.0 + - cloudpickle >=0.5.0 + - cookiecutter >=1.6.0 + - diff-match-patch >=20181111 + - fzf >=0.42.0 + - importlib-metadata >=4.6.0 + - intervaltree >=3.0.2 + - ipython >=8.15.0,<10.0.0,!=8.17.1,!=9.1.0,!=9.2.0,!=9.3.0,!=9.4.0 + - ipython_pygments_lexers >=1.0 + - jedi >=0.17.2,<0.21.0 + - jellyfish >=0.7 + - jsonschema >=3.2.0 + - keyring >=17.0.0 + - markdown-it-py >=3.0.0 + - nbconvert >=4.0 + - numpydoc >=0.6.0 + - packaging >=20.0 + - parso >=0.7.0,<0.9.0 + - pexpect >=4.4.0 + - pickleshare >=0.4 + - psutil >=5.3 + - ptyprocess >=0.5 + - pygithub >=2.3.0 + - pygments >=2.0 + - pylint >=3.1,<5 + - pylint-venv >=3.0.2 + - pyls-spyder >=0.4.0 + - python >=3.14,<3.15.0a0 + - python-lsp-black >=2.0.0,<3.0.0 + - python-lsp-ruff >=2.3.0,<3.0.0 + - python-lsp-server >=1.15.0,<1.16.0 + - python_abi 3.14.* *_cp314 + - pyuca >=1.2 + - pyzmq >=24.0.0 + - qdarkstyle >=3.2.0,<3.3.0 + - qstylizer >=0.2.2 + - qtawesome >=1.4.1,<1.5.0 + - qtconsole-base >=5.7.2,<5.8.0 + - qtpy >=2.4.0 + - rtree >=0.9.7 + - sphinx >=7.2.0 + - spyder-kernels >=3.1.6,<3.2.0 + - superqt >=0.6.2,<1.0.0 + - textdistance >=4.2.0 + - three-merge >=0.1.1 + - watchdog >=0.10.3 + - yarl >=1.9.4 + constrains: + - spyder 6.1.7 *0 + license: MIT + license_family: MIT + run_exports: {} + size: 11753945 + timestamp: 1787879809155 +- conda: https://conda.anaconda.org/conda-forge/win-64/sqlite-3.53.4-hdb435a2_1.conda + sha256: 7616fec2d6ded67e111a47d4842738d0b3730c0acf3eaebe928cf6d3e15a6822 + md5: df9d7c5d34602e0f2655a524d31fce87 + depends: + - libsqlite 3.53.4 hf5d6505_1 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: blessing + run_exports: + weak: + - libsqlite >=3.53.4,<4.0a0 + size: 426888 + timestamp: 1787051146089 +- conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2023.1.0-hdcfe883_0.conda + sha256: 7a65accbe954d0304b9056005f59fbee8b3928ceced38b1e3e8272aa1af0b750 + md5: 8b1275f06705cdc2ab67f3bfdf4df843 + depends: + - libhwloc >=2.13.0,<2.13.1.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 157295 + timestamp: 1788879168472 +- conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h967ab96_4.conda + sha256: f19618a3a82cc483dacf1c70a30367ee7b0c7e71b90f1f80e14feff44fbd3688 + md5: dd9eb33c99d352b6356f86964d6040f7 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: TCL + run_exports: + weak: + - tk >=8.6.13,<8.7.0a0 + size: 3782376 + timestamp: 1787272860855 +- conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.8-py314h5a2d7ad_2.conda + sha256: 21cb2bf3b91d6a6bb2ec54a8439d50785c3016324582ee0c11c59e3c5835be05 + md5: 5e41710f9034bf7afb4ea90160642962 + depends: + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + run_exports: {} + size: 923046 + timestamp: 1789077090436 +- conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + sha256: 3005729dce6f3d3f5ec91dfc49fc75a0095f9cd23bab49efb899657297ac91a5 + md5: 71b24316859acd00bdb8b38f5e2ce328 + constrains: + - vc14_runtime >=14.29.30037 + - vs2015_runtime >=14.29.30037 + license: LicenseRef-MicrosoftWindowsSDK10 + run_exports: {} + size: 694692 + timestamp: 1756385147981 +- conda: https://conda.anaconda.org/conda-forge/win-64/ujson-6.0.0-py314hb98de8c_0.conda + sha256: 4ac3e2d4c56126efabe3e47ce4232bbb705b6d9a6fbe922fe1f5f82da037f097 + md5: 10bfb9c89ac7c75d944acb72e3b14b75 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 50822 + timestamp: 1788568492438 +- conda: https://conda.anaconda.org/conda-forge/win-64/uriparser-0.9.8-h5a68840_0.conda + sha256: ed0eed8ed0343d29cdbfaeb1bfd141f090af696547d69f91c18f46350299f00d + md5: 28b4cf9065681f43cc567410edf8243d + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - uriparser >=0.9.8,<1.0a0 + size: 49181 + timestamp: 1715010467661 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.5-ha367084_41.conda + sha256: 35444c55a92e2f7f7ba26bc70f81e56e52344f7d064c0fd4b40a46a58517b79c + md5: aa805b5522c2a98fa286e551a1f48546 + depends: + - vc14_runtime >=14.51.36247 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 21383 + timestamp: 1785359368566 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36247-habf1de7_41.conda + sha256: 4e4cb599cdc41bf2109d1464c127b5bcbddf548ce3e322e612afb691338b48f8 + md5: ac5333bb3d429361f23adf704cc49a78 + depends: + - ucrt >=10.0.20348.0 + - vcomp14 14.51.36247 habf1de7_41 + constrains: + - vs2015_runtime 14.51.36247.* *_41 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + run_exports: {} + size: 767955 + timestamp: 1785359364369 +- conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36247-habf1de7_41.conda + sha256: 731e043390c9457299484d39e427221fc868a9249540a498a5a4f6456c7744d1 + md5: 350bb67a5c8e5f1c53347ac544ab6600 + depends: + - ucrt >=10.0.20348.0 + constrains: + - vs2015_runtime 14.51.36247.* *_41 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + run_exports: + strong: + - vcomp14 >=14.51.36247 + size: 155910 + timestamp: 1785359349999 +- conda: https://conda.anaconda.org/conda-forge/win-64/watchdog-6.0.0-py314hb821551_4.conda + sha256: 24df89f815e827d7b8d66ffc4b9aed9d8f8ff95561fe0979f67b41e00c45aed4 + md5: b97fc427d9b184db45526703856ddd39 + depends: + - python + - pyyaml >=3.10 + - python_abi 3.14.* *_cp314 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 190129 + timestamp: 1788503192360 +- conda: https://conda.anaconda.org/conda-forge/win-64/wrapt-2.4.0-py314hc5dbbe4_2.conda + sha256: 49fef26271a76b8c245ddc77482676a578bbf4870bc0d215d354280e8518b39d + md5: ea7ac7ba5ca389a458cde9d9e2ee4a3f + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 140477 + timestamp: 1789161056652 +- conda: https://conda.anaconda.org/conda-forge/win-64/xerces-c-3.3.0-hac47afa_2.conda + sha256: c0c2fdd02f921388a9f1e455766f65d9b506ade2bba47dc515d467276d1bf621 + md5: e09251a25a8c503eb30375e187de2c93 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - xerces-c >=3.3.0,<3.4.0a0 + size: 3602732 + timestamp: 1788145329509 +- conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda + sha256: 80ee68c1e7683a35295232ea79bcc87279d31ffeda04a1665efdb43cbd50a309 + md5: 433699cba6602098ae8957a323da2664 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + run_exports: + weak: + - yaml >=0.2.5,<0.3.0a0 + size: 63944 + timestamp: 1753484092156 +- conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-h3a581c9_12.conda + sha256: 77666f68961acb86b985645734dcf7827355cf22a7f9236838e1a6e07bf06124 + md5: fc0bef11265f13c4acd2ab4a7432d5ab + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - krb5 >=1.22.2,<1.23.0a0 + - libsodium >=1.0.22,<1.0.23.0a0 + license: MPL-2.0 + license_family: MOZILLA + run_exports: + weak: + - zeromq >=4.3.5,<4.3.6.0a0 + size: 265930 + timestamp: 1789076564779 +- conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.3.2-hfd05255_3.conda + sha256: 5a0b55df66ff07b4342e04967cef69f8bf348f6a0fb1cc1eca741c7b015dfe77 + md5: 945092a9bc1d0f250f7d5ecf51ecd471 + depends: + - libzlib 1.3.2 hfd05255_3 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Zlib + license_family: Other + run_exports: + weak: + - libzlib >=1.3.2,<2.0a0 + size: 851288 + timestamp: 1785276674755 +- conda: https://conda.anaconda.org/conda-forge/win-64/zlib-ng-2.3.3-h0261ad2_1.conda + sha256: 71332532332d13b5dbe57074ddcf82ae711bdc132affa5a2982a29ffa06dc234 + md5: 46a21c0a4e65f1a135251fc7c8663f83 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Zlib + license_family: Other + run_exports: + weak: + - zlib-ng >=2.3.3,<2.4.0a0 + size: 124542 + timestamp: 1770167984883 +- conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_7.conda + sha256: ca7daae4f218a11fab82cc2857f0ea518ec3f46acec60490485347a4c22c6b3e + md5: e4ac308c39d6d0e131154976da67cf3b + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libzlib >=1.3.2,<2.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - zstd >=1.5.7,<1.6.0a0 + size: 387535 + timestamp: 1786599623274 diff --git a/pixi.toml b/pixi.toml new file mode 100644 index 0000000..32e6b67 --- /dev/null +++ b/pixi.toml @@ -0,0 +1,20 @@ +[workspace] +authors = ["Arno Timmer "] +channels = ["conda-forge"] +name = "raster" +platforms = ["win-64"] +version = "0.1.0" + +[tasks] + +[dependencies] +python = "*" +numpy = "*" +matplotlib = "*" +owslib = "*" +gdal = "*" +geopandas = "*" +rasterio = "*" +rasterstats = "*" +affine = "*" +ipykernel = "*" diff --git a/styles.css b/styles.css new file mode 100644 index 0000000..87353c9 --- /dev/null +++ b/styles.css @@ -0,0 +1,42 @@ +@import url("https://netdna.bootstrapcdn.com/bootswatch/3.0.0/simplex/bootstrap.min.css"); + +.main-container { max-width: none; } +pre { color: inherit; background-color: inherit; } + +code[class^="sourceCode"]::before { + content: attr(class); + display: block; + text-align: right; + font-size: 70%; +} + +code[class^="sourceCode r"]::before { content: "R Source"; } +code[class^="sourceCode python"]::before { content: "Python Source"; } +code[class^="sourceCode bash"]::before { content: "Bash Source"; } + +/* Only target inline code, not code inside pre blocks */ +p code:not(.sourceCode), +li code:not(.sourceCode), +td code:not(.sourceCode) { + background-color: #f5f5f5; + color: #c7254e; + padding: 2px 4px; + border-radius: 3px; +} + + +.page-header-title { + font-size: 2rem; /* roughly equivalent to */ +} + +.page-header-logo { + height: 50px; + vertical-align: middle; +} + +/* Quarto only centers the image

/

inside a centered figure, not + the
itself, so a resized image's caption is left-aligned + below it instead of centered under the image. */ +.quarto-figure-center figcaption { + text-align: center; +}