>백엔드 개발 >Golang >Gorm 및 EWKB를 사용하여 PostGIS 기하학 유형을 삽입하고 선택하는 방법은 무엇입니까?

Gorm 및 EWKB를 사용하여 PostGIS 기하학 유형을 삽입하고 선택하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-05 22:43:02999검색

How to Insert and Select PostGIS Geometry Types with Gorm and EWKB?

Gorm을 사용하여 PostGIS 기하학 삽입 및 선택

문제:

Go에서 Gorm을 사용하여 PostGIS 기하학을 삽입하고 검색합니다. Orb 라이브러리를 통한 유형은 Gorm의 자동 삽입 및 데이터 검색으로 인해 문제가 발생합니다. 단순히 이진 데이터를 도형 열에 삽입하는 것만으로는 충분하지 않으며 쿼리하면 16진수 결과가 반환됩니다.

해결책:

@robbieperry22 답변을 영감으로 사용하여 다른 인코딩 라이브러리를 사용하면 바이트 조작이 필요하지 않습니다.

구현:

  1. 다음과 유사한 기하학 유형에 대한 사용자 정의 Scan() 및 Value() 메서드를 만듭니다.
<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>
  1. 기하학 필드로 모델 구조체 정의:
<code class="go">type Track struct {
    gorm.Model
    GeometryPoint EWKBGeomPoint `gorm:"column:geom"`
}</code>
  1. 기하학 열에 대한 기본 Gorm 동작을 방지하기 위해 테이블 ​​생성 사용자 정의:
<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>

이 접근 방식은 EWKB 바이트와 PostGIS 도형 유형 간에 원활하게 변환하므로 추가 사용자 정의나 수동 쿼리 생성 없이 도형 삽입 및 선택이 가능합니다.

위 내용은 Gorm 및 EWKB를 사용하여 PostGIS 기하학 유형을 삽입하고 선택하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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