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