Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Memasukkan dan Mendapatkan Geometri PostGIS dengan Gorm di Golang?
Memasukkan dan Memilih Geometri PostGIS dengan Gorm: Panduan Komprehensif
Menggunakan Golang, anda boleh memasukkan dan mendapatkan semula jenis geometri dengan mudah melalui Gorm, a ORM yang popular. Panduan ini akan membimbing anda melalui proses, menggunakan perpustakaan bola untuk mentakrif dan mengekod/menyahkod geometri.
Format Orb dan Binari (WKB) yang Terkenal
Orb menawarkan kaedah Scan() dan Value(), membolehkan fungsi Gorm's Insert() dan Scan() berfungsi melangkaui primitif. Orb memerlukan geometri dalam format WKB. Oleh itu, kami menggunakan fungsi PostGIS ST_AsBinary() dan ST_GeomFromWKB() semasa membuat pertanyaan dan memasukkan, masing-masing.
Cabaran dengan Gorm
Gorm secara automatik mengendalikan sisipan nilai dan pengimbasan data , menjadikannya mencabar untuk menggunakan fungsi tersuai kami. Penyisipan terus data binari gagal, manakala pertanyaan menghasilkan keputusan dalam format heks.
Potensi Penyelesaian
a. Pandangan: Mencipta pandangan yang menggunakan fungsi yang diperlukan secara automatik boleh memudahkan pertanyaan, tetapi bukan sisipan.
b. Pencetus atau Peraturan: Fungsi mengautomasikan panggilan pada data masuk/keluar melalui pencetus atau peraturan boleh menawarkan penyelesaian tetapi tidak boleh digunakan secara universal.
c. Pengimbasan Model Data Tersuai: Mengimbas keseluruhan model data dan menjana pertanyaan secara pemrograman ialah pendekatan yang mungkin tetapi tidak optimum.
Penyelesaian dengan Pengekodan GeoJSON
Alternatif yang berkesan kepada Orb adalah menggunakan perpustakaan pengekodan geojson. Pendekatan ini menghapuskan keperluan untuk manipulasi bait manual:
Kod:
<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>
Penyesuaian Persediaan Jadual:
<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>
Dengan pengubahsuaian ini, anda boleh memasukkan dan mengekstrak jenis geometri dengan lancar menggunakan Gorm, memperkasakan aplikasi Go anda dengan keupayaan geospatial.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memasukkan dan Mendapatkan Geometri PostGIS dengan Gorm di Golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!