Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm việc với dữ liệu không gian với Gorm và MySQL

Đây là một cách tiếp cận khác; sử dụng mã hóa nhị phân.

Theo doc này , MySQL lưu trữ các giá trị hình học bằng cách sử dụng 4 byte để biểu thị SRID (ID tham chiếu không gian) theo sau là biểu diễn WKB (Nhị phân nổi tiếng) của giá trị.

Vì vậy, một kiểu có thể sử dụng mã hóa WKB và thêm và xóa tiền tố bốn byte trong các hàm Value () và Scan (). Thư viện go-geom được tìm thấy trong các câu trả lời khác có gói mã hóa WKB, github.com/twpayne/go-geom/encoding/wkb.

Ví dụ:

type MyPoint struct {
    Point wkb.Point
}

func (m *MyPoint) Value() (driver.Value, error) {
    value, err := m.Point.Value()
    if err != nil {
        return nil, err
    }

    buf, ok := value.([]byte)
    if !ok {
        return nil, fmt.Errorf("did not convert value: expected []byte, but was %T", value)
    }

    mysqlEncoding := make([]byte, 4)
    binary.LittleEndian.PutUint32(mysqlEncoding, 4326)
    mysqlEncoding = append(mysqlEncoding, buf...)

    return mysqlEncoding, err
}

func (m *MyPoint) Scan(src interface{}) error {
    if src == nil {
        return nil
    }

    mysqlEncoding, ok := src.([]byte)
    if !ok {
        return fmt.Errorf("did not scan: expected []byte but was %T", src)
    }

    var srid uint32 = binary.LittleEndian.Uint32(mysqlEncoding[0:4])

    err := m.Point.Scan(mysqlEncoding[4:])

    m.Point.SetSRID(int(srid))

    return err
}

Xác định Thẻ bằng kiểu MyPoint:

type Tag struct {
    Name string   `gorm:"type:varchar(50);primary_key"`
    Loc  *MyPoint `gorm:"column:loc"`
}

func (t Tag) String() string {
    return fmt.Sprintf("%s @ Point(%f, %f)", t.Name, t.Loc.Point.Coords().X(), t.Loc.Point.Coords().Y())
}

Tạo thẻ bằng cách sử dụng loại:

tag := &Tag{
    Name: "London",
    Loc: &MyPoint{
        wkb.Point{
            geom.NewPoint(geom.XY).MustSetCoords([]float64{0.1275, 51.50722}).SetSRID(4326),
        },
    },
}

err = db.Create(&tag).Error
if err != nil {
    log.Fatalf("create: %v", err)
}

Kết quả MySQL:

mysql> describe tag;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name  | varchar(50) | NO   | PRI | NULL    |       |
| loc   | geometry    | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+


mysql> select name, st_astext(loc) from tag;
+--------+------------------------+
| name   | st_astext(loc)         |
+--------+------------------------+
| London | POINT(0.1275 51.50722) |
+--------+------------------------+
  • ( ArcGIS cho biết 4326 là tham chiếu không gian phổ biến nhất để lưu trữ dữ liệu tham chiếu trên toàn thế giới. Nó đóng vai trò là mặc định cho cả cơ sở dữ liệu không gian PostGIS và tiêu chuẩn GeoJSON. Nó cũng được sử dụng theo mặc định trong hầu hết các thư viện lập bản đồ web.)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn MySQL trở nên hoang dã?

  2. MySQL gặp sự cố (Một số con trỏ có thể không hợp lệ và khiến kết xuất bị hủy bỏ)

  3. hiển thị dữ liệu trong một hàng (từ nhiều hàng)

  4. Sao chép hàng nhưng với id mới

  5. Hàm PHP &MySQL xóa các danh mục chưa được chọn khỏi sự cố cơ sở dữ liệu