点上圆(经度/纬度)在.NET / SQL
-
20-09-2019 - |
题
我有以下问题: 我与经度/纬度值的表和与项目-id和经度/纬度/半径(圆)另一个表。
现在我需要找出哪些项目长/纬度值从第一个表匹配。
有没有一种简单的方法来做到这一点?
解决方案
有多个算法来计算球面的距离,但我们使用以下内容:
create function GetDistance(
@latitudeFrom decimal(30,10),
@longitudeFrom decimal(30,10),
@latitudeTo decimal(30,10),
@longitudeTo decimal(30,10)
)
RETURNS float
AS
BEGIN
DECLARE @distance float
SET @distance = ROUND(6378.137 * ACOS(
convert(decimal(30,10),
(SIN(RADIANS(@latitudeFrom)) * SIN(RADIANS(@latitudeTo))) +
(COS(RADIANS(@latitudeFrom)) * COS(RADIANS(@latitudeTo)) *
COS(RADIANS(@longitudeTo) - RADIANS(@longitudeFrom))))), 15)
RETURN @distance
END
go
(其中,6378.137 - 是地球半径)
所以,现在当你可以在地球上计算2点之间的距离,你可以建立查询
select *
from Table1, Project
where dbo.GetDistance(
Table1.lat, Table1.lon,
Project.lat, Project.lon) < @YouRadius
其中@YouRadius - 你的圆的半径参数
其他提示
相对容易:计算点和所述圆的中心之间的大圆距离。如果距离小于半径,该点是在圈内,如果不是没有。如果它是在圆的周长,你决定。已经有上大圆距离计算几个SO讨论,看看他们。
要加快东西你可以考虑存储,每个圆圈,在纬度/长“广场”它的最小边界框的定义。这会为你提供必要做的点是否可能是一个圆圈内的快速检查的信息,仅计算距离时的点是MBB里面。
不隶属于 StackOverflow