initial commit
This commit is contained in:
43
internal/database/geography.go
Normal file
43
internal/database/geography.go
Normal file
@@ -0,0 +1,43 @@
|
||||
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,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user