Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

Gorm और MySQL के साथ स्थानिक डेटा के साथ कार्य करना

यहाँ एक और दृष्टिकोण है; बाइनरी एन्कोडिंग का उपयोग करें।

इसके अनुसार doc , MySQL SRID (स्थानिक संदर्भ आईडी) को इंगित करने के लिए 4 बाइट्स का उपयोग करके ज्यामिति मानों को संग्रहीत करता है और उसके बाद WKB (अच्छी तरह से ज्ञात बाइनरी) मूल्य का प्रतिनिधित्व करता है।

तो एक प्रकार WKB एन्कोडिंग का उपयोग कर सकता है और Value() और Scan() फ़ंक्शंस में चार बाइट उपसर्ग जोड़ और हटा सकता है। अन्य उत्तरों में मिली गो-जियोम लाइब्रेरी में WKB एन्कोडिंग पैकेज है, github.com/twpayne/go-geom/encoding/wkb ।

उदाहरण के लिए:

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
}

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())
}

प्रकार का उपयोग करके एक टैग बनाना:

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

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 कहते हैं 4326 पूरी दुनिया में एक संदर्भ डेटा संग्रहीत करने के लिए सबसे आम स्थानिक संदर्भ है। यह PostGIS स्थानिक डेटाबेस और GeoJSON मानक दोनों के लिए डिफ़ॉल्ट के रूप में कार्य करता है। अधिकांश वेब मैपिंग लाइब्रेरी में डिफ़ॉल्ट रूप से इसका उपयोग किया जाता है।)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. बैश से mysql प्रश्नों को कैसे फीड करें

  2. PHP एक HTML फॉर्म से mysql में रिकॉर्ड की एक चर संख्या डालें

  3. mySQL:सरणी के लिए सबक्वायरी?

  4. सीक्वल प्रो का उपयोग करके आयात के दौरान एक स्ट्रिंग को एक तिथि में कैसे बदलें?

  5. क्या MySQL IN क्लॉज सबक्वेरी को कई बार निष्पादित करता है?