Heim >Backend-Entwicklung >Golang >Wie füge ich PostGIS-Geometrietypen mit Gorm und EWKB ein und wähle sie aus?
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.
<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>
<code class="go">type Track struct { gorm.Model GeometryPoint EWKBGeomPoint `gorm:"column:geom"` }</code>
<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!