gpt4 book ai didi

mongodb - 如何使用 Mongoid 执行 $geoIntersects 查询?

转载 作者:IT老高 更新时间:2023-10-28 13:34:03 24 4
gpt4 key购买 nike

我正在使用 Sinatra 和 mongoid 驱动程序,现在我正在尝试在 mongoid 中执行此查询,实际上我有一个名为 'geometry 的地理空间(多边形)字段':

db.states.find({
geometry: {
$geoIntersects: {
$geometry: {
type: "Point",
coordinates: [-99.176524, 18.929204]
}
}
}
})

其实这个查询是在 mongodb shell 中工作的。

但是,我想找到与给定点(Point-in-polygon)与 mongoid 或其他 ruby​​ 驱动程序相交的状态。

任何帮助将不胜感激。

谢谢。

最佳答案

我最近正在寻找这个,过了一段时间我发现了以下内容。也许其他人会对此有用..

$geoIntersects 现在在 mongoid 4.0.0.beta1 中实现,但没有很好的记录。我在原始更改日志中找到了这个:https://github.com/mongoid/origin/blob/master/CHANGELOG.md#new-features-1

query.geo_spacial(:location.intersects_line => [[ 1, 10 ], [ 2, 10 ]])
query.geo_spacial(:location.intersects_point => [[ 1, 10 ]])
query.geo_spacial(:location.intersects_polygon => [[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]])
query.geo_spacial(:location.within_polygon => [[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]])

和一个提交:https://github.com/mongoid/origin/commit/30938fad644f17fe38f62cf90571b78783b900d8

 # Add a $geoIntersects selection. Symbol operators must be used as shown in
# the examples to expand the criteria.
#
# @note The only valid geometry shapes for a $geoIntersects are: :line,
# :point, and :polygon.
# ...
# @example Add a geo intersect criterion for a point.
# query.geo_intersects(:location.point => [[ 1, 10 ]])

在我的项目中,我有 mongoid (4.0.0.beta1) 和 origin (2.1.0)我有一个模型多边形

class Polygon
include Mongoid::Document
# some fields

embeds_many :loc

# coordinates is an array of two points: [10, 12]
def find_polygons_with_point(coordinates)
# This is where the magic happens!
Polygon.all.geo_spacial(:loc.intersects_point => coordinates)
end

end

还有一个模型 Loc

class Loc
field :type, type: String #Need to be set to 'Polygon' when creating a new location.
field :coordinates, type: Array
# For some reason the array has to be in the format
# [ [ [1,1], [2,3], [5,3], [1,1] ] ]
# And the first coordinate needs to be the same as the last
# to close the polygon

embedded_in :polygon

index({ coordinates: "2d" }, { min: -200, max: 200 }) #may not need min/max
end

此代码返回包含该点的所有多边形。

可能有更优雅的方式来做到这一点。如果是这样,我想听听:)

关于mongodb - 如何使用 Mongoid 执行 $geoIntersects 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15558198/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com