Insérer et sélectionner une géométrie PostGIS avec Gorm : un guide complet
En utilisant Golang, vous pouvez facilement insérer et récupérer des types géométriques via Gorm, un ORM populaire. Ce guide vous guidera tout au long du processus, en utilisant la bibliothèque orb pour définir et encoder/décoder des géométries.
Format Orb et binaire bien connu (WKB)
Orb propose les méthodes Scan() et Value(), permettant aux fonctions Insert() et Scan() de Gorm de fonctionner au-delà des primitives. Orb nécessite des géométries au format WKB. Par conséquent, nous utilisons les fonctions PostGIS ST_AsBinary() et ST_GeomFromWKB() lors de l'interrogation et de l'insertion, respectivement.
Défis avec Gorm
Gorm gère automatiquement l'insertion de valeurs et l'analyse des données. , ce qui rend difficile l'application de nos fonctions personnalisées. L'insertion directe de données binaires échoue, tandis que l'interrogation donne des résultats au format hexadécimal.
Solutions potentielles
a. Vues : La création de vues qui appliquent automatiquement les fonctions requises peut faciliter l'interrogation, mais pas l'insertion.
b. Déclencheurs ou règles :L'automatisation des appels de fonction sur les données entrantes/sortantes via des déclencheurs ou des règles pourrait offrir une solution mais n'est pas universellement applicable.
c. Analyse de modèle de données personnalisé : L'analyse de l'intégralité du modèle de données et la génération de requêtes par programme sont une approche possible mais sous-optimale.
Solution avec encodage GeoJSON
Une alternative efficace vers Orb consiste à utiliser la bibliothèque de codage geojson. Cette approche élimine le besoin de manipulation manuelle des octets :
Code :
<code class="go">import "github.com/twpayne/go-geom/encoding/geojson" 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() } type Track struct { gorm.Model GeometryPoint EWKBGeomPoint `gorm:"column:geom"` }</code>
Personnalisation de la configuration de la table :
<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 } 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()</code>
Avec ces modifications, vous pouvez insérer et extraire de manière transparente des types géométriques à l'aide de Gorm, dotant ainsi vos applications Go de capacités géospatiales.
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!