package imaging import ( "image" "git.fjla.uk/fred.boniface/map-dots/data" "git.fjla.uk/fred.boniface/map-dots/log" "github.com/fogleman/gg" ) func mapCirclesToCanvas(img *image.RGBA, circles []data.LocationData) { log.Msg.Debug("Mapping circles to canvas") dc := gg.NewContextForRGBA(img) dc.SetRGB(1, 1, 1) // Set canvas background color (white in this case) circleRadius := 10 // Replace with your desired fixed radius bounds := img.Bounds() canvasWidth := bounds.Max.X - bounds.Min.X canvasHeight := bounds.Max.Y - bounds.Min.Y var minLat, maxLat, minLon, maxLon float64 for _, circle := range circles { if circle.Latitude < minLat { minLat = circle.Latitude } if circle.Latitude > maxLat { maxLat = circle.Latitude } if circle.Longitude < minLon { minLon = circle.Longitude } if circle.Longitude > maxLon { maxLon = circle.Longitude } } for _, circle := range circles { // Convert latitude and longitude to pixel position on the canvas pixelX, pixelY := convertCoordinatesToPixels(circle.Latitude, circle.Longitude, minLat, maxLat, minLon, maxLon, canvasWidth, canvasHeight) // Draw the circle on the canvas using gg dc.DrawCircle(float64(pixelX), float64(pixelY), float64(circleRadius)) dc.SetRGBA(1, 1, 1, 0.5) // Circle fill color (white with 50% opacity) dc.Fill() } dc.Clip() // Apply clipping // Optional: Save the canvas as an image file err := dc.SavePNG("output.png") if err != nil { // Handle error } } func convertCoordinatesToPixels(latitude, longitude float64, minLat, maxLat, minLon, maxLon float64, canvasWidth, canvasHeight int) (int, int) { // Calculate margins as a percentage of canvas dimensions marginPercentage := 0.1 // 10% margin marginWidth := int(float64(canvasWidth) * marginPercentage) marginHeight := int(float64(canvasHeight) * marginPercentage) // Adjust the bounding box with margins minLat -= (maxLat - minLat) * marginPercentage maxLat += (maxLat - minLat) * marginPercentage minLon -= (maxLon - minLon) * marginPercentage maxLon += (maxLon - minLon) * marginPercentage // Calculate the position within the adjusted bounding box latPercentage := (latitude - minLat) / (maxLat - minLat) lonPercentage := (longitude - minLon) / (maxLon - minLon) // Calculate the pixel positions on the canvas pixelX := int(lonPercentage*float64(canvasWidth-marginWidth*2)) + marginWidth pixelY := canvasHeight - (int(latPercentage*float64(canvasHeight-marginHeight*2)) + marginHeight) return pixelX, pixelY }