From 9d0fec4bfa02082551fdf3b80afd7d99dfc83cd3 Mon Sep 17 00:00:00 2001 From: Niels-Ole Lambertz Date: Thu, 11 Apr 2024 10:56:14 +0200 Subject: [PATCH] Removing experimental renderer to stay more true to the original goal of this repo --- README.md | 25 +-- assets/5295-compare.png | Bin 35742 -> 0 bytes assets/5295.png | Bin 107010 -> 0 bytes go.mod | 17 -- go.sum | 60 ------ main.go | 69 +------ renderer/.gitignore | 3 - renderer/experimental-renderer-windows.go | 27 --- renderer/experimental-renderer.go | 239 ---------------------- renderer/experimental-renderer_test.go | 182 ---------------- renderer/file.go | 88 -------- renderer/projector.go | 61 ------ renderer/projector_test.go | 51 ----- renderer/types.go | 87 -------- renderer/types_test.go | 21 -- 15 files changed, 8 insertions(+), 922 deletions(-) delete mode 100644 assets/5295-compare.png delete mode 100644 assets/5295.png delete mode 100644 renderer/.gitignore delete mode 100644 renderer/experimental-renderer-windows.go delete mode 100644 renderer/experimental-renderer.go delete mode 100644 renderer/experimental-renderer_test.go delete mode 100644 renderer/file.go delete mode 100644 renderer/projector.go delete mode 100644 renderer/projector_test.go delete mode 100644 renderer/types.go delete mode 100644 renderer/types_test.go diff --git a/README.md b/README.md index 870b374..0bd0e7b 100644 --- a/README.md +++ b/README.md @@ -55,15 +55,13 @@ go build . If you prefer to run the binary directly you have the following options: ``` -Usage of ./go_tile: +Usage of go_tile: -data string Path to directory containing tiles (default "./data") -host string HTTP Listening host (default "0.0.0.0") -map string Name of map. This value is also used to determine the metatile subdirectory (default "ajt") - -osm_path string - Path to osm_path to use for direct rendering. (experimental) -port int HTTP Listening port (default 8080) -renderd-timeout duration @@ -138,24 +136,3 @@ Percentage of the requests served within a certain time (ms) This benchmark doesn't access the disk, as the tile has obviously been cached in memory. Anyways it should give you an indication of whether this is fast enough for your use-case. - -# Experimental renderer - -This repo also contains an experimental rudimentary renderer. Its goal is to be able to render some sort of map with little operational overhead. - -Experimental renderer (this will not be updated on every release, so ymmv) compared with osm.org: - -![black lines only](assets/5295.png) -![osm.org](assets/5295-compare.png) - -Images [OpenStreetMap](https://www.openstreetmap.org/) contributors, [CC-BY-SA](https://creativecommons.org/licenses/by-sa/2.0/) - -To use this, pass an oms.pbf file via `-osm_path`. - -Currently osm.pbf files have to be prepared like so -``` -osmium add-locations-to-ways ~/Downloads/hamburg-latest.osm.pbf -o prepared.osm.pbf -f -``` - -This creates a temporary file on startup, which might take some time. -Testing so far was only done for individual cities. diff --git a/assets/5295-compare.png b/assets/5295-compare.png deleted file mode 100644 index 23eff1676c65e83cecd933d95c2194287370350e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35742 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�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 Wk4fx!9DkUAe-7&&(|M|86YxL&0XkU# diff --git a/go.mod b/go.mod index 32a97f2..67c35f3 100644 --- a/go.mod +++ b/go.mod @@ -1,20 +1,3 @@ module github.com/nielsole/go_tile go 1.20 - -require ( - git.sr.ht/~sbinet/gg v0.5.0 - github.com/paulmach/osm v0.7.1 -) - -require ( - github.com/campoy/embedmd v1.0.0 // indirect - github.com/datadog/czlib v0.0.0-20160811164712-4bc9a24e37f2 // indirect - github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect - github.com/paulmach/orb v0.1.3 // indirect - github.com/paulmach/protoscan v0.2.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/image v0.7.0 // indirect - golang.org/x/text v0.9.0 // indirect - google.golang.org/protobuf v1.27.1 // indirect -) diff --git a/go.sum b/go.sum index a878925..e69de29 100644 --- a/go.sum +++ b/go.sum @@ -1,60 +0,0 @@ -git.sr.ht/~sbinet/gg v0.5.0 h1:6V43j30HM623V329xA9Ntq+WJrMjDxRjuAB1LFWF5m8= -git.sr.ht/~sbinet/gg v0.5.0/go.mod h1:G2C0eRESqlKhS7ErsNey6HHrqU1PwsnCQlekFi9Q2Oo= -github.com/campoy/embedmd v1.0.0 h1:V4kI2qTJJLf4J29RzI/MAt2c3Bl4dQSYPuflzwFH2hY= -github.com/campoy/embedmd v1.0.0/go.mod h1:oxyr9RCiSXg0M3VJ3ks0UGfp98BpSSGr0kpiX3MzVl8= -github.com/datadog/czlib v0.0.0-20160811164712-4bc9a24e37f2 h1:ISaMhBq2dagaoptFGUyywT5SzpysCbHofX3sCNw1djo= -github.com/datadog/czlib v0.0.0-20160811164712-4bc9a24e37f2/go.mod h1:2yDaWzisHKoQoxm+EU4YgKBaD7g1M0pxy7THWG44Lro= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/paulmach/orb v0.1.3 h1:Wa1nzU269Zv7V9paVEY1COWW8FCqv4PC/KJRbJSimpM= -github.com/paulmach/orb v0.1.3/go.mod h1:VFlX/8C+IQ1p6FTRRKzKoOPJnvEtA5G0Veuqwbu//Vk= -github.com/paulmach/osm v0.7.1 h1:dc84gLa4S/zCCqpBxb6jXTkN5dCI7VK7edt/tZTFG50= -github.com/paulmach/osm v0.7.1/go.mod h1:v0vZa0rKnCsO8ovx0Z+hR9BWVD+vO4ogLOXcV18/0yk= -github.com/paulmach/protoscan v0.2.1 h1:rM0FpcTjUMvPUNk2BhPJrreDKetq43ChnL+x1sRg8O8= -github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/image v0.7.0 h1:gzS29xtG1J5ybQlv0PuyfE3nmc6R4qB73m6LUUmvFuw= -golang.org/x/image v0.7.0/go.mod h1:nd/q4ef1AKKYl/4kft7g+6UyGbdiqWqTP1ZAbRoV7Rg= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20190921001708-c4c64cad1fd0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= diff --git a/main.go b/main.go index 4bc9397..aebb405 100644 --- a/main.go +++ b/main.go @@ -7,7 +7,6 @@ import ( "flag" "fmt" "io" - "io/ioutil" "net" "net/http" "os" @@ -15,7 +14,6 @@ import ( "syscall" "time" - "github.com/nielsole/go_tile/renderer" "github.com/nielsole/go_tile/utils" ) @@ -174,7 +172,6 @@ func main() { data_dir := flag.String("data", "./data", "Path to directory containing tiles") static_dir := flag.String("static", "./static/", "Path to static file directory") renderd_socket := flag.String("socket", "", "Unix domain socket path or hostname:port for contacting renderd. Rendering disabled by default.") - osm_path := flag.String("osm_path", "", "Path to osm_path to use for direct rendering. (experimental)") renderd_timeout_duration := flag.Duration("renderd-timeout", (time.Duration(60) * time.Second), "Timeout duration after which renderd returns an error to the client (I.E. '30s' for thirty seconds). Set negative to disable") map_name := flag.String("map", "ajt", "Name of map. This value is also used to determine the metatile subdirectory") tls_cert_path := flag.String("tls_cert_path", "", "Path to TLS certificate") @@ -184,10 +181,6 @@ func main() { flag.Parse() - if len(*osm_path) > 0 && len(*renderd_socket) > 0 { - logFatalf("osm_path and renderd_socket are mutually exclusive") - } - // Renderd expects at most 64 bytes. // 64 - (5 * 4 bytes - 1 zero byte of null-terminated string) = 43 if len(*map_name) > 43 { @@ -212,63 +205,15 @@ func main() { logInfof("renderd backend is disabled") } - var requestHandler func(http.ResponseWriter, *http.Request) - - if len(*osm_path) > 0 { - // Create a temp file. - var err error - tempFile, err := ioutil.TempFile("", "example") - if err != nil { - fmt.Println("Cannot create temp file:", err) - os.Exit(1) - } - - data, err := renderer.LoadData(*osm_path, 15, tempFile) - if err != nil { - logFatalf("There was an error loading data: %v", err) - } - tempFileName := tempFile.Name() - tempFile.Close() - - // Memory-map the file - mmapData, mmapFile, err := renderer.Mmap(tempFileName) - if err != nil { - logFatalf("There was an error memory-mapping temp file: %v", err) - } - defer renderer.Munmap(mmapData) - defer mmapFile.Close() - requestHandler = func(w http.ResponseWriter, r *http.Request) { - if *verbose { - logDebugf("%s request received: %s", r.Method, r.RequestURI) - } - if r.Method != "GET" { - http.Error(w, "Only GET requests allowed", http.StatusMethodNotAllowed) - return - } - renderer.HandleRenderRequest(w, r, *renderd_timeout_duration, data, 15, mmapData) - //handleRequest(w, r, *data_dir, *map_name, *renderd_socket, *renderd_timeout_duration, *tile_expiration_duration) + requestHandler := func(w http.ResponseWriter, r *http.Request) { + if *verbose { + logDebugf("%s request received: %s", r.Method, r.RequestURI) } - defer func() { - // Cleanup the temp file. - if err := os.Remove(tempFile.Name()); err != nil { - fmt.Println("Failed to remove temp file:", err) - } else { - fmt.Println("Temp file removed.") - } - - }() - } else { - - requestHandler = func(w http.ResponseWriter, r *http.Request) { - if *verbose { - logDebugf("%s request received: %s", r.Method, r.RequestURI) - } - if r.Method != "GET" { - http.Error(w, "Only GET requests allowed", http.StatusMethodNotAllowed) - return - } - handleRequest(w, r, *data_dir, *map_name, *renderd_socket, *renderd_timeout_duration, *tile_expiration_duration) + if r.Method != "GET" { + http.Error(w, "Only GET requests allowed", http.StatusMethodNotAllowed) + return } + handleRequest(w, r, *data_dir, *map_name, *renderd_socket, *renderd_timeout_duration, *tile_expiration_duration) } // HTTP request multiplexer httpServeMux := http.NewServeMux() diff --git a/renderer/.gitignore b/renderer/.gitignore deleted file mode 100644 index da5f78c..0000000 --- a/renderer/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -cpu.out -*.svg -*.test diff --git a/renderer/experimental-renderer-windows.go b/renderer/experimental-renderer-windows.go deleted file mode 100644 index 172873c..0000000 --- a/renderer/experimental-renderer-windows.go +++ /dev/null @@ -1,27 +0,0 @@ -//go:build windows -// +build windows - -package renderer - -import ( - "errors" - "net/http" - "os" - "time" -) - -func LoadData(path string, maxZ uint32, tempFile *os.File) (*Data, error) { - return nil, errors.New("not implemented on Windows") -} - -func Mmap(path string) (*[]byte, *os.File, error) { - return nil, nil, errors.New("not implemented on Windows") -} - -func HandleRenderRequest(w http.ResponseWriter, r *http.Request, duration time.Duration, data *Data, maxTreeDepth uint32, mmapData *[]byte) { - return -} - -func Munmap(data *[]byte) error { - return errors.New("not implemented on Windows") -} diff --git a/renderer/experimental-renderer.go b/renderer/experimental-renderer.go deleted file mode 100644 index 01c8283..0000000 --- a/renderer/experimental-renderer.go +++ /dev/null @@ -1,239 +0,0 @@ -//go:build !windows -// +build !windows - -package renderer - -import ( - "context" - "io" - "net/http" - "os" - "runtime" - "syscall" - "time" - - "git.sr.ht/~sbinet/gg" - "github.com/nielsole/go_tile/utils" - "github.com/paulmach/osm" - "github.com/paulmach/osm/osmpbf" -) - -func pointToPixels(point Point, bbox BoundingBox, pixels uint32) Pixel { - x := (point.Lon - bbox.Min.Lon) / (bbox.Max.Lon - bbox.Min.Lon) * float64(pixels) - y := float64(pixels) - (point.Lat-bbox.Min.Lat)/(bbox.Max.Lat-bbox.Min.Lat)*float64(pixels) - return Pixel{x, y} -} - -// Returns true for types of Ways that should be displayed at zoom level 0-9. -// Includes major roads, railways, waterways, and important landmarks. -func importantLandmarkZ9(tags *osm.Tags) bool { - return isImportantWay(tags) //|| isRailWay(tags) || isWaterWay(tags) || isImportantLandmark(tags) -} - -func isImportantWay(tags *osm.Tags) bool { - value := tags.Find("highway") - return value == "motorway" || value == "trunk" || value == "primary" || value == "secondary" || value == "tertiary" || value == "motorway_link" || value == "trunk_link" || value == "primary_link" || value == "secondary_link" || value == "tertiary_link" -} - -func nodeToPoint(node *osm.WayNode) Point { - return Point{node.Lon, node.Lat} -} - -func LoadData(path string, maxZ uint32, tempFile *os.File) (*Data, error) { - file, err := os.Open(path) - if err != nil { - panic(err) - } - defer file.Close() - - // The third parameter is the number of parallel decoders to use. - scanner := osmpbf.New(context.Background(), file, runtime.GOMAXPROCS(-1)) - scanner.SkipNodes = true - scanner.SkipRelations = true - defer scanner.Close() - data := Data{ - Tiles: make(map[uint64]*[]MapObjectOffset), - Filepath: tempFile.Name(), - } - - // // Creating an empty list for every layer of zoom 0-20 - // for i := 0; i < 21; i++ { - // data.Levels = append(data.Levels, make([]uint64, 0)) - // } - var i uint64 = 0 - var maxPoints int = 0 - for scanner.Scan() { - switch v := scanner.Object().(type) { - case *osm.Way: - mapObject := MapObject{ - BoundingBox: getBoundingBoxFromWay(v), - Points: make([]Point, 0), - } - for _, node := range v.Nodes { - mapObject.Points = append(mapObject.Points, nodeToPoint(&node)) - } - if len(mapObject.Points) > maxPoints { - maxPoints = len(mapObject.Points) - } - position, err := tempFile.Seek(0, io.SeekCurrent) - if err != nil { - return nil, err - } - _, err = WriteMapObject(tempFile, mapObject) - if err != nil { - return nil, err - } - containingTiles := getTilesForBoundingBox(mapObject.BoundingBox, 0, maxZ) - for _, containingTile := range containingTiles { - if !importantLandmarkZ9(&v.Tags) && (containingTile.Z < 11) { - continue - } - index := containingTile.index() - if _, ok := data.Tiles[index]; ok { - *data.Tiles[index] = append(*data.Tiles[index], MapObjectOffset(position)) - } else { - data.Tiles[index] = &[]MapObjectOffset{MapObjectOffset(position)} - } - } - i += 1 - } - - if err := scanner.Err(); err != nil { - return nil, err - } - } - data.MaxPoints = maxPoints - return &data, nil -} - -func Mmap(path string) (*[]byte, *os.File, error) { - file, err := os.Open(path) - if err != nil { - return nil, nil, err - } - defer file.Close() - fi, err := file.Stat() - if err != nil { - return nil, nil, err - } - size := int64(fi.Size()) - // Get system page size - pageSize := os.Getpagesize() - - // Calculate the number of pages needed, rounding up - pages := (size + int64(pageSize) - 1) / int64(pageSize) - - // Calculate the size in bytes - sizeInBytes := pages * int64(pageSize) - - // Memory-map the file - mmapData, err := syscall.Mmap(int(file.Fd()), 0, int(sizeInBytes), syscall.PROT_READ, syscall.MAP_SHARED) - if err != nil { - return nil, nil, err - } - return &mmapData, file, nil -} - -func Munmap(data *[]byte) error { - return syscall.Munmap(*data) -} - -func HandleRenderRequest(w http.ResponseWriter, r *http.Request, duration time.Duration, data *Data, maxTreeDepth uint32, mmapData *[]byte) { - z, x, y, ext, err := utils.ParsePath(r.URL.Path) - if ext != "png" { - http.Error(w, "Only png is supported", http.StatusBadRequest) - } - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - tile := Tile{ - X: x, - Y: y, - Z: z, - } - bbox := getBoundingBox(tile) - // fmt.Printf("Bounding box is from Lat %f, Lon %f to Lat %f, Lon %f\n", bbox.Min.Lat, bbox.Min.Lon, bbox.Max.Lat, bbox.Max.Lon) - - const S = 256 - dc := gg.NewContext(S, S) - - dc.SetRGB(1, 1, 1) - dc.Clear() - parentTile := tile - for tempZ := z; tempZ > maxTreeDepth; tempZ-- { - parentTile = parentTile.getParent() - } - wayIndices, ok := data.Tiles[parentTile.index()] - if !ok { - // Return 404 - w.WriteHeader(http.StatusNotFound) - return - } - way := MapObject{Points: make([]Point, 0, data.MaxPoints)} - for _, wayReference := range *wayIndices { - err := ReadMapObject(mmapData, int64(wayReference), &way) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - // way := data.MapObjects[wayReference] - visible := false - if !bbox.overlaps(way.BoundingBox) { - continue - } - //tags := way.Tags.Map() - for i, point := range way.Points { - // Print Lat and Lng of node - //fmt.Printf("Lat: %f, Lon: %f\n", node.Lat, node.Lon) - - if bbox.contains(point) { - visible = true - } - - // We know that all previous points were outside of bounds, so we can skip them - if i != 0 && visible { - dc.SetRGB(0, 0, 0) - // if highway, ok := tags["highway"]; ok { - // switch highway { - // case "motorway": - // dc.SetRGB(0.9, 0.6, 0.6) - // dc.SetLineWidth(6) - // case "trunk": - // dc.SetRGB(0.85, 0.55, 0.55) - // dc.SetLineWidth(4) - // case "primary": - // dc.SetRGB(0.8, 0.5, 0.5) - // dc.SetLineWidth(3) - // case "secondary": - // dc.SetRGB(0.75, 0.45, 0.45) - // dc.SetLineWidth(2) - // case "tertiary": - // dc.SetRGB(0.7, 0.4, 0.4) - // dc.SetLineWidth(1.5) - // case "unclassified": - // dc.SetRGB(0.65, 0.35, 0.35) - // dc.SetLineWidth(1.5) - // case "residential": - // dc.SetRGB(0.6, 0.3, 0.3) - // dc.SetLineWidth(1.5) - // } - // } else { - dc.SetLineWidth(1) - //} - - previousPoint := way.Points[i-1] - currentPixel := pointToPixels(point, bbox, S) - previousPixel := pointToPixels(previousPoint, bbox, S) - dc.DrawLine(previousPixel.X, previousPixel.Y, currentPixel.X, currentPixel.Y) - dc.Stroke() - } - } - } - - w.Header().Set("Content-Type", "image/png") - if err := dc.EncodePNG(w); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - } -} diff --git a/renderer/experimental-renderer_test.go b/renderer/experimental-renderer_test.go deleted file mode 100644 index 5c5fb8f..0000000 --- a/renderer/experimental-renderer_test.go +++ /dev/null @@ -1,182 +0,0 @@ -//go:build !windows -// +build !windows - -package renderer - -import ( - "bytes" - "fmt" - "io/ioutil" - "log" - "net/http/httptest" - "os" - "syscall" - "testing" - "time" -) - -// Test to check bounding box -func TestBoundingBox(t *testing.T) { - // Test bounding box - p := Point{10.068140300000001, 53.6577386} - tile := Tile{ - X: 138403, - Y: 84591, - Z: 18, - } - bbox := getBoundingBox(tile) - if !bbox.contains(p) { - t.Errorf("Point %v is not in bounding box %v", p, bbox) - } -} - -// How to debug -// go test -benchtime 15s -bench=BenchmarkServe -cpuprofile cpu.out -// go tool pprof cpu.out -// svg - -// 26440844f98323a1ea611acd3be00196a7b2a48d 2023-06-27 -// -// 752985932 ns/op -// -// 643b79ef31ade931afa5037381eeecd8a2a19d19 -// -// 54120852 ns/op -// -// b82ccbeef7bebe3647783ea9b3ed80638d5785cd -// -// 8390724 ns/op -// 5443820 ns/op -// -// Full tile -// 3484142532 ns/op -// cec1fd4962a9fd01956f827a7ca74d98560bb6a1 -// -// 293297990 ns/op -// 88056 ns/op -// -// c03af9bccb2499f3f0291c8e8aca22f141f06600 -// -// 77898 ns/op -// -// ef29875363c610d536be31e603921c71ef698468 -// -// 95696 ns/op -func BenchmarkServeEmptyTile(b *testing.B) { - b.StopTimer() - pathTile := "/tile/11/1086/664.png" - tempFile, err := ioutil.TempFile("", "example") - if err != nil { - fmt.Println("Cannot create temp file:", err) - os.Exit(1) - } - defer os.Remove(tempFile.Name()) - data, err := LoadData("/home/nokadmin/projects/go_tile/mock_data/test.osm.pbf", 15, tempFile) - if err != nil { - b.Error(err) - } - tempFileName := tempFile.Name() - tempFile.Close() - // Memory-map the file - mmapData, mmapFile, err := Mmap(tempFileName) - if err != nil { - log.Fatalf("There was an error memory-mapping temp file: %v", err) - } - defer syscall.Munmap(*mmapData) - defer mmapFile.Close() - b.StartTimer() - for i := 0; i < b.N; i++ { - req := httptest.NewRequest("GET", pathTile, bytes.NewReader([]byte{})) - resp := httptest.ResponseRecorder{} - HandleRenderRequest(&resp, req, time.Second, data, 15, mmapData) - } -} - -// b82ccbeef7bebe3647783ea9b3ed80638d5785cd -// -// 2579786011 ns/op -// 2532791281 ns/op -// -// cec1fd4962a9fd01956f827a7ca74d98560bb6a1 -// 18045510356 ns/op -// 13405872770 ns/op -// -// 4064247136 ns/op -// -// c03af9bccb2499f3f0291c8e8aca22f141f06600 -// -// 2456439762 ns/op -// 2536369085 ns/op -func BenchmarkServeFullTile(b *testing.B) { - b.StopTimer() - pathTile := "/tile/11/1081/661.png" - tempFile, err := ioutil.TempFile("", "example") - if err != nil { - fmt.Println("Cannot create temp file:", err) - os.Exit(1) - } - defer os.Remove(tempFile.Name()) - data, err := LoadData("/home/nokadmin/projects/go_tile/mock_data/test.osm.pbf", 15, tempFile) - if err != nil { - b.Error(err) - } - tempFileName := tempFile.Name() - tempFile.Close() - // Memory-map the file - mmapData, mmapFile, err := Mmap(tempFileName) - if err != nil { - log.Fatalf("There was an error memory-mapping temp file: %v", err) - } - defer syscall.Munmap(*mmapData) - defer mmapFile.Close() - b.StartTimer() - for i := 0; i < b.N; i++ { - req := httptest.NewRequest("GET", pathTile, bytes.NewReader([]byte{})) - resp := httptest.ResponseRecorder{} - HandleRenderRequest(&resp, req, time.Second, data, 15, mmapData) - } -} - -// b82ccbeef7bebe3647783ea9b3ed80638d5785cd -// -// 8440346178 ns/op -// 90810744 ns/op -// -// cec1fd4962a9fd01956f827a7ca74d98560bb6a1 -// -// 41576416793 ns/op -// 7996205074 ns/op -// -// c03af9bccb2499f3f0291c8e8aca22f141f06600 -// -// 4617123956 ns/op -// 101012328 ns/op -func BenchmarkServeFullTileZ3(b *testing.B) { - b.StopTimer() - pathTile := "/tile/3/4/2.png" - tempFile, err := ioutil.TempFile("", "example") - if err != nil { - fmt.Println("Cannot create temp file:", err) - os.Exit(1) - } - defer os.Remove(tempFile.Name()) - data, err := LoadData("/home/nokadmin/projects/go_tile/mock_data/test.osm.pbf", 15, tempFile) - if err != nil { - b.Error(err) - } - tempFileName := tempFile.Name() - tempFile.Close() - // Memory-map the file - mmapData, mmapFile, err := Mmap(tempFileName) - if err != nil { - log.Fatalf("There was an error memory-mapping temp file: %v", err) - } - defer syscall.Munmap(*mmapData) - defer mmapFile.Close() - b.StartTimer() - for i := 0; i < b.N; i++ { - req := httptest.NewRequest("GET", pathTile, bytes.NewReader([]byte{})) - resp := httptest.ResponseRecorder{} - HandleRenderRequest(&resp, req, time.Second, data, 15, mmapData) - } -} diff --git a/renderer/file.go b/renderer/file.go deleted file mode 100644 index 620ef08..0000000 --- a/renderer/file.go +++ /dev/null @@ -1,88 +0,0 @@ -package renderer - -import ( - "bytes" - "encoding/binary" - "os" -) - -func WriteMapObject(file *os.File, mo MapObject) (int64, error) { - // Buffer to store binary representation - buf := new(bytes.Buffer) - - // Write BoundingBox - err := binary.Write(buf, binary.LittleEndian, mo.BoundingBox.Min.Lat) - if err != nil { - return 0, err - } - err = binary.Write(buf, binary.LittleEndian, mo.BoundingBox.Min.Lon) - if err != nil { - return 0, err - } - err = binary.Write(buf, binary.LittleEndian, mo.BoundingBox.Max.Lat) - if err != nil { - return 0, err - } - err = binary.Write(buf, binary.LittleEndian, mo.BoundingBox.Max.Lon) - if err != nil { - return 0, err - } - - // Write length of Points slice - err = binary.Write(buf, binary.LittleEndian, int64(len(mo.Points))) - if err != nil { - return 0, err - } - - // Write Points - for _, p := range mo.Points { - err = binary.Write(buf, binary.LittleEndian, p.Lat) - if err != nil { - return 0, err - } - err = binary.Write(buf, binary.LittleEndian, p.Lon) - if err != nil { - return 0, err - } - } - - // Write to file - n, err := file.Write(buf.Bytes()) - return int64(n), err -} - -func ReadMapObject(mmapData *[]byte, offset int64, mo *MapObject) error { - // Go to the correct offset - - // Create a bytes reader for the buffer - reader := bytes.NewReader((*mmapData)[offset : offset+40]) - - // Read BoundingBox and length from the buffer - binary.Read(reader, binary.LittleEndian, &mo.BoundingBox.Min.Lat) - binary.Read(reader, binary.LittleEndian, &mo.BoundingBox.Min.Lon) - binary.Read(reader, binary.LittleEndian, &mo.BoundingBox.Max.Lat) - binary.Read(reader, binary.LittleEndian, &mo.BoundingBox.Max.Lon) - - var lenPoints int64 - binary.Read(reader, binary.LittleEndian, &lenPoints) - - // Create a bytes reader for the buffer - reader = bytes.NewReader((*mmapData)[offset+40 : offset+40+lenPoints*16]) - - // Ensure Points slice is big enough - if cap(mo.Points) < int(lenPoints) { - mo.Points = make([]Point, lenPoints) - } else { - mo.Points = mo.Points[:lenPoints] - } - - // Read Points from the buffer - for i := int64(0); i < lenPoints; i++ { - var p Point - binary.Read(reader, binary.LittleEndian, &p.Lat) - binary.Read(reader, binary.LittleEndian, &p.Lon) - mo.Points[i] = p - } - - return nil -} diff --git a/renderer/projector.go b/renderer/projector.go deleted file mode 100644 index a39540d..0000000 --- a/renderer/projector.go +++ /dev/null @@ -1,61 +0,0 @@ -package renderer - -import ( - "math" - - "github.com/paulmach/osm" -) - -func getBoundingBox(tile Tile) BoundingBox { - n := math.Pow(2.0, float64(tile.Z)) - lonMin := float64(tile.X)/n*360.0 - 180.0 - latMin := math.Atan(math.Sinh(math.Pi*(1-2*float64(tile.Y)/n))) * 180.0 / math.Pi - lonMax := float64(tile.X+1)/n*360.0 - 180.0 - latMax := math.Atan(math.Sinh(math.Pi*(1-2*float64(tile.Y+1)/n))) * 180.0 / math.Pi - pointMin := Point{math.Min(lonMin, lonMax), math.Min(latMin, latMax)} - pointMax := Point{math.Max(lonMin, lonMax), math.Max(latMin, latMax)} - return BoundingBox{pointMin, pointMax} -} - -func getBoundingBoxFromWay(way *osm.Way) BoundingBox { - var lonMin float64 = 200.0 - var latMin float64 = 200.0 - var lonMax float64 = -200.0 - var latMax float64 = -200.0 - for _, node := range way.Nodes { - lonMin = math.Min(lonMin, node.Lon) - latMin = math.Min(latMin, node.Lat) - lonMax = math.Max(lonMax, node.Lon) - latMax = math.Max(latMax, node.Lat) - } - pointMin := Point{lonMin, latMin} - pointMax := Point{lonMax, latMax} - return BoundingBox{pointMin, pointMax} - -} - -// Given a latitude, longitude and zoom level, return the tile coordinates -func deg2num(lat_deg, lon_deg float64, zoom uint32) (x, y uint32) { - lat_rad := math.Pi * lat_deg / 180.0 - n := math.Pow(2.0, float64(zoom)) - x = uint32(math.Floor((lon_deg + 180.0) / 360.0 * n)) - y = uint32(math.Floor((1.0 - math.Log(math.Tan(lat_rad)+(1/math.Cos(lat_rad)))/math.Pi) / 2.0 * n)) - return -} - -func getTilesForBoundingBox(bbox BoundingBox, minZ, maxZ uint32) []Tile { - var tiles []Tile - - for z := minZ; z <= maxZ; z++ { - minX, minY := deg2num(bbox.Max.Lat, bbox.Min.Lon, z) - maxX, maxY := deg2num(bbox.Min.Lat, bbox.Max.Lon, z) - - for x := minX; x <= maxX; x++ { - for y := minY; y <= maxY; y++ { - tiles = append(tiles, Tile{X: x, Y: y, Z: z}) - } - } - } - - return tiles -} diff --git a/renderer/projector_test.go b/renderer/projector_test.go deleted file mode 100644 index a2e4ebd..0000000 --- a/renderer/projector_test.go +++ /dev/null @@ -1,51 +0,0 @@ -package renderer - -import "testing" - -func TestNum2Deg(t *testing.T) { - // The center of Hamburg - tile := Tile{ - X: 138346, - Y: 84715, - Z: 18, - } - bbox := getBoundingBox(tile) - test_point := bbox.center() - x, y := deg2num(test_point.Lat, test_point.Lon, 18) - if x != tile.X { - t.Errorf("X should be %v, but is %v", tile.X, x) - } - if y != tile.Y { - t.Errorf("Y should be %v, but is %v", tile.Y, y) - } -} - -func TestGetTilesForBoundingBox(t *testing.T) { - bbox := BoundingBox{ - Min: Point{ - Lat: 53.557078, - Lon: 9.989095, - }, - Max: Point{ - Lat: 53.557078, - Lon: 9.989095, - }, - } - tiles := getTilesForBoundingBox(bbox, 18, 18) - if len(tiles) != 1 { - t.Errorf("Should be 1 tile, but is %v", len(tiles)) - } - if tiles[0].X != 138345 { - t.Errorf("X should be 138346, but is %v", tiles[0].X) - } - if tiles[0].Y != 84715 { - t.Errorf("Y should be 84715, but is %v", tiles[0].Y) - } - if tiles[0].Z != 18 { - t.Errorf("Z should be 18, but is %v", tiles[0].Z) - } - tiles = getTilesForBoundingBox(bbox, 1, 17) - if len(tiles) != 17 { - t.Errorf("Should be 17 tiles, but is %v", len(tiles)) - } -} diff --git a/renderer/types.go b/renderer/types.go deleted file mode 100644 index 4d17687..0000000 --- a/renderer/types.go +++ /dev/null @@ -1,87 +0,0 @@ -package renderer - -import ( - "math" -) - -type Tile struct { - X, Y, Z uint32 -} - -// when all possible tiles including all smaller zoom levels are stored in a quadtree, this function will be used to get the index of a tile -func (tile Tile) index() uint64 { - // Calculate the total number of tiles for all zoom levels from 0 to tile.Z-1 - total := uint64(0) - for z := uint32(0); z < tile.Z; z++ { - total += uint64(math.Pow(4, float64(z))) - } - - // Calculate the position of the tile within its zoom level - levelPos := tile.Y*uint32(math.Pow(2, float64(tile.Z))) + tile.X - - return total + uint64(levelPos) -} - -// Returns the OSM tile one zoom level above that contains the given point -func (tile Tile) getParent() Tile { - return Tile{tile.X / 2, tile.Y / 2, tile.Z - 1} -} - -type Point struct { - Lon, Lat float64 -} - -type BoundingBox struct { - Min, Max Point -} - -type Pixel struct { - X, Y float64 -} - -// member function checks if a point is inside a bounding box -func (bbox BoundingBox) contains(point Point) bool { - return point.Lat >= bbox.Min.Lat && point.Lat <= bbox.Max.Lat && point.Lon >= bbox.Min.Lon && point.Lon <= bbox.Max.Lon -} - -func (bbox BoundingBox) overlaps(other BoundingBox) bool { - return bbox.Min.Lat <= other.Max.Lat && bbox.Max.Lat >= other.Min.Lat && bbox.Min.Lon <= other.Max.Lon && bbox.Max.Lon >= other.Min.Lon -} - -func (bbox BoundingBox) center() Point { - return Point{(bbox.Min.Lon + bbox.Max.Lon) / 2, (bbox.Min.Lat + bbox.Max.Lat) / 2} -} - -// Architecture: -// We have tiles. Each tile has a bounding box. -// Each tile has a list of map objects. -// Each map object has a bounding box. -// Each map object has a list of points. -// Each point has a longitude and a latitude. -// Each tile may have 4 children and 1 parent. -// Each tile has x, y, and z coordinates. -// Map objects are stored at the tile that contains their bounding box. -// As Tiles are stored on disk, we cannot reference them through pointers but by their index position. -// There is a quadtree for every zoom level. -// The quadtree stops dividing when there are 64 or less map objects in a tile. -type TileData struct { - X, Y, Z uint32 - Children [4]uint64 -} - -type MapObjectOffset uint64 - -type Data struct { - // ChatGPT has the idea to use a map of tiles as a sparse array. Not sure what the performance hit of that is. - // Then I could skip the whole fancy part of continuous memory layout and just have a map[Tile][] map. - // TODO: replace Tile with index - Tiles map[uint64]*[]MapObjectOffset - Filepath string - MaxPoints int -} - -type MapObject struct { - //The bounding box of the map object - BoundingBox BoundingBox - Points []Point -} diff --git a/renderer/types_test.go b/renderer/types_test.go deleted file mode 100644 index 34328a0..0000000 --- a/renderer/types_test.go +++ /dev/null @@ -1,21 +0,0 @@ -package renderer - -import "testing" - -func TestTileGetParent(t *testing.T) { - tile := Tile{ - X: 276643, - Y: 169357, - Z: 19, - } - parent := tile.getParent() - if parent.X != 138321 { - t.Errorf("X should be 138321, but is %v", parent.X) - } - if parent.Y != 84678 { - t.Errorf("Y should be 84678, but is %v", parent.Y) - } - if parent.Z != 18 { - t.Errorf("Z should be 18, but is %v", parent.Z) - } -}