Heim >Backend-Entwicklung >Golang >Wie füge ich PostGIS-Geometrietypen mit Gorm und EWKB ein und wähle sie aus?

Wie füge ich PostGIS-Geometrietypen mit Gorm und EWKB ein und wähle sie aus?

Barbara Streisand
Barbara StreisandOriginal
2024-11-05 22:43:02999Durchsuche

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

Einfügen und Auswählen von PostGIS-Geometrie mit Gorm

Problem:

In Go wird Gorm zum Einfügen und Abrufen von PostGIS-Geometrie verwendet Typen über die Orb-Bibliothek stellen aufgrund des automatischen Einfügens und Scannens von Daten durch Gorm eine Herausforderung dar. Das einfache Einfügen von Binärdaten in Geometriespalten reicht nicht aus, und die Abfrage gibt Hex-Ergebnisse zurück.

Lösung:

Die @robbieperry22-Antwort als Inspiration verwenden, ein Ansatz mit a Eine andere Codierungsbibliothek macht eine Bytemanipulation überflüssig.

Implementierung:

  1. Erstellen Sie benutzerdefinierte Scan()- und Value()-Methoden für den Geometrietyp, ähnlich wie:
<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. Definieren Sie eine Modellstruktur mit dem Geometriefeld:
<code class="go">type Track struct {
    gorm.Model
    GeometryPoint EWKBGeomPoint `gorm:"column:geom"`
}</code>
  1. Passen Sie die Tabellenerstellung an, um das standardmäßige Gorm-Verhalten für die Geometriespalte zu vermeiden:
<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>

Dieser Ansatz konvertiert nahtlos zwischen EWKB-Bytes und dem PostGIS-Geometrietyp und ermöglicht das Einfügen und Auswählen von Geometrien ohne zusätzliche Anpassung oder manuelle Abfragegenerierung.

Das obige ist der detaillierte Inhalt vonWie füge ich PostGIS-Geometrietypen mit Gorm und EWKB ein und wähle sie aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn