WIP: extracting Geometry utilities from datacube-core

Related tags

Geolocationodc-geo
Overview

odc.geo

This is still work in progress.

This repository contains geometry related code extracted from Open Datacube.

For details and motivation see ODC-EP-06 enhancement proposal.

Comments
  • Delay epsg determination as much as possible

    Delay epsg determination as much as possible

    Introduce special state _epsg=0, that implies "epsg code is not known yet", _epsg=None means "epsg code is known to be absent".

    Force all CRS construction code paths through cache.

    opened by Kirill888 17
  • Add CRS.utm and support crs=

    Add CRS.utm and support crs="utm" inputs in to_crs methods

    UTM convenience methods

    1. CRS.utm(some_geom) picks appropriate utm zone for a given geometry and returns corresponding CRS object
    2. When transforming geometry or geobox accept crs="utm|utm-n|utm-s" as a valid destination crs, meaning pick "appropriate" utm CRS for an object being transformed.
    3. ~"appropriate UTM zone" is currently defined by the lon,lat of the centroid of the geometry~
    4. UTM zones that overlap with some_geom are located using pyproj, then zone with biggest overlap is chosen

    Snap to

    Adds GeoBox.snap_to(other), this method adjust source geobox slightly by shifting footprint by a sub-pixel amount such that pixel edges align exactly with pixel edges of the other geobox. Method returns adjusted copy of self. Method only works when it is possible to align pixels by pure translation only - same projection, same resolution, same orientation. ValueError is raised when it's not possible.

    Closes #59

    Enclosing

    Related to snap_to somewhat. GeoBox construction method that creates a new "pixel grid compatible" geobox that minimally covers some area.

    Generalized Slicing into GeoBox

    Overload geobox[roi] to support geometry types on input, footprint in the world can be converted to pixel space, from which pixel slice is computed.

    Closes #31

    opened by Kirill888 12
  • Preparing for release

    Preparing for release

    • Adding library description to readme and docs

    • Adding badges to readme on github

    • Adding readthedocs integration

    • Bumping version and fixing description in the wheel

    • Fixing up add some more __repr__ methods

    • Reverting changes to multipolygon constructor function

    • rename odc.geo._overlap to just odc.geo.overlap

    • fix in compute_reproject_roi when dst is an integer shrink of source

    opened by Kirill888 10
  • XY refactor

    XY refactor

    There were a bunch of places where it was not clear whether some tuple contains X,Y or Y,X data. It's confusing on the interface and confusing when reading code. This PR adds an XY[T] type and a bunch of constructor methods that make it easy to understand what order x,y parameters are added.

    Instead of using plain tuples those new types are used instead. On the input shape= parameters are still allowed to be supplied as plain (int, int) tuples and are equivalent to iyx_(y, x). Internally those properties are kept in XY[int] form. Similarly a 2d index is also allowed to be supplied as (int, int), as this is what allows some_thing[ix, iy] or some_thing[row, col] syntax, order depends on use case, but should be clearly stated in the docs.

    Resolution input parameters are allowed to be a single float, but plain tuples are not allowed as this causes order confusion. Single value resolution is equivalent to resyx_(-value, value).

    Change GeoBox constructor to accept shape

    Geobox(width, height, ...) interface is problematic for several reasons:

    1. not compatible with ndarray, where shape is used instead
    2. no type-safety, easy to get order wrong
    3. two parameters to configure single property

    Replacing width, height with a single parameter shape. This could be a simple (int, int) tuple for easier interop with ndarray. But one can choose to use more typesafe XY[int].

    Example of the change at call site

       # before change:
       GeoBox(512, 256, A, "espg:4326")
    
       # becomes
       ## if array order is "native" at call-site
       GeoBox((256, 512), A, "epsg:4326")
       ## if width/height orded is preferred
       GeoBox(ixy_(512, 256), A, "epsg:4326")
    
    opened by Kirill888 10
  • Dask  colorize vmin vmax error

    Dask colorize vmin vmax error

    this failed

    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    /tmp/ipykernel_19782/44836221.py in <cell line: 1>()
    ----> 1 newcheckdask = odc.geo.xr.colorize(newcheck['test'], cmap=newcmp,vmin=1,vmax=240)
    
    ~/exploracornzarr/lib/python3.8/site-packages/odc/geo/_rgba.py in colorize(x, cmap, attrs, clip, vmin, vmax)
        240 
        241         assert x.chunks is not None
    --> 242         data = da.map_blocks(
        243             _impl,
        244             x.data,
    
    ~/exploracornzarr/lib/python3.8/site-packages/dask/array/core.py in map_blocks(func, name, token, dtype, chunks, drop_axis, new_axis, meta, *args, **kwargs)
        732         adjust_chunks = None
        733 
    --> 734     out = blockwise(
        735         func,
        736         out_ind,
    
    ~/exploracornzarr/lib/python3.8/site-packages/dask/array/blockwise.py in blockwise(func, out_ind, name, token, dtype, adjust_chunks, new_axes, align_arrays, concatenate, meta, *args, **kwargs)
        274         from .utils import compute_meta
        275 
    --> 276         meta = compute_meta(func, dtype, *args[::2], **kwargs)
        277     return new_da_object(graph, out, chunks, meta=meta, dtype=dtype)
        278 
    
    ~/exploracornzarr/lib/python3.8/site-packages/dask/array/utils.py in compute_meta(func, _dtype, *args, **kwargs)
        158                 return None
        159 
    --> 160         if _dtype and getattr(meta, "dtype", None) != _dtype:
        161             with contextlib.suppress(AttributeError):
        162                 meta = meta.astype(_dtype)
    
    ~/exploracornzarr/lib/python3.8/site-packages/dask/delayed.py in __bool__(self)
        588 
        589     def __bool__(self):
    --> 590         raise TypeError("Truth of Delayed objects is not supported")
        591 
        592     __nonzero__ = __bool__
    
    TypeError: Truth of Delayed objects is not supported
    

    this works - but as your docs suggest, gives strange results

    newcheckdask = odc.geo.xr.colorize(newcheck['test'], cmap=newcmp,vmin=1,vmax=240)
    

    Have I done something wrong, or is there a bug?

    opened by RichardScottOZ 9
  • Mostly various cleanups and more tests + GCPs helpers

    Mostly various cleanups and more tests + GCPs helpers

    • Closes #52
    • maybe addresses #51
    • Add GeoBox.compat to convert to datacube version of GeoBox
    • In reproject use nan as fill value for float32 outputs if output nodata is not configured
      • fixes boundary effects when plotting float32 input on a map
    • In colorize handle nodata values properly for non float inputs
      • fixes boundary effects when plotting non-float inputs on a map
    • In colorize drop nodata attribute on the output array
    • In geobox display support non-epsg authority codes like ESRI
    • Better Dask support for GeoBox, CRS and GeoBoxTiles classes (fixes hashing)
    • Add GCP extraction utilities
    • Add Geometry[Point] -> XY[float] conversion
    • Deprecated Geometry.__iter__ interface to follow shapely deprecation of that
    • Fixes .odc.add_to for maps with custom projections
    opened by Kirill888 6
  • Support generic affine in xarray rasters

    Support generic affine in xarray rasters

    Motivation

    Code in xx.odc.geobox assumes that xarray raster data is axis aligned. That is the off-diagonal terms of the affine matrix are zero and so entire row of pixels will have the same Y coordinate and similarly entire column same X coordinate:

    |y\x|0|1|2|3| |-|-|-|-|-| |0|0,0|1,0|2,0|3,0| |1|0,1|1,1|2,1|3,1|

    This limitation means one can not use .odc.geobox on rotated images. For a lot of satellite data one swatch of observation happens on an angle, when this gets rendered into axis aligned image you end up with a large proportion of the mosaic image being empty. Supporting arbitrary affine transform could make it much easier to work with large scale mosaics for such data sources.

    Possible Implementations

    2-d axis

    Xarray supports 2d coordinate, so one could simply compute X,Y coordinate for every pixel and store that in two 2d arrays, one for X and one for Y.

    pix = img[r,c]
    coord = (img.x[c], img.y[r])  # axis aligned representation
    ...
    coord = (img.x[r,c], img.y[r,c]) # 2d-axis representation
    

    .odc.geobox could then detect that 2d axis are used and reconstruct affine matrix from coordinates similar to current implementation but it will need to be computed from 3 points (Affine matrix has 6 degrees of freedom).

    • :-1: Significant memory overhead (2 float32 values per pixel, so 8 bytes per pixel)
    • :-1: This representation demands axis being Dask arrays as well.
    • :+1: Same representation can be used for completely non-linear pixel to world mapping as well
    • :+1: Direct support for plotting from xarray itself

    Pixel coords + Affine matrix in attributes

    In this scheme we keep 1-d X,Y axis, but they contain pixel coordinates and not real world coordinates, so x = [0.5, 1.5, 2.5... W-0.5], that sort of thing. We then also need to store actual affine matrix in some attributes attached to x,y axis.

    In this scenario .odc.geobox needs to detect the fact that X,Y axis contain pixel coordinates rather than real world coordinates and instead extract affine matrix from attributes/encoding. Slicing should still work as we will have access to the original image coordinates which is what we need to compute world coordinates from. Need to experiment with the location and representation for affine matrix data and how that works with things like .to_netcdf|to_zarr.

    • affine format: 6 float values (string vs array vs dict)

    • attachment point: x,y axis vs crs axis vs band

    • :+1: Same memory requirements as axis aligned representation

    • :-1: xarray plotting won't display more than one dataset on the same axis properly

    opened by Kirill888 6
  • BUG: Shape/Bounds different with odc-geo compared to datacube

    BUG: Shape/Bounds different with odc-geo compared to datacube

    Currently testing transitioning from datacube to odc-geo in geocube: https://github.com/corteva/geocube/pull/95

    Have some scenarios in the tests where the shape is off by one: odc-geo: (y: 100001, x: 11) datacube: (y: 100001, x: 12)

    And the boundary differs: odc-geo: [1665945., 7018509., 1665478., 7018306.] datacube: [1665478., 7018306., 1665945., 7018509.]

    Are these changes expected?

    opened by snowman2 6
  • Support GCPGeoBoxes with few points only

    Support GCPGeoBoxes with few points only

    GCP

    When fitting polynomial use lower rank if only few points available.

    Closes #67

    New features

    • BoundingBox.boundary() generate points along the perimiter
    • {BoundingBox|GeoBox}.qr2sample quasi-random 2d sampling using R2 sequence
    • Geometry.assign_crs use different CRS without changing geometry itself
    • Geometry.transform(..., crs=) can now optionally change CRS of the transformed geometry
    • odc.geo.geom.triangulate wrapper for for shapely method
    • MaybeCRS now includes special Unset case to differentiate from None
    • More robust Geometry.geojson (support composite and crs=None geometries)
    • rio_geobox helper method in converters
    opened by Kirill888 4
  • Prepare for next release

    Prepare for next release

    • Support matplotlib colormaps in colorize/add_to
    • Change to_grba to use vmin=, vmax= instead of non-standard clamp=
    • Re-order API docs
    • Add documentation section for xarray extension
    • Add documentation section for working with rasters
    • Extended sample data to include country geometries from geopandas
    opened by Kirill888 4
  • Track CRS info in BoundingBox and changes to GeoBox constructors

    Track CRS info in BoundingBox and changes to GeoBox constructors

    1. BoundingBox was an odd one out without CRS info attached, now it has that

      • This enables other conveniences, two way conversion polygon<->bbox
    2. Changes to GeoBox.from_bbox

      • Can get CRS info directly from bounding box now
      • Replace confusing "align" that is pretty hard to explain with "anchor"

    Essentially if you take 0,0 in the real world, bring it to pixel space and locate pixel that contains it, then you want location within that pixel to be a certain point in [0, 1), [0, 1), so 0,0 is edge aligned, same as align=(0,0) used to be, and to get center aligned pixel you pick (0.5, 0.5). Also you can just not align at all, in which case resulted geobox will start at left,top and might go a little bit over right, bottom.

    Also adds some more convenience methods to bounding box and geobox.

    Closes #25

    opened by Kirill888 4
  • `GeoBox.zoom_to` with a resolution

    `GeoBox.zoom_to` with a resolution

    I've been trying to use odc-geo to define the target grid for regridding with xesmf. This works great so far, but one of the features I've been missing so far is creating a Dataset from the GeoBox.

    The naive version I've been using so far

    def to_dataset(geobox):
        def to_variable(dim, coord):
            data = coord.values
            units = coord.units
            resolution = coord.resolution
            if resolution < 0:
                data = data[::-1]
                resolution *= -1
            return xr.Variable(
                dims=dim, data=data, attrs={"units": units, "resolution": resolution}
            )
    
        coords = {
            name: to_variable(name, odc_coord)
            for name, odc_coord in geobox.coordinates.items()
        }
        return xr.Dataset(coords=coords)
    

    which obviously lacks support for affine transformations, assumes 1D coordinates, and the resolution trick should probably configurable (and off by default?)

    Did I miss anything? Do you know of a better way to do this? If not, would you be open to adding something like this to odc.geo.xr?

    opened by keewis 8
  • Setup testing for Python 3.10

    Setup testing for Python 3.10

    Currently odc-geo is tested in one single configuration: python 3.8 with optional dependencies installed to maximize test coverage. We should be testing things with minimal dependencies and with other versions of Python.

    opened by Kirill888 0
  • Use `GeoTransform` to get resolution for GeoBox?

    Use `GeoTransform` to get resolution for GeoBox?

    Related to: opendatacube/datacube-core#752

    Currently the resolution inside of the coordinate attributes are used:

    https://github.com/opendatacube/datacube-core/blob/05093b75a8f15b643c7047502ae27b662af2d9b4/datacube/utils/xarray_geoextensions.py#L133-L139

    GeoTransform is a property used by GDAL to store this information (https://gdal.org/drivers/raster/netcdf.html#georeference)

    Here is an example of reading in this property: https://github.com/corteva/rioxarray/blob/f658d5f829a88204b2ec7b239735aba31694ed0a/rioxarray/rioxarray.py#L540-L545

    Thoughts about supporting this as well?

    opened by snowman2 4
  • Expand visualization capabilities

    Expand visualization capabilities

    • [DONE] ~Output folium or ipyleaflet maps when libraries are available when displaying geometries/geoboxes/bounding boxes.~
    • Provide GeoJSON outputs for more types
    • Conversion to geopandas when available
    opened by Kirill888 1
  • Port xr_reproject from odc.algo

    Port xr_reproject from odc.algo

    Most of the low-level utilities needed for Dask-backed reprojection are already in odc-geo. This is mostly

    https://github.com/opendatacube/odc-geo/blob/11c59371d306e010e8cbc4b4b835a80005e3ec4e/odc/geo/geobox.py#L909

    and also: https://github.com/opendatacube/odc-geo/blob/11c59371d306e010e8cbc4b4b835a80005e3ec4e/odc/geo/overlap.py#L130

    Expected interface:

    xx = dc.load(.., dask_chunks= {}) # or any other supported load backend
    
    # automatically choose resolution and bounding box, align pixel edges to 0
    # automatically choose chunk size
    yy = xx.odc.to_crs("epsg:3857")
    
    # fully defined destination pixel plane
    # configurable destination chunking
    yy = xx.odc.reproject(GeoBox.from_bbox(..), chunks={'x': 2048, 'y': 4096})
    
    • Support Dask and non-Dask inputs
    • Support xarray and dask.dataarray
    • Support xarray Datasets as well as DataArray
    • Support reasonable automatic resolution, bbox and chunking determination
    • Support any number of leading dimensions as well as optional interleaved band dimension: ..., y, x[,band]
    opened by Kirill888 2
  • Verify thread-safety of CRS caching approach

    Verify thread-safety of CRS caching approach

    We are caching pyproj.CRS objects here:

    https://github.com/opendatacube/odc-geo/blob/202cd8aeb3b03a54d9e484c3514c19a8b57b1a7b/odc/geo/_crs.py#L31-L32

    And pyproj transformers here:

    https://github.com/opendatacube/odc-geo/blob/202cd8aeb3b03a54d9e484c3514c19a8b57b1a7b/odc/geo/_crs.py#L47-L48

    • What that means for multi-threaded access?
    • Should we use lock when populating cache?
    • Should we use thread local cache instead of locking?
    • What are the constraints of multi-threaded access in pyproj/PROJ itself
      • currently we are assuming that sharing CRS objects across threads is fine?
    • We should also add purging rules to those caches, or at least expose manual purge option.
    • We should understand cost of caching in terms of RAM, especially for transformers cache.
    opened by Kirill888 2
Releases(v0.3.3)
  • v0.3.3(Dec 27, 2022)

    What's Changed

    • Shapely 2.0 fixes by @Kirill888 in https://github.com/opendatacube/odc-geo/pull/81
    • Bump actions versions by @Kirill888 in https://github.com/opendatacube/odc-geo/pull/77
    • Add AnchorEnum to the docs by @Kirill888 in https://github.com/opendatacube/odc-geo/pull/78

    Full Changelog: https://github.com/opendatacube/odc-geo/compare/v0.3.2...v0.3.3

    Source code(tar.gz)
    Source code(zip)
  • v0.3.2(Oct 26, 2022)

    What's Changed

    Fixes import issues on Python 3.10 introduced in previous release

    • BUG: Use typing.Hashable instead of collections.Hashable by @snowman2 in https://github.com/opendatacube/odc-geo/pull/74

    Full Changelog: https://github.com/opendatacube/odc-geo/compare/v0.3.1...v0.3.2

    Source code(tar.gz)
    Source code(zip)
  • v0.3.1(Oct 24, 2022)

    What's Changed

    • Set pyproj lower bound to version 3
    • Fixes to workflows, css tweaks, https://github.com/opendatacube/odc-geo/pull/71
    • Delay epsg determination as much as possible by @snowman2 and @Kirill888 in https://github.com/opendatacube/odc-geo/pull/72
      • Better caching of rasterio.crs.CRS -> odc.geo.crs.CRS construction path
      • Avoid computing .epsg unless requested by the user. This is an expensive operation for CRSs that do now have EPSG code, https://github.com/opendatacube/datacube-core/issues/1321

    Full Changelog: https://github.com/opendatacube/odc-geo/compare/v0.3.0...v0.3.1

    Source code(tar.gz)
    Source code(zip)
  • v0.3.0(Sep 9, 2022)

    What's Changed

    • Support integer inputs for CRS constructor in https://github.com/opendatacube/odc-geo/pull/64
    • Add CRS.utm and support crs="utm" inputs in to_crs methods in https://github.com/opendatacube/odc-geo/pull/65
    • Implement reproject for dataset objects in https://github.com/opendatacube/odc-geo/pull/69
    • Geometry can be constructed from arbitrary GeoJSON, including type=FeatureCollection

    GeoBox

    • Add GCPGeoBox in https://github.com/opendatacube/odc-geo/pull/62 https://github.com/opendatacube/odc-geo/pull/68
    • Generalize slicing into GeoBox, can slice with any geometry, geobox or boundingbox
    • New methods for constructing GeoBox that match the grid of other geobox
      • GeoBox.snap_to, GeoBox.enclosing
    • Method for generating quasi-random pixel location samples
    • Method for projecting geometries between pixel and world coordinates, .project
    • rio_geobox converter method to read in geobox from rasterio file handle

    Various Small Improvements

    • Understand _FillValue attribute populated by rioxarray
    • More helper methods on the BoundingBox class
      • .boundary
      • .aoi
      • .qr2sample(..)
    • Geometry.assign_crs(..) and optional crs= in Geometry.transform(op, crs=..)
    • More robust .geojson(..) generation from geometries
    • Fixes in .dropna() to handle holes in polygons

    Full Changelog: https://github.com/opendatacube/odc-geo/compare/v0.2.2...v0.3.0

    Source code(tar.gz)
    Source code(zip)
  • v0.2.2(Sep 2, 2022)

    What's Changed

    • Hide GDAL warnings in compress function in https://github.com/opendatacube/odc-geo/pull/57
    • Account for src_nodata kwarg in xr_reproject by @valpesendorfer in https://github.com/opendatacube/odc-geo/pull/60
    • Handle GeoBoxes and Geometries that do not project cleanly in https://github.com/opendatacube/odc-geo/pull/61
      • Deal with nan and inf values in a more robust way than before
      • Add Geometry.filter and Geometry.dropna operations
    • Removed __array_interface__ from Geometry class
      • it's deprecated in shapely and is not used, and newer numpy warns about it
      • one can use a more explicit numpy.asarray(g.coords) instead anyway
      • with this removed it's easier to make ndarrays containing Geometry objects

    New Contributors

    • @valpesendorfer made their first contribution in https://github.com/opendatacube/odc-geo/pull/60

    Full Changelog: https://github.com/opendatacube/odc-geo/compare/v0.2.1...v0.2.2

    Source code(tar.gz)
    Source code(zip)
  • v0.2.1(Jul 6, 2022)

    What's Changed

    Fixes

    • Fixes in colorize|add_to when plotting data with missing pixels
    • Fixes .odc.add_to for maps with custom projections #50
    • Better CRS info display for non-EPSG GeoBoxes
    • Better Dask support for GeoBox, CRS and GeoBoxTiles classes (fixes hashing)

    New Features

    • Add GeoBox.compat to convert to datacube version of GeoBox
    • New features robust=True in colorize|add_to, user percentiles for clipping: vmin=2%, vmax=98% #52
    • Add GCP extraction utilities
    • Add Geometry[Point] -> XY[float] conversion

    Deprecations

    Deprecated iteration over Geometry class to follow shapely deprecation of that, use .geoms property instead.

    See this PR: https://github.com/opendatacube/odc-geo/pull/54

    Full Changelog: https://github.com/opendatacube/odc-geo/compare/v0.2.0...v0.2.1

    Source code(tar.gz)
    Source code(zip)
  • v0.2.0(Jun 2, 2022)

    What's Changed

    Fixes

    • Geobox resolution display for rotated geoboxes in https://github.com/opendatacube/odc-geo/pull/47
    • Some typos in docs (by @RichardScottOZ)

    New features

    • Adding display on a map https://github.com/opendatacube/odc-geo/pull/48
      • .add_to(map)
      • .map_bounds to interface with folium/ipyleaflet
    • Add more raster operations:
      • .to_rgba
      • .colorize
      • .compress (jpeg,png,webp for map displays)
    • Add GeoBox.to_crs method (convenient access to output_geobox method)
    • More docs

    Full Changelog: https://github.com/opendatacube/odc-geo/compare/v0.1.3...v0.2.0

    Source code(tar.gz)
    Source code(zip)
  • v0.1.3(May 12, 2022)

    What's Changed

    • Support arbitrary geoboxes in xarray (PR #44)
      • It is now possible to create xarray.DataArray with GeoBoxes that are not aligned to X/Y axis (i.e. have rotation/shear components)
    • Add chunks= and time= optional arguments to xr_zeros(..)
    • Add GeoBox model docs (PR #45)
    Source code(tar.gz)
    Source code(zip)
  • v0.1.2.post0(May 10, 2022)

  • v0.1.2(Apr 27, 2022)

    What's Changed

    • BoundingBox is now CRS aware
    • Changes to GeoBox.from_ interfaces, anchor= replaces align=
      • .from_polygon still accepts old-style align= for ease of datacube migration
    • Adding .odc.write_cog, .odc.to_cog methods
    • Adding .odc.reproject (only supports non-Dask inputs currently)
    • Adding .odc.output_geobox - finds reasonable destination geobox when projecting to other CRS
    • Packaging fixes (mypy types, thanks to @snowman2)
    • Fixes in GeoBox display code (was not handling empty cases well)
    • Some code refactoring
    Source code(tar.gz)
    Source code(zip)
  • v0.1.1(Mar 29, 2022)

  • v0.1.1rc0(Mar 25, 2022)

Owner
Open Data Cube
Open Data Cube
A trivia questions about Europe

EUROPE TRIVIA QUIZ IN PYTHON Project Outline Ask user if he / she knows more about Europe. If yes show the Trivia main screen, else show the end Trivi

David Danso 1 Nov 17, 2021
h3-js provides a JavaScript version of H3, a hexagon-based geospatial indexing system.

h3-js The h3-js library provides a pure-JavaScript version of the H3 Core Library, a hexagon-based geographic grid system. It can be used either in No

Uber Open Source 648 Jan 07, 2023
WIP: extracting Geometry utilities from datacube-core

odc.geo This is still work in progress. This repository contains geometry related code extracted from Open Datacube. For details and motivation see OD

Open Data Cube 34 Jan 09, 2023
Pandas Network Analysis: fast accessibility metrics and shortest paths, using contraction hierarchies :world_map:

Pandana Pandana is a Python library for network analysis that uses contraction hierarchies to calculate super-fast travel accessibility metrics and sh

Urban Data Science Toolkit 321 Jan 05, 2023
Summary statistics of geospatial raster datasets based on vector geometries.

rasterstats rasterstats is a Python module for summarizing geospatial raster datasets based on vector geometries. It includes functions for zonal stat

Matthew Perry 437 Dec 23, 2022
Open GeoJSON data on geojson.io

geojsonio.py Open GeoJSON data on geojson.io from Python. geojsonio.py also contains a command line utility that is a Python port of geojsonio-cli. Us

Jacob Wasserman 114 Dec 21, 2022
List of Land Cover datasets in the GEE Catalog

List of Land Cover datasets in the GEE Catalog A list of all the Land Cover (or discrete) datasets in Google Earth Engine. Values, Colors and Descript

David Montero Loaiza 5 Aug 24, 2022
Python module and script to interact with the Tractive GPS tracker.

pyTractive GPS Python module and script to interact with the Tractive GPS tracker. Requirements Python 3 geopy folium pandas pillow usage: main.py [-h

Dr. Usman Kayani 3 Nov 16, 2022
a Geolocator made in python

Geolocator A Geolocator made in python ✨ Features locates ur location using ur ip thats it! 💁‍♀️ How to use first download the locator.py file instal

Portgas D Ace 1 Oct 27, 2021
Code and coordinates for Matt's 2021 xmas tree

xmastree2021 Code and coordinates for Matt's 2021 xmas tree This repository contains the code and coordinates used for Matt's 2021 Christmas tree, as

Stand-up Maths 117 Jan 01, 2023
prettymaps - A minimal Python library to draw customized maps from OpenStreetMap data.

A small set of Python functions to draw pretty maps from OpenStreetMap data. Based on osmnx, matplotlib and shapely libraries.

Marcelo de Oliveira Rosa Prates 9k Jan 08, 2023
gpdvega is a bridge between GeoPandas and Altair that allows to seamlessly chart geospatial data

gpdvega gpdvega is a bridge between GeoPandas a geospatial extension of Pandas and the declarative statistical visualization library Altair, which all

Ilia Timofeev 49 Jul 25, 2022
A set of utility functions for working with GeoJSON annotations in Kaibu

kaibu-utils A set of utility functions for working with Kaibu. Create a new repository Create a new repository and select imjoy-team/imjoy-python-temp

ImJoy Team 0 Dec 12, 2021
Streamlit Component for rendering Folium maps

streamlit-folium This Streamlit Component is a work-in-progress to determine what functionality is desirable for a Folium and Streamlit integration. C

Randy Zwitch 224 Dec 30, 2022
Construct and use map tile grids in different projection.

Morecantile +-------------+-------------+ ymax | | | | x: 0 | x: 1 | | y: 0 | y: 0

Development Seed 67 Dec 23, 2022
Python bindings to libpostal for fast international address parsing/normalization

pypostal These are the official Python bindings to https://github.com/openvenues/libpostal, a fast statistical parser/normalizer for street addresses

openvenues 651 Dec 16, 2022
GeoNode is an open source platform that facilitates the creation, sharing, and collaborative use of geospatial data.

Table of Contents What is GeoNode? Try out GeoNode Install Learn GeoNode Development Contributing Roadmap Showcase Most useful links Licensing What is

GeoNode Development Team 1.2k Dec 26, 2022
FDTD simulator that generates s-parameters from OFF geometry files using a GPU

Emport Overview This repo provides a FDTD (Finite Differences Time Domain) simulator called emport for solving RF circuits. Emport outputs its simulat

4 Dec 15, 2022
Yet Another Time Series Model

Yet Another Timeseries Model (YATSM) master v0.6.x-maintenance Build Coverage Docs DOI | About Yet Another Timeseries Model (YATSM) is a Python packag

Chris Holden 60 Sep 13, 2022
Constraint-based geometry sketcher for blender

Geometry Sketcher Constraint-based sketcher addon for Blender that allows to create precise 2d shapes by defining a set of geometric constraints like

1.7k Jan 02, 2023