Maison  >  Article  >  développement back-end  >  Comment puis-je insérer et sélectionner des types de géométrie PostGIS avec Gorm ?

Comment puis-je insérer et sélectionner des types de géométrie PostGIS avec Gorm ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-05 10:50:02242parcourir

How can I insert and select PostGIS geometry types with Gorm?

Insérer et sélectionner une géométrie PostGIS avec Gorm

Utiliser l'analyse et le regroupement d'orbes et de valeurs personnalisées

Insérer et récupérer la géométrie PostGIS les types avec Gorm peuvent être difficiles. Pour résoudre ce problème, les utilisateurs peuvent exploiter la bibliothèque Orb et implémenter les méthodes Scan() et Value() personnalisées pour convertir entre les types Go et le format binaire bien connu (WKB) attendu par Gorm. Voici un exemple :

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()
}

En implémentant ces méthodes dans une structure, les fonctions automatisées d'analyse et d'insertion de Gorm peuvent fonctionner de manière transparente avec les types de géométrie.

Configuration de table avec migration personnalisée

Pour créer la table avec la colonne géométrique nécessaire, une étape de migration personnalisée peut être utilisée pour configurer le type de colonne :

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()

Cette migration garantit que la colonne géométrique est créée avant le reste de la structure de la table est configurée.

Exemple d'utilisation

Une fois les étapes personnalisées Scan(), Value() et de migration implémentées, en utilisant le type de géométrie dans un modèle Gorm devient simple :

type Track struct {
    gorm.Model

    GeometryPoint EWKBGeomPoint `gorm:"column:geom"`
}

Avec cette configuration, Gorm peut facilement insérer et sélectionner des types de géométrie PostGIS, permettant une utilisation transparente des données géométriques dans les applications Go.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn