gpt4 book ai didi

mongodb - Query.Near 的 maxDistance 参数不起作用

转载 作者:可可西里 更新时间:2023-11-01 09:58:30 25 4
gpt4 key购买 nike

我正在使用 MongoDB 的 C# 驱动程序,并试图让 Query.Near 返回中心点 5、10、25 或 50 英里范围内的待售房屋。这是查询:

var near = Query.Near("Coordinates", coordinates.Latitude, coordinates.Longitude, find.GetRadiansAway(), false);
//var near = Query.WithinCircle("Coordinates", coordinates.Latitude, coordinates.Longitude, find.GetRadiansAway(), false);
var query = Collection().Find(near);
query.Limit = 1000;
var listings = query.ToList();

我将英里半径除以 62.1868289 以获得弧度并将其输入到查询中,但是无论我传入的弧度值是多少,它都会返回相同数量的待售房屋。我还尝试同时设置球形参数为 true 并使用 Query.WithinCircle,但是两者都没有更好的效果。

我使用的是最新的 C# 驱动程序 (1.0.0.4098),这是 C# 驱动程序中的错误、MongoDB 中的错误,还是我在这里遗漏了什么?

下面是查询的样子:

5英里(近):

db.Listing.find({ "Coordinates" : { "$near" : [39.4812172, -76.6438598], "$maxDistance" : 0.072463768115942032 } });

10英里远(近):

db.Listing.find({ "Coordinates" : { "$near" : [39.4812172, -76.6438598], "$maxDistance" : 0.14492753623188406 } });

5 英里远(近球形):

db.Listing.find({ "Coordinates" : { "$nearSphere" : [39.4812172, -76.6438598], "$maxDistance" : 0.0012629451881788331 } });

10 英里远(近球形):

db.Listing.find({ "Coordinates" : { "$nearSphere" : [39.4812172, -76.6438598], "$maxDistance" : 0.0025258903763576662 } });

这是我的测试用例,无论我在 5 英里外还是 25 英里外通过,它都会返回相同数量的结果:

[Test]
public void NearTest()
{
var isSpherical = true;
var latitude = 39.4812172;
var longitude = -76.6438598;
var milesAway = 5;
var distance = milesAway / (isSpherical ? 3959.0 : 69.0);

//search within 5 miles.
var near = Query.Near("Coordinates", latitude, longitude, distance, isSpherical);
var collection = ContextWorker.Database.GetCollection<Schemas.Listing.Listing>("Listing");
var query = collection.Find(near);
query.Limit = 1000;
var listings = query.ToList();
var count1 = listings.Count;
//Console.WriteLine("query: {0}", query.ToJson());
Console.WriteLine(count1 + " results returned that are " + milesAway + " miles away");

//search within 25 miles.
milesAway = 25;
distance = milesAway / (isSpherical ? 3959.0 : 69.0);
near = Query.Near("Coordinates", latitude, longitude, distance, isSpherical);
query = collection.Find(near);
query.Limit = 1000;
listings = query.ToList();
var count2 = listings.Count;
//Console.WriteLine("query: {0}", query.ToJson());
Console.WriteLine(count2 + " results returned that are " + milesAway + " miles away");

//values should be different.
Assert.AreNotEqual(count1, count2, "Returned same results for 5 and 25 miles away");
}

172 results returned that are 5 miles away
172 results returned that are 25 miles away
Test 'Housters.Test.SearchTest.NearTest' failed:
Returned same results for 5 and 25 miles away
Expected: not 172
But was: 172
SearchTest.cs(68,0): at Housters.Test.SearchTest.NearTest()

最佳答案

这里有一堆问题:

  1. 几乎所有 Mongo 地理空间查询都首先采用 x 坐标(经度)。
  2. 当您不使用球形查询时,Mongo 仅计算简单的笛卡尔距离,您需要传递的距离与您的坐标采用相同的单位(可能是十进制度)。
  3. 如果您确实使用了球形查询(附近或内部),您确实需要以弧度为单位指定距离,但要将英里转换为弧度,您需要除以更大的弧度数大于 62.1868289。您可以通过除以地球半径(约 3,959 英里)将弧度转换为英里。

您在上面执行的转换实际上更接近从英里到度的转换(将以英里为单位的距离除以大约 69)。

关于mongodb - Query.Near 的 maxDistance 参数不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6025309/

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