package geospatial import ( "fmt" ) // PostGISIntegrationImpl implements PostGISIntegration interface type PostGISIntegrationImpl struct { config *Config } // NewPostGISIntegration creates a new PostGIS integration helper func NewPostGISIntegration(config *Config) PostGISIntegration { return &PostGISIntegrationImpl{ config: config, } } // PointToPostGIS generates a PostGIS geometry string for a point func (pgi *PostGISIntegrationImpl) PointToPostGIS(point Point) string { return fmt.Sprintf("ST_GeogFromText('POINT(%f %f)')", point.Longitude, point.Latitude) } // BoundingBoxToPostGIS generates a PostGIS geometry string for a bounding box func (pgi *PostGISIntegrationImpl) BoundingBoxToPostGIS(bbox BoundingBox) string { // Create a POLYGON from bounding box return fmt.Sprintf( "ST_GeogFromText('POLYGON((%f %f, %f %f, %f %f, %f %f, %f %f))')", bbox.SouthWest.Longitude, bbox.SouthWest.Latitude, // Bottom-left bbox.NorthEast.Longitude, bbox.SouthWest.Latitude, // Bottom-right bbox.NorthEast.Longitude, bbox.NorthEast.Latitude, // Top-right bbox.SouthWest.Longitude, bbox.NorthEast.Latitude, // Top-left bbox.SouthWest.Longitude, bbox.SouthWest.Latitude, // Close polygon ) } // WithinRadiusQuery generates a PostGIS query for finding points within a radius func (pgi *PostGISIntegrationImpl) WithinRadiusQuery(center Point, radiusKm float64) (string, []interface{}) { radiusMeters := radiusKm * 1000 query := ` ST_DWithin( location_geometry::geography, ST_GeogFromText('POINT(? ?)'), ? ) ` args := []interface{}{center.Longitude, center.Latitude, radiusMeters} return query, args } // DistanceQuery generates a PostGIS query for calculating distance func (pgi *PostGISIntegrationImpl) DistanceQuery(p1, p2 Point) string { return fmt.Sprintf( "ST_Distance(%s::geography, %s::geography) / 1000", pgi.PointToPostGIS(p1), pgi.PointToPostGIS(p2), ) } // BearingQuery generates a PostGIS query for calculating bearing func (pgi *PostGISIntegrationImpl) BearingQuery(from, to Point) string { return fmt.Sprintf( "ST_Azimuth(%s, %s)", pgi.PointToPostGIS(from), pgi.PointToPostGIS(to), ) }