Heim >Backend-Entwicklung >Golang >Wie kann ich PostGIS-Geometrien mit Gorm in Golang einfügen und abrufen?

Wie kann ich PostGIS-Geometrien mit Gorm in Golang einfügen und abrufen?

Barbara Streisand
Barbara StreisandOriginal
2024-11-08 22:11:02668Durchsuche

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

Einfügen und Auswählen von PostGIS-Geometrie mit Gorm: Eine umfassende Anleitung

Mit Golang können Sie mühelos geometrische Typen über Gorm einfügen und abrufen beliebtes ORM. Dieser Leitfaden führt Sie durch den Prozess und nutzt die Orb-Bibliothek zum Definieren und Kodieren/Dekodieren von Geometrien.

Orb und Well-Known Binary (WKB) Format

Orb bietet die Methoden Scan() und Value(), sodass die Funktionen Insert() und Scan() von Gorm über Grundelemente hinaus funktionieren können. Orb erfordert Geometrien im WKB-Format. Daher verwenden wir beim Abfragen bzw. Einfügen die PostGIS-Funktionen ST_AsBinary() und ST_GeomFromWKB().

Herausforderungen mit Gorm

Gorm übernimmt automatisch das Einfügen von Werten und das Scannen von Daten Dies macht es schwierig, unsere benutzerdefinierten Funktionen anzuwenden. Das direkte Einfügen von Binärdaten schlägt fehl, während die Abfrage Ergebnisse im Hex-Format liefert.

Mögliche Lösungen

a. Ansichten:Das Erstellen von Ansichten, die die erforderlichen Funktionen automatisch anwenden, kann das Abfragen, aber nicht das Einfügen erleichtern.

b. Auslöser oder Regeln: Die Automatisierung von Funktionsaufrufen für ein-/ausgehende Daten über Auslöser oder Regeln könnte eine Lösung bieten, ist aber nicht universell anwendbar.

c. Benutzerdefiniertes Scannen von Datenmodellen: Das Scannen des gesamten Datenmodells und das programmgesteuerte Generieren von Abfragen ist ein möglicher Ansatz, aber nicht optimal.

Lösung mit GeoJSON-Kodierung

Eine effektive Alternative zu Orb besteht darin, die Geojson-Kodierungsbibliothek zu verwenden. Dieser Ansatz macht eine manuelle Byte-Manipulation überflüssig:

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>

Anpassung der Tabelleneinrichtung:

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

Mit diesen Modifikationen können Sie mit Gorm nahtlos geometrische Typen einfügen und extrahieren und so Ihre Go-Anwendungen mit Geodatenfunktionen ausstatten.

Das obige ist der detaillierte Inhalt vonWie kann ich PostGIS-Geometrien mit Gorm in Golang einfügen und abrufen?. 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