从给定的点(lat,lng)按纬度和经度查找地址
Find address by latitude and longitude from a point (lat, lng) given
我有一个 table 结构(和数据),其中包含以下信息
[注:以下数据为样本数据,随机添加,如经纬度值在本样本数据中无效,敬请谅解。]
Id | FullAddress | Longitude | Latitude |
----------------------------------------
1 | 123 Test Ave, Toronto, ON, M1L3T8, Canada | 43.12345 | -72.2355 |
------------------------------------------
2 | 7 North Ave, Brampton, ON, L7A1T9, Canada | 40.12345 | -71.2745 |
------------------------------------------
5 | 10 South Dr., Toronto, ON, M4H1J4, Canada | 42.45375 | -73.2645 |
------------------------------------------
8 | 123A Ave Rd, Ajax, ON, M3K3Y9, Canada | 41.09775 | -74.2745 |
------------------------------------------
.
.
.
给出了一个带有经纬度的点。例如:(43.54567, -73.5433).
从这一点 ((43.54567, -73.5433)) 在 1 公里范围内(这可以是任何数字),我想使用 [=31= 从上面 table 中找到所有地址] 经纬度数据(给定点1KM范围内的所有地址)。
enter image description here
如果我们考虑上面的例子(来自图片),查询应该return Address with ID 1 (1 KM) and 3 (0.8 KM).
我正在使用 MS SQL 和 ASP.NET MVC。如果这样更容易,我可以使用 LINQ 命令查询数据库。
提前致谢。
如果您没有使用 SQL 中的 GEOGRAPHY 类型,您可以这样做
例子
Declare @BaseLat float = 43.54567
Declare @BaseLng float = -73.5433
Select *
From YourTable
Where [dbo].[udf-Geo-Meters](@BaseLat,@BaseLng,Latitude ,Longitude ) <=1000
UDF(如果需要)
CREATE Function [dbo].[udf-Geo-Meters](@Lat1 FLOAT, @Lng1 FLOAT, @Lat2 FLOAT, @Lng2 FLOAT)
Returns Float as
Begin
Return ACOS(SIN(PI()*@Lat1/180.0)*SIN(PI()*@Lat2/180.0)+COS(PI()*@Lat1/180.0)*COS(PI()*@Lat2/180.0)*COS(PI()*@Lng2/180.0-PI()*@Lng1/180.0)) * 6371008.8
-- 6.371 mean radius of earth in meters
End
您可以使用以下查询来查找给定范围内的地址,并按最近的顺序排序。您可以在 MapPoint in .Net.
阅读更多内容
DECLARE @CntXAxis FLOAT
DECLARE @CntYAxis FLOAT
DECLARE @CntZAxis FLOAT
SET @CntXAxis = COS(RADIANS(-118.4104684)) * COS(RADIANS(34.1030032))
SET @CntYAxis = COS(RADIANS(-118.4104684)) * SIN(RADIANS(34.1030032))
SET @CntZAxis = SIN(RADIANS(-118.4104684))
SELECT
50 *,
ProxDistance = 3961 * ACOS( dbo.XAxis(LAT, LONG)*@CntXAxis + dbo.YAxis(LAT, LONG)*@CntYAxis + dbo.ZAxis(LAT)*@CntZAxis)
FROM
tbl_ProviderLocation
WHERE
(3961 * ACOS( dbo.XAxis(LAT, LONG)*@CntXAxis + dbo.YAxis(LAT, LONG)*@CntYAxis + dbo.ZAxis(LAT)*@CntZAxis) <= 10)
ORDER BY
ProxDistance ASC
用户定义函数
CREATE FUNCTION [dbo].[XAxis] (@lat float, @lon float)
RETURNS float
AS
BEGIN
RETURN COS(4 * (4 * atn2(1, 5) - atn2(1, 239)) / 180 * @lat) * COS(4 * (4 * atn2(1, 5) - atn2(1, 239)) / 180 * @lon)
END
CREATE FUNCTION [dbo].[YAxis] (@lat float, @lon float)
RETURNS float AS
BEGIN
RETURN COS(4 * (4 * atn2(1,5) - atn2(1,239)) / 180 * @lat) * SIN(4 * (4 * atn2(1,5) - atn2(1,239)) / 180 * @lon)
END
CREATE FUNCTION [dbo].[ZAxis] (@lat float)
RETURNS float AS
BEGIN
RETURN SIN(4 * (4 * atn2(1,5) - atn2(1,239)) / 180 * @lat)
END
我有一个 table 结构(和数据),其中包含以下信息
[注:以下数据为样本数据,随机添加,如经纬度值在本样本数据中无效,敬请谅解。]
Id | FullAddress | Longitude | Latitude |
----------------------------------------
1 | 123 Test Ave, Toronto, ON, M1L3T8, Canada | 43.12345 | -72.2355 |
------------------------------------------
2 | 7 North Ave, Brampton, ON, L7A1T9, Canada | 40.12345 | -71.2745 |
------------------------------------------
5 | 10 South Dr., Toronto, ON, M4H1J4, Canada | 42.45375 | -73.2645 |
------------------------------------------
8 | 123A Ave Rd, Ajax, ON, M3K3Y9, Canada | 41.09775 | -74.2745 |
------------------------------------------
.
.
.
给出了一个带有经纬度的点。例如:(43.54567, -73.5433).
从这一点 ((43.54567, -73.5433)) 在 1 公里范围内(这可以是任何数字),我想使用 [=31= 从上面 table 中找到所有地址] 经纬度数据(给定点1KM范围内的所有地址)。
enter image description here
如果我们考虑上面的例子(来自图片),查询应该return Address with ID 1 (1 KM) and 3 (0.8 KM).
我正在使用 MS SQL 和 ASP.NET MVC。如果这样更容易,我可以使用 LINQ 命令查询数据库。
提前致谢。
如果您没有使用 SQL 中的 GEOGRAPHY 类型,您可以这样做
例子
Declare @BaseLat float = 43.54567
Declare @BaseLng float = -73.5433
Select *
From YourTable
Where [dbo].[udf-Geo-Meters](@BaseLat,@BaseLng,Latitude ,Longitude ) <=1000
UDF(如果需要)
CREATE Function [dbo].[udf-Geo-Meters](@Lat1 FLOAT, @Lng1 FLOAT, @Lat2 FLOAT, @Lng2 FLOAT)
Returns Float as
Begin
Return ACOS(SIN(PI()*@Lat1/180.0)*SIN(PI()*@Lat2/180.0)+COS(PI()*@Lat1/180.0)*COS(PI()*@Lat2/180.0)*COS(PI()*@Lng2/180.0-PI()*@Lng1/180.0)) * 6371008.8
-- 6.371 mean radius of earth in meters
End
您可以使用以下查询来查找给定范围内的地址,并按最近的顺序排序。您可以在 MapPoint in .Net.
阅读更多内容DECLARE @CntXAxis FLOAT
DECLARE @CntYAxis FLOAT
DECLARE @CntZAxis FLOAT
SET @CntXAxis = COS(RADIANS(-118.4104684)) * COS(RADIANS(34.1030032))
SET @CntYAxis = COS(RADIANS(-118.4104684)) * SIN(RADIANS(34.1030032))
SET @CntZAxis = SIN(RADIANS(-118.4104684))
SELECT
50 *,
ProxDistance = 3961 * ACOS( dbo.XAxis(LAT, LONG)*@CntXAxis + dbo.YAxis(LAT, LONG)*@CntYAxis + dbo.ZAxis(LAT)*@CntZAxis)
FROM
tbl_ProviderLocation
WHERE
(3961 * ACOS( dbo.XAxis(LAT, LONG)*@CntXAxis + dbo.YAxis(LAT, LONG)*@CntYAxis + dbo.ZAxis(LAT)*@CntZAxis) <= 10)
ORDER BY
ProxDistance ASC
用户定义函数
CREATE FUNCTION [dbo].[XAxis] (@lat float, @lon float)
RETURNS float
AS
BEGIN
RETURN COS(4 * (4 * atn2(1, 5) - atn2(1, 239)) / 180 * @lat) * COS(4 * (4 * atn2(1, 5) - atn2(1, 239)) / 180 * @lon)
END
CREATE FUNCTION [dbo].[YAxis] (@lat float, @lon float)
RETURNS float AS
BEGIN
RETURN COS(4 * (4 * atn2(1,5) - atn2(1,239)) / 180 * @lat) * SIN(4 * (4 * atn2(1,5) - atn2(1,239)) / 180 * @lon)
END
CREATE FUNCTION [dbo].[ZAxis] (@lat float)
RETURNS float AS
BEGIN
RETURN SIN(4 * (4 * atn2(1,5) - atn2(1,239)) / 180 * @lat)
END