package database import ( "database/sql/driver" "fmt" ) // GeographyPoint представляет PostGIS GEOGRAPHY(POINT) в WGS84 // Для Sprint 1 мы используем ST_X() и ST_Y() в SELECT запросах, // поэтому этот тип используется только для INSERT операций type GeographyPoint struct { Longitude float64 Latitude float64 Valid bool } func (g *GeographyPoint) Scan(value interface{}) error { if value == nil { g.Valid = false return nil } // В Sprint 1 мы не используем Scan, так как извлекаем координаты через ST_X/ST_Y // Для production: использовать github.com/twpayne/go-geom для полноценного парсинга return fmt.Errorf("GeographyPoint.Scan not implemented - use ST_X/ST_Y in queries") } // Value реализует driver.Valuer для использования в INSERT/UPDATE запросах func (g GeographyPoint) Value() (driver.Value, error) { if !g.Valid { return nil, nil } // Возвращаем WKT формат с SRID для PostGIS return fmt.Sprintf("SRID=4326;POINT(%f %f)", g.Longitude, g.Latitude), nil } // NewGeographyPoint создает новую точку с координатами func NewGeographyPoint(lon, lat float64) *GeographyPoint { return &GeographyPoint{ Longitude: lon, Latitude: lat, Valid: true, } }