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

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

Barbara Streisand
Barbara Streisandoriginal
2024-11-05 22:43:02999parcourir

How to Insert and Select PostGIS Geometry Types with Gorm and EWKB?

Insertion et sélection de la géométrie PostGIS avec Gorm

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.

Implémentation :

  1. Créez des méthodes Scan() et Value() personnalisées pour le type de géométrie, similaires à :
<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>
  1. Définissez une structure de modèle avec le champ de géométrie :
<code class="go">type Track struct {
    gorm.Model
    GeometryPoint EWKBGeomPoint `gorm:"column:geom"`
}</code>
  1. Personnalisez la création de table pour éviter le comportement Gorm par défaut pour la colonne de géométrie :
<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!

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