usando orb y el escaneo de valor personalizado y mariscal
insertando y recuperando los tipos de geometría postgis con GUMM puede ser desafiante. Para abordar este problema, los usuarios pueden aprovechar la biblioteca ORB e implementar métodos de escaneo personalizado () y value () para convertir entre los tipos de GO y el formato binario conocido (WKB) esperado por Gorm. Aquí hay un ejemplo:
type EWKBGeomPoint geom.Point func (g *EWKBGeomPoint) Scan(input interface{}) error { gt, err := ewkb.Unmarshal(input.([]byte)) if err != nil { return err } g = gt.(*EWKBGeomPoint) return nil } func (g EWKBGeomPoint) Value() (driver.Value, error) { b := geom.Point(g) bp := &b ewkbPt := ewkb.Point{Point: bp.SetSRID(4326)} return ewkbPt.Value() }
implementando estos métodos en una estructura, el escaneo automatizado de Gormia e insertación de funciones puede funcionar sin problemas con los tipos de geometría.
La configuración de la tabla con migración personalizada
para crear la tabla con la columna de geometría necesaria. = db.exec (`Crear tabla si no existe pistas ( ID CLAVE PRIMARIA DE ID Geom Geometry (Point, 4326) No nula ); `) .Error si err! = nil { devolver err } err = gormigrate.new (db, gormigrate.defaultOptions, []*gormigrate.migration { { ID: "init", Error de migrado: func (tx *gorm.db) { regresar tx.createTable ( Tablas ..., ).Error }, }, { ID: "Tracks_except_geom", Error de migrado: func (tx *gorm.db) { return db.automigrate (Track {}). Error }, }, }).Emigrar()Esta migración garantiza que la columna de geometría se cree antes de que el resto de la estructura de la tabla esté configurado.
err = db.Exec(`CREATE TABLE IF NOT EXISTS tracks ( id SERIAL PRIMARY KEY, geom geometry(POINT, 4326) NOT NULL );`).Error if err != nil { return err } err = gormigrate.New(db, gormigrate.DefaultOptions, []*gormigrate.Migration{ { ID: "init", Migrate: func(tx *gorm.DB) error { return tx.CreateTable( Tables..., ).Error }, }, { ID: "tracks_except_geom", Migrate: func(tx *gorm.DB) error { return db.AutoMigrate(Track{}).Error }, }, }).Migrate()
ejemplo de uso
una vez que el escaneo personalizado (), value () y los pasos de migración se implementan, utilizando el tipo de geometría en un modelo de gorma se vuelve directo: gorm.modelo GeometryPoint EWKBGEOPTOINT `Gorm:" Columna: Geom "` }
Con esta configuración, Gorm puede insertar y seleccionar sin esfuerzo tipos de geometría de posgis, lo que permite un uso perfecto de datos geométricos en aplicaciones GO.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3