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
Libérer: 2024-11-05 22:43:02
original
1017 Les gens l'ont consulté

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>
Copier après la connexion
  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>
Copier après la connexion
  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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal