Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Memasukkan dan Mendapatkan Geometri PostGIS dengan Gorm di Golang?

Bagaimanakah Saya Boleh Memasukkan dan Mendapatkan Geometri PostGIS dengan Gorm di Golang?

Barbara Streisand
Barbara Streisandasal
2024-11-08 22:11:02710semak imbas

How Can I Insert and Retrieve PostGIS Geometries with Gorm in 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn