πŸ—‚οΈ πŸ” Geospatial Data Management and Search API - Django Apps

Overview

logo

codecov ci PyPI

Geospatial Data API in Django

Resonant GeoData (RGD) is a series of Django applications well suited for cataloging and searching annotated geospatial imagery, shapefiles, and full motion video datasets.

A publicly deployed instance of this application is available at https://www.resonantgeodata.com - find the deployment code for this at ResonantGeoData/RD-OpenGeo

Search Interface Raster Viewer with ROI Extraction Tool
homepage roi-extraction

Highlights

  • Faceted searching of spatiotemporal data
  • Supports normal imagery and overhead raster imagery
  • Supports image annotations: polygons, bounding boxes, keypoints, and run-length-encoded masks
  • Built-in image tile server
  • 3D viewer for point clouds and mesh files
  • Extract Regions of Interest from imagery

Documentation

Each app's README file contains an overview of functionality.

Documentation is currently a work in progress.

For general questions about the project, its applications, or about software usage, please create an issue directly in this repository. You are also welcome to send us an email at [email protected] with the subject line including Resonant GeoData.

Connections

  • Resonant GeoData is built on top of Kitware's Girder 4 platform.
  • GeoJS: we leverage GeoJS for our interactive map view.
  • large_image: we leverage large_image to serve image tiles and extract thumbnails.
  • VTK.js: we use VTK.js for the client-side 3D viewer for 3D data.
  • KWIVER: we leverage KWIVER's Full Motion Video (FMV) processing capabilities to extract spatial information from FMV files.
  • KWCOCO: KWCOCO is an extension of the COCO image annotation format which we support for ingesting annotated imagery.

Contributing

Please see the adjacent DEVELOPMENT.md file for all development instructions.

Comments
  • Dev/xdoctest

    Dev/xdoctest

    Builds on #493

    Adds declaration of xdoctest as a test dependency and adds the flags to tox. I also added a second simple doctest to spatial_search_params.

    opened by Erotemic 12
  • Redesign geodata models to support non-spatial data

    Redesign geodata models to support non-spatial data

    Per team discussion, we need to support non-spatial imagery as well.

    I will brainstorm a new model hierarchy and post it here, then sync up with David about the implementation. I already have a few ideas about how we can make this work in a general fashion while keeping the SpatialEntry concept that informed our initial model design.

    opened by banesullivan 12
  • STAC Browser

    STAC Browser

    This imports version 2.0.0 of the STAC Browser. The build process was difficult to automate (a couple patches), so I made the decision to build and commit the result into the tree. STAC Browser 3.0.0 is the next release, so we can automate the build process there.

    The existing STAC-API was fleshed out a bit more to handle the browser.

    The STAC Browser is visible at /rgd_imagery/stac_browser/.

    Here is an example browsing the user's "default" collection:

    Capture

    opened by mcovalt 10
  • Allow lazy random access to files in Storage on S3

    Allow lazy random access to files in Storage on S3

    When a Django FieldFile (the object referenced by a FileField) is opened, both in development with MinIO and in production with AWS S3, the Storage layers download a whole file write it to a SpooledTemporaryFile (which is in-memory for small content and on-disk for larger content)

    • S3Boto3Storage: https://github.com/jschneier/django-storages/blob/770332b598712da27ecdba75c9e202ad6a1a8722/storages/backends/s3boto3.py#L132
    • MinioStorage: https://github.com/py-pa/django-minio-storage/blob/8ce77cd8eae0d86fa3200e74cde64144c0338f37/minio_storage/files.py#L130

    However, many operations need random access to only a small part of the file's content.

    If all that's necessary is a Python file-like object (which is the same interface that a Django FieldFile naturally provides), we could look into developing a new Storage wrapper which lazily loads the content of the file-like object, internally using HTTP Range requests to only download the required parts just-in-time to be read from. This would likely also include some caching of the parts once they are retrieved.

    If external tools (like GDAL) need access via a filesystem path (i.e. what's provided by field_file_to_local_path), then FUSE may be the most appropriate abstraction. However, FUSE could not be run on Heroku and might generally be more difficult to install for new developers.

    In either case (Python file-like object or FUSE), the underlying logic for how to fetch and cache portions of file content may be the same.

    opened by brianhelba 10
  • psycopg2.errors.UniqueViolation: duplicate key value error

    psycopg2.errors.UniqueViolation: duplicate key value error

    When running the demo data commands that I have, if the celery worker is set up to run in the background, an integretiy error for duplicate keys happens on the image_entry.save() call here:

    https://github.com/ResonantGeoData/ResonantGeoData/blob/998a6c3995b4421c3632979a249fb78d66e1108f/rgd/geodata/models/imagery/etl.py#L69

    The error:

    Traceback (most recent call last):
      File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
        return self.cursor.execute(sql, params)
    psycopg2.errors.UniqueViolation: duplicate key value violates unique constraint "geodata_imageentry_image_file_id_key"
    DETAIL:  Key (image_file_id)=(14) already exists.
    

    This is making me think that when we create a new ImageEntry in the tasks, there is some sort of race condition between jobs for the same ImageFile... which shouldn't happen? I'm not really sure what is going on here.

    Steps to reproduce

    1. Clear the database volume
    2. Apply migrations: docker-compose run --rm django ./manage.py migrate
    3. In one session, launch the celery worker: docker-compose up celery and wait until ready
    4. In another session, run the Landsat demo data command: docker-compose run --rm django ./manage.py landsat_data -c 3
      • Use the changes from #296
    5. Observe the error

    Error Message

    Traceback (most recent call last):
      File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
        return self.cursor.execute(sql, params)
    psycopg2.errors.UniqueViolation: duplicate key value violates unique constraint "geodata_imageentry_image_file_id_key"
    DETAIL:  Key (image_file_id)=(14) already exists.
    
    
    The above exception was the direct cause of the following exception:
    
    Traceback (most recent call last):
      File "./manage.py", line 28, in <module>
        main()
      File "./manage.py", line 24, in main
        execute_from_command_line(sys.argv)
      File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_line
        utility.execute()
      File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 413, in execute
        self.fetch_command(subcommand).run_from_argv(self.argv)
      File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 354, in run_from_argv
        self.execute(*args, **cmd_options)
      File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 398, in execute
        output = self.handle(*args, **options)
      File "/opt/django-project/rgd/geodata/management/commands/landsat_data.py", line 49, in handle
        helper.load_raster_files(_get_landsat_urls(count))
      File "/opt/django-project/rgd/geodata/management/commands/_data_helper.py", line 80, in load_raster_files
        imentries = load_image_files(
      File "/opt/django-project/rgd/geodata/management/commands/_data_helper.py", line 56, in load_image_files
        result = load_image_files(imfile)
      File "/opt/django-project/rgd/geodata/management/commands/_data_helper.py", line 60, in load_image_files
        read_image_file(entry)
      File "/opt/django-project/rgd/geodata/models/imagery/etl.py", line 129, in read_image_file
        _read_image_to_entry(image_entry, file_path)
      File "/opt/django-project/rgd/geodata/models/imagery/etl.py", line 69, in _read_image_to_entry
        image_entry.save()
      File "/opt/django-project/rgd/geodata/models/common.py", line 51, in save
        super(ModifiableEntry, self).save(*args, **kwargs)
      File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 726, in save
        self.save_base(using=using, force_insert=force_insert,
      File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 763, in save_base
        updated = self._save_table(
      File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 868, in _save_table
        results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
      File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 906, in _do_insert
        return manager._insert(
      File "/usr/local/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
        return getattr(self.get_queryset(), name)(*args, **kwargs)
      File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 1268, in _insert
        return query.get_compiler(using=using).execute_sql(returning_fields)
      File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1410, in execute_sql
        cursor.execute(sql, params)
      File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 98, in execute
        return super().execute(sql, params)
      File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 66, in execute
        return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
      File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 75, in _execute_with_wrappers
        return executor(sql, params, many, context)
      File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
        return self.cursor.execute(sql, params)
      File "/usr/local/lib/python3.8/site-packages/django/db/utils.py", line 90, in __exit__
        raise dj_exc_value.with_traceback(traceback) from exc_value
      File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
        return self.cursor.execute(sql, params)
    django.db.utils.IntegrityError: duplicate key value violates unique constraint "geodata_imageentry_image_file_id_key"
    DETAIL:  Key (image_file_id)=(14) already exists.
    
    bug 
    opened by banesullivan 9
  • Large image

    Large image

    Closes #260

    This is a simple tile server endpoint. It's not an app as was imagined. There's a πŸ’―abstractβ„’ app in 701293890f75b646d042da877289646ebac88a7f. It started feeling silly for just one endpoint, so it was reverted. It may be useful down the road.

    I didn't want to deal with the context manager to download/cleanup S3 files, so instead I'm using /vsis3/ and /vsicurl/. You can see the implementation in 8b4d2fc6f162447c128b1a4fdb17e8353853dd09. I think it's simpler and luckily results in a pretty quick tile server. It was tested with other ETL routines in ed9bd8ae57e3d9c9ff9f891847a051073280b2ce, which seemed to work fine, but that was reverted to stay on topic with this PR.

    New endpoints:

    • api/geodata/imagery/image_entry/<pk>/tiles: get an ImageEntry's metadata
    • api/geodata/imagery/image_entry/<pk>/tiles/<z>/<x>/<y>.jpg: get an ImageEntry's x, y tile at zoom-level z
    opened by mcovalt 9
  • Rgdc usability improvements

    Rgdc usability improvements

    This MR contains 3 small improvements to rgdc.Rgdc.

    1. Add 5 automatic retries on all GET requests. This is to guard against random 503 errors from rate-limiting that would be fixed by simply rerunning the command. The implementation is to bake this into the Session object; see https://www.peterbe.com/plog/best-practice-with-retries-with-requests for the approach.
    2. Add overwrite=False kwarg to download_raster_entry. This will skip files already on disk - handy for speeding up tests and making scripts idempotent.
    3. Perhaps a more controversial one: let download_raster_entry and download_raster_entry_thumbnail directly parse a dict returned by search to find the id, rather than the user having to make another request manually as in the README example or study that dict to find it. I believe this will improve usability for the current use cases, as the users of this client should need to know as little as possible about the internals of RGD's data representation (and web programming in general, for that matter) to get started. But I am open to ideas to implement this in a more principled and future-proof way.
    opened by matt-bernstein 8
  • fix thumbnails and outline geometry

    fix thumbnails and outline geometry

    Resolve #176

    For future reference, use the following example rasters to verify that the thumbnails are working.

    • LC08_L1TP_033032_20200422_20200508_01_T1_pixel_qa.tif
    • landcover_sample_2000.tif
    • vegdri_emodis_week34_082320.tif

    Summary of change:

    • new admin actions to reprocess image entries and raster entries (calls save to trigger save event and recreate the thumbnail or spatial reference)
    • added a helper method to reproject an open rasterio raster to a given ESPG
    • During image thumbnail generation routine: reproject raster to Web Mercator before extracting if the image file has a spatial reference
    • During raster outline/valid footprint calculation:
      • first, reproject the raster to the DB's spatial reference (something was off when transforming the extracted geometry)
      • use rasterio/GDAL to extract a mask and create the GeoJSON feature (as opposed to our own convex hull approach)
    • Raster detail view page now limits the view bounds on the map
    • Update centroids in the raster tests since we are extracting the geometry properly now
    opened by banesullivan 8
  • `yield_checksumfiles` function doesn't handle `ChecksumFiles` with file paths as their `name` correctly

    `yield_checksumfiles` function doesn't handle `ChecksumFiles` with file paths as their `name` correctly

    To reproduce, run this management script and then try to view the Raster that it creates. The tile requests will fail with 500 errors with errors about wrong file paths in the server log.

    I came across this bug when working on Danesfield. On that project we encode the file path of a given ChecksumFile inside the name column - for example, foo/bar/foobar.txt represents a file hierarchy of

    foo/
      bar/
        foobar.txt
    

    This line in RGD is incompatible with this approach, since it assumes the ChecksumFile name is a flat file name instead of a file path. For example, if we have a ChecksumFile with the name foo.tiff, the current code would work:

    path = '/tmp/rgd/file_cache/foo.tiff'
    with yield_checksumfiles([self], path.parent):
        yield path
    

    Note that path.parent would be /tmp/rgd/file_cache/foo.tiff, which is correct. But if the file name is a/b/c/foo.tiff:

    path = '/tmp/rgd/file_cache/a/b/c/foo.tiff'
    with yield_checksumfiles([self], path.parent):
        yield path
    

    the call to path.parent would evaluate to /tmp/rgd/file_cache/a/b/c, which is incorrect and leads to 500 errors since the server can't find the files in that location.

    bug 
    opened by mvandenburgh 7
  • Add more base maps

    Add more base maps

    Add the base maps from here: https://carto.com/help/building-maps/basemap-list/#carto-vector-basemaps

    and this one for google imagery: https://mt1.google.com/vt/lyrs=s&x={x}&y={y}&z={z}

    feature-request 
    opened by banesullivan 7
  • large_image tiling issue with specific dataset

    large_image tiling issue with specific dataset

    Recently, large_image started failing to serve tiles for this dataset: https://data.kitware.com/#item/5f9c316650a41e3d1920ef90

    We were originally using this raster for some testing of the large_image tile serving endpoint, so I know it worked at one point.

    Recently, I started seeing this numpy error when trying to serve tiles for this file:

    ...
                                      File "/usr/local/lib/python3.8/site-packages/nu
    django_1    |                     mpy/core/getlimits.py", line 523, in __init__
    django_1    |                         raise ValueError("Invalid integer data type
    django_1    |                     %r." % (self.kind,))
    django_1    |                     ValueError: Invalid integer data type 'f'.
    
    django_1    | [16:42:08] ERROR    Internal Server Error: /api/geodata/imagery/image log.py:224
    django_1    |                     _entry/159/tiles/12/830/1565.png
    django_1    |                     Traceback (most recent call last):
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/dj
    django_1    |                     ango/core/handlers/exception.py", line 47, in
    django_1    |                     inner
    django_1    |                         response = get_response(request)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/dj
    django_1    |                     ango/core/handlers/base.py", line 181, in
    django_1    |                     _get_response
    django_1    |                         response = wrapped_callback(request,
    django_1    |                     *callback_args, **callback_kwargs)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/dj
    django_1    |                     ango/views/decorators/csrf.py", line 54, in
    django_1    |                     wrapped_view
    django_1    |                         return view_func(*args, **kwargs)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/dj
    django_1    |                     ango/views/generic/base.py", line 70, in view
    django_1    |                         return self.dispatch(request, *args,
    django_1    |                     **kwargs)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/re
    django_1    |                     st_framework/views.py", line 509, in dispatch
    django_1    |                         response = self.handle_exception(exc)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/re
    django_1    |                     st_framework/views.py", line 469, in
    django_1    |                     handle_exception
    django_1    |                         self.raise_uncaught_exception(exc)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/re
    django_1    |                     st_framework/views.py", line 480, in
    django_1    |                     raise_uncaught_exception
    django_1    |                         raise exc
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/re
    django_1    |                     st_framework/views.py", line 506, in dispatch
    django_1    |                         response = handler(request, *args, **kwargs)
    django_1    |                       File
    django_1    |                     "/opt/django-project/rgd/geodata/api/tiles.py",
    django_1    |                     line 36, in get
    django_1    |                         tile_binary = tile_source.getTile(x, y, z)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/la
    django_1    |                     rge_image/cache_util/cache.py", line 102, in
    django_1    |                     wrapper
    django_1    |                         v = func(self, *args, **kwargs)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/la
    django_1    |                     rge_image_source_gdal/__init__.py", line 692, in
    django_1    |                     getTile
    django_1    |                         return self._outputTile(tile,
    django_1    |                     TILE_FORMAT_NUMPY, x, y, z,
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/la
    django_1    |                     rge_image/tilesource/base.py", line 1486, in
    django_1    |                     _outputTile
    django_1    |                         tile, mode = self._outputTileNumpyStyle(tile,
    django_1    |                     applyStyle, x, y, z, kwargs.get('frame'))
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/la
    django_1    |                     rge_image/tilesource/base.py", line 1444, in
    django_1    |                     _outputTileNumpyStyle
    django_1    |                         tile = self._applyStyle(tile, self.style, x,
    django_1    |                     y, z, frame)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/la
    django_1    |                     rge_image/tilesource/base.py", line 1406, in
    django_1    |                     _applyStyle
    django_1    |                         min = self._getMinMax('min', entry.get('min',
    django_1    |                     'auto'), image.dtype, bandidx, frame)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/la
    django_1    |                     rge_image/tilesource/base.py", line 1318, in
    django_1    |                     _getMinMax
    django_1    |                         self._scanForMinMax(dtype, frame)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/la
    django_1    |                     rge_image_source_gdal/__init__.py", line 264, in
    django_1    |                     _scanForMinMax
    django_1    |                         self._bandRanges[frame]['max'], numpy.iinfo(s
    django_1    |                     elf._bandRanges[frame]['max'].dtype).max)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/nu
    django_1    |                     mpy/core/getlimits.py", line 523, in __init__
    django_1    |                         raise ValueError("Invalid integer data type
    django_1    |                     %r." % (self.kind,))
    django_1    |                     ValueError: Invalid integer data type 'f'.
    django_1    |            ERROR    Internal Server Error: /api/geodata/imagery/image log.py:224
    django_1    |                     _entry/159/tiles/12/831/1566.png
    django_1    |                     Traceback (most recent call last):
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/dj
    django_1    |                     ango/core/handlers/exception.py", line 47, in
    django_1    |                     inner
    django_1    |                         response = get_response(request)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/dj
    django_1    |                     ango/core/handlers/base.py", line 181, in
    django_1    |                     _get_response
    django_1    |                         response = wrapped_callback(request,
    django_1    |                     *callback_args, **callback_kwargs)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/dj
    django_1    |                     ango/views/decorators/csrf.py", line 54, in
    django_1    |                     wrapped_view
    django_1    |                         return view_func(*args, **kwargs)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/dj
    django_1    |                     ango/views/generic/base.py", line 70, in view
    django_1    |                         return self.dispatch(request, *args,
    django_1    |                     **kwargs)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/re
    django_1    |                     st_framework/views.py", line 509, in dispatch
    django_1    |                         response = self.handle_exception(exc)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/re
    django_1    |                     st_framework/views.py", line 469, in
    django_1    |                     handle_exception
    django_1    |                         self.raise_uncaught_exception(exc)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/re
    django_1    |                     st_framework/views.py", line 480, in
    django_1    |                     raise_uncaught_exception
    django_1    |                         raise exc
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/re
    django_1    |                     st_framework/views.py", line 506, in dispatch
    django_1    |                         response = handler(request, *args, **kwargs)
    django_1    |                       File
    django_1    |                     "/opt/django-project/rgd/geodata/api/tiles.py",
    django_1    |                     line 36, in get
    django_1    |                         tile_binary = tile_source.getTile(x, y, z)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/la
    django_1    |                     rge_image/cache_util/cache.py", line 102, in
    django_1    |                     wrapper
    django_1    |                         v = func(self, *args, **kwargs)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/la
    django_1    |                     rge_image_source_gdal/__init__.py", line 692, in
    django_1    |                     getTile
    django_1    |                         return self._outputTile(tile,
    django_1    |                     TILE_FORMAT_NUMPY, x, y, z,
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/la
    django_1    |                     rge_image/tilesource/base.py", line 1486, in
    django_1    |                     _outputTile
    django_1    |                         tile, mode = self._outputTileNumpyStyle(tile,
    django_1    |                     applyStyle, x, y, z, kwargs.get('frame'))
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/la
    django_1    |                     rge_image/tilesource/base.py", line 1444, in
    django_1    |                     _outputTileNumpyStyle
    django_1    |                         tile = self._applyStyle(tile, self.style, x,
    django_1    |                     y, z, frame)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/la
    django_1    |                     rge_image/tilesource/base.py", line 1407, in
    django_1    |                     _applyStyle
    django_1    |                         max = self._getMinMax('max', entry.get('max',
    django_1    |                     'auto'), image.dtype, bandidx, frame)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/la
    django_1    |                     rge_image/tilesource/base.py", line 1335, in
    django_1    |                     _getMinMax
    django_1    |                         value =
    django_1    |                     self._bandRanges[frame]['max'][bandidx]
    django_1    |                     IndexError: index 1 is out of bounds for axis 0
    django_1    |                     with size 1
    

    @manthey, any insight here?

    FYI, this raster is a part of our demo_data command.

    bug 
    opened by banesullivan 7
  • kwiver test failing

    kwiver test failing

    I cannot reproduce this error outside of the tox testing environment:

    https://github.com/ResonantGeoData/ResonantGeoData/runs/5993156571?check_suite_focus=true#step:7:60

    I added a skip for the failing test in

    https://github.com/ResonantGeoData/ResonantGeoData/commit/cd01ca20c99be4e69500d1bc1732b29a92c2214e

    The error logs are: stderr.txt

    the most likely culprit is

    terminate called after throwing an instance of 'pybind11::error_already_set'
      what():  ImportError: /usr/local/lib/python3.8/lib-dynload/_posixsubprocess.cpython-38-x86_64-linux-gnu.so: undefined symbol: PyTuple_Type
    

    I cannot figure out why this is all of a sudden failing - no obvious packages have recently been upgraded

    bug 
    opened by banesullivan 1
  • Persistent S3 test file

    Persistent S3 test file

    We need a persistent file on S3 to test our file handling.

    At present, we have the following fixture:

    https://github.com/ResonantGeoData/ResonantGeoData/blob/f41be685481d3f62457aba1001faa68012760ffc/testing-utils/rgd_testing_utils/data_fixtures.py#L51-L53

    but that is currently failing with object nor found errors.

    This is not the first time this has happened and I've updated that fixture. I will temporarily patch this with another file from that bucket, but we really need to find a file, any file on S3 that we can rely on persisting.

    opened by banesullivan 0
  • migrate collection to FileSet

    migrate collection to FileSet

    • [ ] Add concrete definitions for all models in rgd and rgd_imagery
    • [ ] Make sure no two images point to the same FileSet (ref #591)
    • [ ] Change ancillary_files field on Raster to be a manyToManyField to FileSet
      • [ ] make sure this fileset is not used for an Image
    • [ ] add annotation on Image to point to FileSet
    • [ ] Change all relationships to ChecksumFile to point to FileSet per new definitions (Image is the exception and will be well documented why)

    Other things to address/start thinking about:

    • [ ] How does a user upload data? First, create a FileSet, then add ChecksumFiles? how do we implement that in the REST endpoints and Python client cleanly? Can we add some server-rendered pages to handle make this easier for users?
    • [ ] when getting images from an ImageSet, check each Image's FileSet collection before yielding
      • think of the use case where two users privately uploaded processed imagery to that ImageSet (through the ProcessedImage models)

    initial prototyping done in #566

    opened by banesullivan 0
  • Blog: Making a Schema Crosswalk between Django Models and STAC API

    Blog: Making a Schema Crosswalk between Django Models and STAC API

    Title: Making a Schema Crosswalk between Django Models and STAC API

    Description: Kitware offers ResonantGeoData: a Django web application for visualizing and searching geospatial datasets. We added support for interacting with these datasets via the STAC API. This lightning talk will discuss how we made a schema crosswalk from our current API and data models to comply with the STAC API.

    blog 
    opened by banesullivan 0
Releases(0.2.7)
Owner
Resonant GeoData
Geospatial data cataloging with Django
Resonant GeoData
RestApi With Django 3.2 And Django Rest Framework

RestApi-With-Django-3.2-And-Django-Rest-Framework Description This repository is a Software of Development with Python. Virtual Using pipenv, virtuale

Daniel Arturo Alejo Alvarez 6 Aug 02, 2022
An airlines clone website with django

abc_airlines is a clone website of an airlines system the way it works is that first you add flights to the website then the users can search flights

milad 1 Nov 16, 2021
πŸ“ŠπŸ“ˆ Serves up Pandas dataframes via the Django REST Framework for use in client-side (i.e. d3.js) visualizations and offline analysis (e.g. Excel)

Django REST Pandas Django REST Framework + pandas = A Model-driven Visualization API Django REST Pandas (DRP) provides a simple way to generate and se

wq framework 1.2k Jan 01, 2023
Quick example of a todo list application using Django and HTMX

django-htmx-todo-list Quick example of a todo list application using Django and HTMX Background Modified & expanded from https://github.com/jaredlockh

Jack Linke 54 Dec 10, 2022
A Blog Management System Built with django

Blog Management System Backend use: Django Features Enhanced Ui

Vishal Goswami 1 Dec 06, 2021
Automatic class scheduler for Texas A&M written with Python+Django and React+Typescript

Rev Registration Description Rev Registration is an automatic class scheduler for Texas A&M, aimed at easing the process of course registration by gen

Aggie Coding Club 21 Nov 15, 2022
A Django web application to receive, virus check and validate transfers of digital archival records, and allow archivists to appraise and accession those records.

Aurora Aurora is a Django web application that can receive, virus check and validate transfers of digital archival records, and allows archivists to a

Rockefeller Archive Center 20 Aug 30, 2022
Realtime data read and write without page refresh using Ajax in Django.

Realtime read-write with AJAX Hey,this is the basic implementation type of ajax realtime read write from the database. where you can insert or view re

Mehedi Hasan 3 Dec 13, 2022
A Django application that provides country choices for use with forms, flag icons static files, and a country field for models.

Django Countries A Django application that provides country choices for use with forms, flag icons static files, and a country field for models. Insta

Chris Beaven 1.2k Jan 07, 2023
Dynamic, database-driven Django forms

Django Dataforms django-dataforms is a wrapper for the Django forms API that lets you dynamically define forms in a database, rather than hard-coding

35 Dec 16, 2022
Developer-friendly asynchrony for Django

Django Channels Channels augments Django to bring WebSocket, long-poll HTTP, task offloading and other async support to your code, using familiar Djan

Django 5.5k Dec 29, 2022
Django model mixins and utilities.

django-model-utils Django model mixins and utilities. django-model-utils supports Django 2.2+. This app is available on PyPI. Getting Help Documentati

Jazzband 2.4k Jan 04, 2023
django-dashing is a customisable, modular dashboard application framework for Django to visualize interesting data about your project. Inspired in the dashboard framework Dashing

django-dashing django-dashing is a customisable, modular dashboard application framework for Django to visualize interesting data about your project.

talPor Solutions 703 Dec 22, 2022
Django React Project Setup

Django-React-Project-Setup INSTALLATION: python -m pip install drps USAGE: in your cmd: python -m drps Starting fullstack project with Django and Reac

Ghazi Zabalawi 7 Feb 06, 2022
Django CRUD REST API Generator

Django CRUD REST API Generator This is a simple tool that generates a Django REST API with the given models. Specs: Authentication, DRF generic views,

Mehmet Alp SΓΌmer 57 Nov 24, 2022
Twitter Bootstrap for Django Form

Django bootstrap form Twitter Bootstrap for Django Form. A simple Django template tag to work with Bootstrap Installation Install django-bootstrap-for

tzangms 557 Oct 19, 2022
Django project starter on steroids: quickly create a Django app AND generate source code for data models + REST/GraphQL APIs (the generated code is auto-linted and has 100% test coverage).

Create Django App πŸ’› We're a Django project starter on steroids! One-line command to create a Django app with all the dependencies auto-installed AND

imagine.ai 68 Oct 19, 2022
Django admin CKEditor integration.

Django CKEditor NOTICE: django-ckeditor 5 has backward incompatible code moves against 4.5.1. File upload support has been moved to ckeditor_uploader.

2.2k Jan 02, 2023
πŸ”₯ Campus-Run Django ServerπŸ”₯

🏫 Campus-Run Campus-Run is a 3D racing game set on a college campus. Designed this service to comfort university students who are unable to visit the

Youngkwon Kim 1 Feb 08, 2022
Official clone of the Subversion repository.

Django is a high-level Python Web framework that encourages rapid development and clean, pragmatic design. All documentation is in the "docs" directo

Raymond Penners 3 May 06, 2022