【问题标题】:What units does DbGeometry.Distance return?DbGeometry.Distance 返回什么单位?
【发布时间】:2014-03-04 22:36:06
【问题描述】:
MSDN documentation 只是将返回值定义为:
一个双精度值,指定两个最近的距离
此几何值和其他点中的点。
返回什么单位?测试时,这些值与我识别的任何内容都不匹配,并且在 WHERE 子句中不起作用。
var results = db.Locations.Where(t => t.ItemPoint.Distance(targetPoint) <= 100); // 100km
注意:我正在使用 .NET 连接器和实体框架一起使用 MySQL,它不支持使用 SRID 值。
【问题讨论】:
标签:
mysql
entity-framework
geometry
geospatial
【解决方案1】:
虽然 MSDN 文档可以提供更多信息,但它没有指定值的度量,因为它会根据 SRID(或缺少)而变化。
没有 SRID,Geometry 只能在平面网格(或平面)系统上运行(想想老式方形纸)。因此,您的距离答案是简单的毕达哥拉斯结果
a2 + b2 = c2 >>>>>> c = SqRt(a2 + b2).
例如:
using System.Data.Entity.Spatial;
DbGeometry geom1 = DbGeometry.FromText("POINT(0 0)");
DbGeometry geom2 = DbGeometry.FromText("POINT(50 50)");
Console.WriteLine(geom1.Distance(geom2));
//Returns 70.71067811 (the square root of (50 sq'd + 50 sq'd)).
您会发现这个blog 很有趣,跳到页面的一半,您会发现如何创建用户定义的半正弦计算方法,该方法允许您将结果转换为距离。
但请注意,如果您无法在 EF for MySQL 中映射存储过程,那么您将需要求助于老式的 ADO 来获得结果。确保您使用 st_distance 而不是 mbr_distance,因为 st_distance 将是准确的,而 mbr_distance 将包含误报。 st_distance 需要 MySQL 5.6.1。
最后,如果可能,如果空间数据很重要,请考虑使用另一个数据库。