>  기사  >  백엔드 개발  >  Golang에서 Gorm을 사용하여 PostGIS 도형을 어떻게 삽입하고 검색할 수 있나요?

Golang에서 Gorm을 사용하여 PostGIS 도형을 어떻게 삽입하고 검색할 수 있나요?

Barbara Streisand
Barbara Streisand원래의
2024-11-08 22:11:02664검색

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

Gorm을 사용한 PostGIS 기하학 삽입 및 선택: 종합 가이드

Golang을 사용하면 Gorm을 통해 기하학 유형을 쉽게 삽입하고 검색할 수 있습니다. 인기있는 ORM. 이 가이드는 기하학을 정의하고 인코딩/디코딩하기 위해 Orb 라이브러리를 활용하는 프로세스를 안내합니다.

Orb 및 Well-Known Binary(WKB) 형식

Orb Scan() 및 Value() 메서드를 제공하여 Gorm의 Insert() 및 Scan() 함수가 기본 형식 이상으로 작동할 수 있도록 합니다. Orb에는 WKB 형식의 기하학이 필요합니다. 따라서 쿼리 및 삽입 중에 각각 PostGIS 함수 ST_AsBinary() 및 ST_GeomFromWKB()를 사용합니다.

Gorm의 문제점

Gorm은 자동으로 값 삽입과 데이터 스캔을 처리합니다. , 사용자 정의 기능을 적용하기가 어렵습니다. 바이너리 데이터를 직접 삽입하면 실패하고 쿼리하면 16진수 형식의 결과가 나옵니다.

잠재적 솔루션

a. 보기: 필요한 기능을 자동으로 적용하는 보기를 생성하면 쿼리가 용이할 수 있지만 삽입은 불가능합니다.

b. 트리거 또는 규칙: 트리거 또는 규칙을 통해 들어오고 나가는 데이터에 대한 함수 호출을 자동화하면 솔루션을 제공할 수 있지만 보편적으로 적용할 수는 없습니다.

c. 사용자 정의 데이터 모델 검색: 전체 데이터 모델을 검색하고 프로그래밍 방식으로 쿼리를 생성하는 것은 가능한 접근 방식이지만 차선책입니다.

GeoJSON 인코딩을 사용한 솔루션

효과적인 대안 Orb는 geojson 인코딩 라이브러리를 사용하는 것입니다. 이 접근 방식을 사용하면 수동 바이트 조작이 필요하지 않습니다.

코드:

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

테이블 설정 사용자 정의:

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

이러한 수정을 통해 Gorm을 사용하여 기하학적 유형을 원활하게 삽입 및 추출할 수 있으며, 지리공간 기능을 제공합니다.

위 내용은 Golang에서 Gorm을 사용하여 PostGIS 도형을 어떻게 삽입하고 검색할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.