Skip to content

openbenches/openbenches.org

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

OpenBenches

A bench in a park, birds fly up above. In the background is a tree.

https://OpenBenches.org/ - an open data repository for memorial benches.

Supporters

You can sponsor OpenBenches on GitHub.

We'd like to thank the following sponsors for their generosity:

Contributing

All contributions are welcome. Before making a pull request, please:

  1. Raise a new issue describing the problem and how you intend to fix it.
  2. Submit a Pull Request referencing the Issue.

Open Data API

You can get all the data, or partial data, from the API. Data is returned in geoJSON format and has the following structure:

{
	"type": "FeatureCollection",
	"features": [{
		"id": 1234657,
		"type": "Feature",
		"geometry": {
			"type": "Point",
			"coordinates": [0.1234, 5.678]
		},
		"properties": {
			"created_at": "2021-06-05T12:27:36+01:00",
			"popupContent": "IN LOVING MEMORY OF\nBOB AND\nJANE",
			"media": [{
				"URL": "\/image\/3f786850e387550fdab836ed7e6dc881de23001b",
				"mediaID": 123456789,
				"licence": "CC BY-SA 4.0",
				"media_type": "inscription",
				"sha1": "3f786850e387550fdab836ed7e6dc881de23001b",
				"user": 6143,
				"username": "edent",
				"userprovider": "twitter",
				"width": 4096,
				"height": 3072
			}, {
				"URL": "\/image\/89e6c98d92887913cadf06b2adb97f26cde4849b",
				"mediaID": 43803,
				"licence": "CC BY-SA 4.0",
				"media_type": "bench",
				"sha1": "89e6c98d92887913cadf06b2adb97f26cde4849b",
				"user": 123456780,
				"username": "edent",
				"userprovider": "twitter",
				"width": 4096,
				"height": 3072
			}]
		}
	}]
}

Benches

  • All Bench Data (GeoJSON)
    • https://openbenches.org/api/benches
    • Cached for 10 minutes - changes may not appear immediately
  • Specific Bench (GeoJSON)
    • https://openbenches.org/api/bench/123
  • Benches from a specific user
    • https://openbenches.org/api/user/5678
  • Search Results (GeoJSON)
    • https://openbenches.org/api/search?search=in%20loving%20memory
  • Tagged Benches (GeoJSON)
    • https://openbenches.org/api/tag/dog
  • Benches near a location (GeoJSON)
    • https://openbenches.org/api/nearest/?latitude=46.67583&longitude=8.245239&distance=200
    • Distance is in Km
    • Uses the Haversine formula
  • Benches near a location (GPX)
    • https://openbenches.org/api/nearest/gpx?latitude=46.67583&longitude=8.245239&distance=200

Inscriptions

  • By default, the inscriptions are truncated to 128 characters.
  • To get the full inscriptions, append &truncated=false
  • https://openbenches.org/api/benches?truncated=false

Media

  • By default, the API doesn't return media.
  • To get media, append https://openbenches.org/api/benches?media=true

Latest

  • By default, the API returns all results
  • To get the latest 5 benches, append &latest=5
  • https://openbenches.org/api/benches?latest=5

Tags

  • All available folksonomy tags
    • https://openbenches.org/api/tags

Running Locally

This is a Symfony PHP and MySQL website. No need for node, complicated deploys, or spinning up containerised virtual machines in the cloud.

Requirements

  • PHP 8 or greater.
  • MySQL 5.5 or greater with innodb.
  • ImageMagick 6.9.4-10 or greater.

For more, see CONTRIBUTING.md

Database Structure

In the /database/ folder you'll find a sample database. All text fields are utf8mb4_unicode_ci because we live in the future now.

Hopefully, the tables are self explanatory:

Benches

  • benchID
  • latitude
  • longitude
  • address text representation generated by reverse geocoding. For example "10 Downing Street, London SW1A 2AA, United Kingdom"
  • inscription the text written on the bench
  • description placeholder. Might be used for comments about the bench.
  • present if a bench has been physically removed, this can be set to false.
  • published set to FALSE if the bench has been deleted
  • added datetime of when the bench was uploaded to the site
  • userID foreign key

Users

Originally we were going to force people to sign in with Twitter / Facebook / GitHub. But that discourages use - so users are now pseudo-anonymous. Hence this weird structure!

  • userID
  • provider could be Twitter, GitHub, Facebook, anon etc.
  • providerID user ID number on the provider's service. Anonymous users stores their IP address.
  • name their display name. Anonymous users stores the time they added a bench.

Media

We store the original image - smaller images are rendered dynamically.

Media storage can be complicated. Storing thousands of images in a single directory can cause problems on some systems. To get around this, we calculate the SHA1 hash of each image. The image is stored in a subdirectory based on the hash. For example, if the hash is 1A2B3C, the file will be stored in /photos/1/A/1A2B3C.jpg

  • mediaID
  • benchID
  • userID
  • sha1 A hash of the file.
  • importURL If the image was imported from an external source - like Flickr.
  • licence The default is CC BY-SA 4.0, imported images may be different.
  • media_type We allow different types of photo - in the future, we might have other types of media.
  • width The image's width in pixels.
  • height The image's width in pixels.
  • datetime The date and time the image was created - based on EXIF metadata.
  • make The make of camera which took the photo - based on EXIF metadata.
  • model The model of camera which took the photo - based on EXIF metadata.

Media Types

At the moment, we only accept photos - of the inscription, the bench, the view from the bench, a panorama, and a VR photosphere.

  • shortName Internal ID.
  • longName Displayed to the user.
  • displayOrder When rendering a form in HTML, this determines the order they are presented in.

Licences

  • shortName Internal ID.
  • longName Displayed to the user.
  • url For more information.

Tagging

Benches can be given multiple "tags". For example "cat" if the bench commemorates a feline, or "beach" if the bench is at the seaside.

Tagging uses the Toxi structure.

  • tags contains:

    • tagID a unique ID
    • tagText the displayed text
  • tag_map contains:

    • mapID a unique ID
    • tagID the ID of a tag
    • benchID the ID of a bench

Tags are hard-coded in the database and can't be added or edited by regular users.

Open Source Licenses

Everything we do builds on someone else's hard work.

And thanks to the many contributors who have improved this codebase.