如何使用 Go 驱动程序或 mgo/qmgo 在 MongoDB 中存储地理空间数据?
Posted
技术标签:
【中文标题】如何使用 Go 驱动程序或 mgo/qmgo 在 MongoDB 中存储地理空间数据?【英文标题】:How to store geo-spatial data in MongoDB with Go driver or mgo/qmgo? 【发布时间】:2021-11-18 18:11:01 【问题描述】:我在 Go 中使用 MongoDB driver 和 mgo-forked qmgo 来操作 MongoDB(版本 5.x)。
我有一些地理空间数据要存储和查询,搜索了一些文章,有人提到创建自定义结构GeoJSON
,其他人说另一个自定义结构,但这不是官方的方式,也不一致。
是否有任何适当的方法可以使用 Go 包存储和查询此类数据?
【问题讨论】:
【参考方案1】:假设您要使用地理质量查询此数据 Mongo docs 请指定此
要在类地球体上计算几何,请将您的位置数据存储为 GeoJSON 对象。
基本上你要保存的结构应该符合空间索引的要求,所以应该是这样的结构:
<field>: type: <GeoJSON type> , coordinates: <coordinates>
【讨论】:
但是如何在 Go 中做到这一点?官方手册或第三方包未提及或提供 GeoJSON 类型的数据结构。【参考方案2】:GeoJSON 是一个在 Go 中处理的复杂对象,因为它会根据特定类型而变化,可能是:
点 线串 多边形 多点 多行字符串 多多边形 几何集合
每个都有自己的实现,看看GeoJSON Objects
一些实现:
type Point struct
Type string `json:"type"`
Coordinates []float64 `json:"coordinates"`
type LineStringAndMultipoint struct
Type string `json:"type"`
Coordinates [][]float64`json:"coordinates"`
type Polygon struct
Type string `json:"type"`
Coordinates [][][]float64 `json:"coordinates"`
// Alternatively you could create a all-in-one struct using interface as Coordinates
type GeoJSON struct
Type string `json:"type"`
Coordinates interface `json:"coordinates"`
一些使用它的例子:
(示例)[https://gist.github.com/Lebski/8f9b5992fec0bf175285f1c13b1e5051]
insertResult, err := PointCollection.InsertOne(context.TODO(), GeoJSONType: "Point", []float64lat, long)
if err != nil
log.Fatal("Could not insert new Point")
log.Infof("Inserted new Point. Id: %s\n", insertResult.InsertedID)
【讨论】:
以上是关于如何使用 Go 驱动程序或 mgo/qmgo 在 MongoDB 中存储地理空间数据?的主要内容,如果未能解决你的问题,请参考以下文章