数据地理距离计算的误算

时间:2014-02-18 21:09:24

标签: sql sql-server azure azure-sql-database

我正在使用EF和MSSQL DB,我正在努力解决空间查询问题: 我使用用户位置来搜索按距离排序的餐馆,这里是代码:

DbGeography userLocation = DbGeography.FromText(userLocationWKT, 4326);
            return (from branch in DbContext.Branches
                    let distance = userLocation.Distance(branch.Location)
                    orderby distance ascending
                    where branch.Name.ToLower().Contains(searchString.ToLower()) && branch.Location != null
                    select new BranchAndDistance { Branch = branch, Distance = distance }).ToList();

用户位置WKT为POINT (32.78786115814 35.0162102747709)。在我的测试用例中,我发送一个查询,返回一个餐馆Lat=32.1300848 & Long=34.7919443但是我得到的距离是370237米,这是远离的。

下一张图片显示了餐馆位置详细信息的QuickWatch窗口: enter image description here 请注意,在ProviderValue文本中,它显示POINT (34.7919443 32.1300848),就好像它替换了Lat和Long,但实际值似乎没问题 所以我进行了一些测试,因为我将lat和long值保存在单独的变量中,我可以测试以下内容:

double? distance = Branch.Location.Distance(userLocation);
DbGeography branchLocation = DbGeography.FromText(string.Format("POINT ({0} {1})",
                                Branch.Latitude,.Branch.Longitude), 4326);
double? distance2 = branchLocation.Distance(userLocation);

distance变量具有相同的错误距离值370237.85926851362 但distance2变量带的正确距离值为65061.945208184392 怎么会这样? 我还检查了SQL Azure数据库管理,并根据Location属性(产生不正确的距离结果)是现货 when checking in SQL Azure it shows the correct location

我错过了什么吗?我做错了什么???

1 个答案:

答案 0 :(得分:0)

您的用户的WKT并非您认为的那样。具体而言,这是具有(纬度,经度)=(35.0162102747709,32.78786115814)的点。这是一个小T-SQL来显示:

DECLARE @g geography;
SELECT @g = geography::STPointFromText('POINT (32.78786115814 35.0162102747709)', 4326);

SELECT @g.Lat, @g.Long;