我正在使用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窗口:
请注意,在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
属性(产生不正确的距离结果)是现货
我错过了什么吗?我做错了什么???
答案 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;