Maison > développement back-end > Golang > le corps du texte

Comment puis-je insérer et récupérer des géométries PostGIS avec Gorm dans Golang ?

Barbara Streisand
Libérer: 2024-11-08 22:11:02
original
650 Les gens l'ont consulté

How Can I Insert and Retrieve PostGIS Geometries with Gorm in Golang?

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

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

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!

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