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 중국어 웹사이트의 기타 관련 기사를 참조하세요!