Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/sfomuseum/go-http-protomaps
go-http-protomaps is an HTTP middleware package for including Protomaps.js assets in web applications.
https://github.com/sfomuseum/go-http-protomaps
golang leaflet protomaps
Last synced: 12 days ago
JSON representation
go-http-protomaps is an HTTP middleware package for including Protomaps.js assets in web applications.
- Host: GitHub
- URL: https://github.com/sfomuseum/go-http-protomaps
- Owner: sfomuseum
- License: other
- Created: 2021-04-23T21:00:13.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2024-06-05T19:09:15.000Z (6 months ago)
- Last Synced: 2024-06-05T21:17:31.242Z (6 months ago)
- Topics: golang, leaflet, protomaps
- Language: JavaScript
- Homepage:
- Size: 8.3 MB
- Stars: 1
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# go-http-protomaps
![](docs/images/go-http-leaflet-protomaps-sfo.png)
`go-http-protomaps` is an HTTP middleware package for including Protomaps.js (v0.15.0) assets in web applications.
## Documentation
[![Go Reference](https://pkg.go.dev/badge/github.com/sfomuseum/go-http-protomaps.svg)](https://pkg.go.dev/github.com/sfomuseum/go-http-protomaps)
`go-http-protomaps` is an HTTP middleware package for including Protomaps.js assets in web applications. It exports two principal methods:
* `protomaps.AppendAssetHandlers(*http.ServeMux, *ProtomapsOptions)` which is used to append HTTP handlers to a `http.ServeMux` instance for serving Protomaps JavaScript files, and related assets.
* `protomaps.AppendResourcesHandler(http.Handler, *ProtomapsOptions)` which is used to rewrite any HTML produced by previous handler to include the necessary markup to load Protomaps JavaScript files and related assets.## Example
```
package mainimport (
"embed"
"log"
"net/http"
"net/url""github.com/sfomuseum/go-http-protomaps"
)//go:embed index.html sfo.pmtiles
var staticFS embed.FSfunc main() {
tile_url := "/sfo.pmtiles"
static_fs := http.FS(staticFS)
static_handler := http.FileServer(static_fs)mux := http.NewServeMux()
mux.Handle(*tile_url, static_handler)
pm_opts := protomaps.DefaultProtomapsOptions()
pm_opts.TileURL = *tile_urlprotomaps.AppendAssetHandlers(mux, pm_opts)
index_handler := protomaps.AppendResourcesHandler(static_handler, pm_opts)
mux.Handle("/", index_handler)err = http.ListenAndServe(":8080", mux)
}
```_Error handling omitted for brevity._
## Tools
```
$> make cli
go build -mod vendor -o bin/example cmd/example/main.go
```### example
A simple example web application that uses the `go-http-protomaps` middleware and displays a map.
```
$> ./bin/example -h
Usage of ./bin/example:
-protomaps-tile-url string
A custom file://, http:// or https:// URI pointing to a valid Protomaps tiles bundle. (default "/sfo.pmtiles")
-server-uri string
A valid aaronland/go-http-server URI (default "http://localhost:8080")
```The `example` application contains an embedded Protomaps tiles database file so the easiest way to test things is like this:
```
$> ./bin/example
2021/04/28 07:45:57 Listening for requests on http://localhost:8080
```And then when you open the URL `http://localhost:8080` in your web browser you should see something like this:
![](docs/images/go-http-leaflet-protomaps-sfo.png)
The `example` application also supports loading `.pmtiles` databases from remote locations. For example:
```
$> ./bin/example -protomaps-tile-url https://static.sfomuseum.org/pmtiles/sfo.pmtiles
2021/04/28 07:48:11 Listening for requests on http://localhost:8080
```If you want to load a local file you'd do this:
```
$> ./bin/example -protomaps-tile-url file:///usr/local/data/sfo.pmtiles
2021/04/28 07:48:53 Listening for requests on http://localhost:8080
```In the case of `file://` URLs the `example` application will create an `http.Dir` handler for the root folder of the URL (`/usr/local/data/)` and then route the filename (`/sfo.pmtiles`) to that handler.
## AWS
### S3
If you are serving your Protomaps `.pmtiles` databases from an S3 bucket you'll need to make that you have `CORS` enabled for that bucket. For example:
```
[
{
"AllowedHeaders": [
"*"
],
"AllowedMethods": [
"GET",
"HEAD"
],
"AllowedOrigins": [
"*"
],
"ExposeHeaders": [],
"MaxAgeSeconds": 3000
}
]
```_Be sure to allow the `HEAD` method. It took me a while to remember this was necessary the first time I set things up._
### CloudFront
If you are serving your Protomaps `.pmtiles` databases from a CloudFront endpoint you'll need to make sure you do the following:
* Ensure that the `Allowed HTTP Methods` setting is configured to allow "GET, HEAD, OPTIONS".
* Ensure that the `Cache Based on Selected Request Headers` setting is configured to use a "whitelist".
* Add the following default headers to the whitelist: `Access-Control-Request-Headers`, `Access-Control-Request-Method`, `Origin`.
* Add the following custom headers to the whitelist: `Range`.## See also
* https://protomaps.com/blog/new-way-to-make-maps/
* https://github.com/protomaps/protomaps.js
* https://github.com/aaronland/go-http-leaflet