Problème :
Dans Go, utiliser Gorm pour insérer et récupérer la géométrie PostGIS Les types via la bibliothèque Orb posent des défis en raison de l'insertion automatique et de l'analyse des données de Gorm. Il ne suffit pas d'insérer simplement des données binaires dans des colonnes géométriques et l'interrogation renvoie des résultats hexadécimaux.
Solution :
En utilisant la réponse @robbieperry22 comme source d'inspiration, une approche avec un une bibliothèque d'encodage différente élimine le besoin de manipulation d'octets.
<code class="go">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() }</code>
<code class="go">type Track struct { gorm.Model GeometryPoint EWKBGeomPoint `gorm:"column:geom"` }</code>
<code class="go">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 } // Create table without geom column mig := gormigrate.New(db, gormigrate.DefaultOptions, []*gormigrate.Migration{ { ID: "tracks_except_geom", Migrate: func(tx *gorm.DB) error { return tx.AutoMigrate(Track{}).Error }, }, } mig.Migrate()</code>
Cette approche convertit de manière transparente entre les octets EWKB et le type de géométrie PostGIS, permettant l'insertion et la sélection de géométries sans personnalisation supplémentaire ni génération de requêtes manuelles.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!