Heim > Artikel > Backend-Entwicklung > Wie kann ich PostGIS-Geometrien mit Gorm in Golang einfügen und abrufen?
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!