给定一个经度和纬度值,是否可以找到指定距离内的所有经度和纬度?我有一个lat和long值的db表,它们是路灯的位置,给定一个lat long对,我怎么能找到所有在特定距离内的那些?
我猜想从起点画一个圆,找到包含的所有经度和纬度将是最好的方法,但是,我没有做到这一点的技能。我是从事贸易的C#开发人员,但在整个地理编码领域需要一些指导。
最佳答案
您可以使用Haversine公式(请参阅@tdammers答案)来计算表格中每个点(纬度,经度)与给定点之间的距离。您必须遍历整个集合才能分别评估每个点。
或者,如果您使用的是SQL Server 2008,则内置了地理空间支持。每条记录会将位置存储为一种地理类型(可能还包括两个用于保存纬度和经度的离散列,如果更容易将这些值分解掉的话),然后可以构造一个简单的SQL查询:
DECLARE @Point geography = 'POINT(-83.12345 45.12345)' -- Note: Long Lat ordering required when using WKT
SELECT *
FROM tblStreetLamps
WHERE location.STDistance(@point) < 1 * 1609.344 -- Note: 1 mile converted to meters
另一种类似的可能性是将SQL Spatial类型带入您的.NET应用程序。可在以下位置找到可重新分发的文件:http://www.microsoft.com/downloads/en/details.aspx?FamilyID=CEB4346F-657F-4D28-83F5-AAE0C5C83D52(在SQLServer®2008 R2的Microsoft®System CLR类型下)。
然后,可以通过LINQ进行查询。注意:这样可以避免您自己实现Haversine,否则查询过程将相同。
var yourLocation = SqlGeography.Point(Latitude, Longitude, 4326);
var query = from fac in FacilityList
let distance = SqlGeography
.Point(fac.Lat, fac.Lon, 4326)
.STDistance(yourLocation)
.Value
where distance < 1 * 1609.344
orderby distance
select fac;
return query.Distinct().ToList();
关于C#查找一英里内的所有经度和纬度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5312987/