79 lines
2.5 KiB
Go
79 lines
2.5 KiB
Go
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
|
|
}
|