C#查找一英里内的所有纬度和经度

Posted

技术标签:

【中文标题】C#查找一英里内的所有纬度和经度【英文标题】:C# find all Latitude and Longitude within a mile 【发布时间】:2011-03-15 14:10:28 【问题描述】:

给定一个 lat 和 long 值,有没有办法找到指定距离内的所有 lat 和 long ?我有一个 lat 和 long 值的 db 表,它们是比方说路灯的位置,给定一个 lat long 对,我怎么能找到特定距离内的所有那些?

我想从起点画一个圆圈并找到包含的所有经纬度将是最好的方法,但是我没有这样做的技能。我是一名 c# 开发人员,但在整个地理编码世界中需要一些指导。

【问题讨论】:

纬度和经度是连续值,你不能在某个区域找到所有的,它们的数量是无限的。 你没有具体说,但我假设你有一个纬度/经度点列表?否则,任何距离 > 0 内都有无限个点... 您无法真正找到所有经纬度对;它们有无数个。但是,您可以根据纬度/经度对定义几何边界,然后确定给定的经度/纬度对 x,y 是否在该边界内。 你可以找到它们,你只是不能在有限的内存中列出它们。但是结果形状的数学表示或测试是次佳的。我不明白为什么这有理由投反对票。 我有一个纬度和经度值的数据库表,这些值是可以说路灯的位置,给定一个纬度长对,我怎么能找到特定距离内的所有那些。 【参考方案1】:

您可以使用 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(在 Microsoft® System CLR Types for SQL Server® 2008 R2 下)。

然后,可以通过 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();

【讨论】:

它是否适用于 sql server 2008(我的意思是 linq 查询)?【参考方案2】:

haversine formula 为您提供两个纬度/经度点之间的距离(以米为单位;转换为英里很简单)。从那里,您可能会找到相反的...

【讨论】:

【参考方案3】:

我回答这个问题有点晚了,但几年前我想出了一个技巧,可以对卫星视野做同样的事情。

在地球上有两个点,您可以准确地知道距您所在位置给定距离的每个点的纬度和经度。这些点是北极和南极。所以让我们把你想要的点放在北极。一海里外是纬度 90 度减去 1 分钟的经度圈,即北纬 90 – 1/60 度 = 89.9833 度,因为 1 弧分 = 1 海里。

现在您有了距离极点 1 英里、纬度为 89.9833 的经度轨迹,您实际上是在旋转地球,直到您想要的纬度/经度是极点所在的位置。这个过程被称为“地图格线的旋转”。一旦你考虑了方程式一段时间,这个数学就很简单了。我把它们埋在某个地方,所以我不能轻易地得到代码,但是这个过程和方程在 John Snyder 的书“地图投影:工作手册”中。您可以通过http://pubs.usgs.gov/pp/1395/report.pdf 免费获取 pdf。解释在第 29 - 32 页。

查克·甘茨

【讨论】:

【参考方案4】:

前段时间,我正在解决一个如何在路上获取 POI 的问题。我使用了四叉树,这意味着将整个区域递归地划分为单元格和子单元格。每个 POI 只属于一个小区。拥有这些单元格,您可以轻松地在单元格级别上进行高级计算,然后仅搜索具有交叉点的单元格。这是更多的游戏开发技术,但也可以在这里使用。以下是 Wiki 上的相关内容:

http://en.wikipedia.org/wiki/Quadtree

【讨论】:

假设您有一组点 P 存储在四叉树中。假设您有一个查询点 q,并且您希望在 P 中找到最接近 q 的 p。假设正确的 p 恰好位于划分 NW 和 NE 四叉树的线的西侧,而 q 恰好位于线的东侧。你怎么知道搜索一个 q 不是 的四边形来找到 p? 但这距离 Lucene 实现空间搜索的方式还不到一百万英里。它只是需要适应,见mhaller.de/archives/156-Spatial-search-with-Lucene.html 一个简单的c#四叉树实现在这里供参考:link

以上是关于C#查找一英里内的所有纬度和经度的主要内容,如果未能解决你的问题,请参考以下文章

从给定位置(经度、纬度)的 Y 半径内查找 X 的所有值

如何找到围绕某个位置 5 英里半径的一组纬度/经度对

性能 - 按纬度/经度查找特定距离内的所有点

检索给定区域 x 距离内的所有经纬度点

计算半径内的 100 英里

PHP SQL查询以查找纬度和经度的给定半径内的所有零售商