v0.1.0
Why release now? This is the first tagged release of the OldInsuranceMaps.net code base in a very long time. The only prior release, v0.0.0-lahmg, tagged the code base a couple of years ago in its final state as a georeferencing extension for GeoNode, before I began the process of turning it into a standalone web application. That transition has been 100% complete for a long time now, and the code has been has been running in production with daily usage for years, even as I continue to fix bugs and add features. Last year I began managing a second deployment of OldInsuranceMaps (a private instance for a research group) and it's becoming messy to deploy fixes and features across these two instances with just branch management. So: it is high time to begin tagging releases in a more regular manner.
Overview
OldInsuranceMaps.net is a web georeferencing platform that facilitates crowdsourced contributions to the creation of seamless historical atlas mosaics. The underlying software is slowly becoming more generic and applicable for any maps, not just Sanborn atlases. Currently though, the line between the core package, Online Historical Map Georeferencer (OHMG), and the implementation of it at OldInsuranceMaps.net, is still blurry.
Features
These release notes have a baseline description and some screenshots of the platform's main features, future release notes will just have changes.
Processing workflow
- 3-step workflow for handling georeferencing activity
- Prepare: split an image (if needed)
- Georeference: create ground control points (GCPs)
- Trim: add a mask to remove margins if desired
- Handles common georeferencing complications
- Multi-page atlases
- Multiple insets or sections on the same page
- Also useful for folded maps with gaps between sections
- "Skippable" pieces that are too small to georeference well
- Non-map content, like title pages and indexes
- Session-based user input creates narrative of work performed
- Staff/admin accounts can undo any sessions as needed
Split interface
- Draw lines across a page to split it into different regions
- Upon submission, the input page is split into multiple files based on the defined regions
- Only necessary for pages that have insets or contain multiple maps
Georeferencing interface
- Manual ground control point (GCP) creation (define pixel coordinates -> define lat/long coordinates, repeat)
- Movable GCPs during editing
- After 3 GCPs, live preview shows warped overlay when GCP added or moved
- Polynomial and Thin Plate Spline transformations
- Target projections (this feature disabled in OldInsuranceMaps.net; EPSG:3857 is fine for all Sanborns)
- Reference layers
- Automatically added "key map" if one has been defined within the atlas
- Automatically added mosaic of all other georeferenced sheets in the same atlas
- Snappable parcel boundaries if a parcel layer has been created for the atlas' locale
Mosaic creation
- A "multi-mask" creation interface provides workflow for creating topologically sounds masks across many different layers
- Each vertex is snappable so adjacent layer masks will always have contiguous boundaries
- Vertices turn green when they are shared across multiple masks (easy visual inspection to find unsnapped vertices)
- A dashed red layer extent outline is added to the interface when a user hovers a layer name in the right-hand panel
- A server-side process can be run by a server admin to combine all masked layers into a single, downloadable geotiff
Map content management
- A database structure that models maps and pages to support the georeferencing workflow
- Map: a collector-style entry that can have one Document (for a standalone map) or many Documents (like a multi-page atlas)
- Document: a single scanned image
- A Document is "prepared" into one or more Regions
- Region: a defined portion of a Document, or entire boundary this Document was not split during preparation
- A region can be "skipped" to remove it from the georeferencing workflow, or marked as a non-map
- Layer: a georeferenced Region
- All layers are grouped by category into LayerSets
- Layers can have a mask defined which is an extra geojson polygon used to hide the margins of the page
- LayerSet: a thematic grouping of layers within a Map, like "main content" (the default), or "key map", or other categories
Import, export & web services
- Server-side direct import of any items from the Library of Congress Sanborn Map collection
- Server-side import of arbitrary files and non-Sanborn maps (requires local files or links and a CSV "manifest")
- An inherited Importer class pattern to provide foundation for future custom import pipelines
- Downloadable Cloud-Optimized GeoTIFF (COG) for any georeferenced layer
- Downloadable COG for any multi-layer mosaics that have been created (based on "multi-mask")
- Dynamic geospatial web services available for any layer or mosaic on the website
- Services are provided by TiTiler and include standard formats like XYZ Tiles, TileJSON, WMS, and more
- Annotations and AnnotationPages are generated that conform to the IIIF Georeference Extension and are directly viewable in Allmaps.org
Map viewer
- Basic interactive map viewer aggregates all "main content" mosaics for a given locale
- Opacity sliders allow multiple layers to be compared
- "stateful" url params track x/y/z position of the map view as well as opacity of all layers
What's Changed
- add simple endpoints for acquiring all tifs/jpgs/points (for MRM) by @mradamcox in #97
- Implement cogs in volume summary; add MultiMask by @mradamcox in #98
- App Restructure - model migrations by @mradamcox in #100
- Move documentation by @mradamcox in #103
- Add newsletter 42 by @mradamcox in #104
- Reset all migrations (remove GeoNode dependency completely) by @mradamcox in #120
- Preparation for 0.0.1-beta release by @mradamcox in #121
- Remove many unused images and much redundant docs content by @mradamcox in #123
- remove remnant import statements by @mradamcox in #124
- add recent activity etc. to home page, #10 by @mradamcox in #129
- add components by @mradamcox in #130
- Implement cache busting strategy by @mradamcox in #132
- Frontend Improvements by @mradamcox in #133
- Replace MapServer preview with TiTiler preview by @mradamcox in #136
- 83 overhaul modals by @mradamcox in #142
- Update compression strategy by @mradamcox in #145
- App restructure by @mradamcox in #146
- Frontend updates by @mradamcox in #150
- Merge dev to main by @mradamcox in #153
- Icon updates by @mradamcox in #163
- Install updates by @mradamcox in #164
- Merge dev/0.0.1 into main by @mradamcox in #165
- Frontend updates and prep for volume management by @mradamcox in #173
- 174 zoom level display by @mradamcox in #180
- Pages to db model by @mradamcox in #182
- Add virtual resource sets by @mradamcox in #186
- Importers by @mradamcox in #190
- Better navbar and more... by @mradamcox in #196
- Small updates by @mradamcox in #198
- redirect to current page after signin by @mradamcox in #199
- Packaging update by @mradamcox in #200
- Add layers api endpoint by @mradamcox in #202
- Data model update for core content by @mradamcox in #212
- Frontend updates for new models by @mradamcox in #217
- 205 cleanup by @mradamcox in #218
- use raw id fields in admin for related objects #208 by @mradamcox in #220
- Layerv1 removal by @mradamcox in #221
- Layerv1 removal by @mradamcox in #222
- 170 fix undo operations by @mradamcox in #224
- 207 prep sessions by @mradamcox in #226
- 210 document loading by @mradamcox in #227
- Implement precommit by @mradamcox in #235
- Improve activity stats by @mradamcox in #236
- Improve tests and structure by @mradamcox in #240
- Snappable reference layer - prototype by @mradamcox in #241
- Move derived fields to db for better performance by @mradamcox in #243
- fix inactive snap interaction #244, simplify handling by @mradamcox in #245
- 205 data model cleanup by @mradamcox in #246
- further cleanup of old models by @mradamcox in #247
- 248 move layerset by @mradamcox in #249
- restructure for less nested directories, cleanup by @mradamcox in #250
- More layerset updates by @mradamcox in #251
- Better preview refresh handling by @mradamcox in #252
- Fix layerset pk by @mradamcox in #253
- Reverse gcp group relationship by @mradamcox in #254
- Squash migrations - final by @mradamcox in #255
- Refactor post patterns by @mradamcox in #256
- Add header scripts to pages by @mradamcox in #257
- Iiif georef annotations by @mradamcox in #258
- 115 document management by @mradamcox in #259
- Access permissions by @mradamcox in #260
- add creator to Annotation, refactor by @mradamcox in #261
- Installation updates by @mradamcox in #262
- skip maps in viewer with no main-content category by @mradamcox in #263
- Augment IIIF annotation by @mradamcox in #264
- 160 preview layer by @mradamcox in #267
- Bulk prepare, add Skipped category, frontend improvements by @mradamcox in #268
- Extend modal and reflayer lookup by @mradamcox in #270
- Document/Map import - Parcel layer behavior - Button titles by @mradamcox in #271
- addition of new data views by @mradamcox in #277
- Cleanup config by @mradamcox in #278
- Implement S3 storage compatibility by @mradamcox in #280
- Content restructure by @mradamcox in #281
- Cleanup content app and add default navbar by @mradamcox in #285
- Add pagination and sorting to sessions and maps list components by @mradamcox in #286
- better handle existing maps during bulk import by @mradamcox in #288
- Consolidate and improve export options by @mradamcox in #287
- Update parcelLookup.js by @mradamcox in #289
- Improve serialized layer response by @mradamcox in #290
- Rotate api key by @mradamcox in #291
- contributors lists by @mradamcox in #298
- 293 no split operation by @mradamcox in #299
- add oneoff op to delete dupe regions and prepsessions by @mradamcox in #300
- Small fixes + django apps restructure by @mradamcox in #302
- fix active button style, click event for signin modal by @mradamcox in #303
- add mass parcel layer by @mradamcox in #305
- 304 mm vertex style by @mradamcox in #306
- Add "partner" model, update homepage by @mradamcox in #307
- Upgrade titiler by @mradamcox in #309
- Lint by @mradamcox in #311
- add require params to api test endpoint by @mradamcox in #312
- fix typing and print statements by @mradamcox in #313
- Add contributors list view by @mradamcox in #314
- Remove newsletter (pt 1) by @mradamcox in #320
- move settings, celery, wsgi, etc. to conf app by @mradamcox in #321
- Enable compressor by @mradamcox in #322
- Preview tiler issue by @mradamcox in #324
- Use uv by @mradamcox in #330
- Upgrade django4 by @mradamcox in #333
- 332 stats bug by @mradamcox in #334
- remove use of pytz library by @mradamcox in #336
- add pytz dep for celery beat schedule by @mradamcox in #340
- Create run_tests.yml by @mradamcox in #341
- 335 remove newsletter by @mradamcox in #337
- Add backup script by @mradamcox in #342
- refactor parcel snap, improve styles by @mradamcox in #343
- Add reference layer model by @mradamcox in #346
- update sponsor list by @mradamcox in #347
- initial addition of zensical docs site by @mradamcox in #349
- Creating RSS feeds for Places and Maps by @JosiahDub in #344
- add optional rss link to the title bar by @mradamcox in #350
- handle situations where lock has no target #239 by @mradamcox in #352
- Layers and layersets by @mradamcox in #355
- Layers and layersets by @mradamcox in #356
- split core models.py into separate files by @mradamcox in #357
- better handling of layer mask save during multimask update by @mradamcox in #358
- Viewer performance by @mradamcox in #359
- update style by @mradamcox in #360
- Min zoom parcel by @mradamcox in #362
- Docs update by @mradamcox in #363
- small docs updates by @mradamcox in #364
- 316 deprecate multimask field on LayerSets by @mradamcox in #361
- remove multimask field from LayerSet by @mradamcox in #366
- 318 mosaic reorg by @mradamcox in #367
- 331 multimask ct by @mradamcox in #368
- set archive file name without digits in front by @mradamcox in #370
New Contributors
- @JosiahDub made their first contribution in #344
Full Changelog: v0.0.0-lahmg...v0.1.0