如何使用 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 中存储地理空间数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Go 中实现 PHP 函数 `die()`(或 `exit()`)?

Go 入门很简单:如何在 Go 中使用日志包

如何在 Go 中创建 WebSocket 应用程序

我的 Go 程序如何让所有 CPU 内核保持忙碌状态?

人们如何在 Go 中管理身份验证? [关闭]

sqlgo是啥意思,如何使用?