我已经给出了一个由纬度和经度定义的位置。现在我想计算一个边界框,例如那个点的 500 米。
边界框应定义为latmin
、lngmin
和latmax
、lngmax
。
我的数据库有将近 152.000 条记录(对象的位置由经纬度定义),如果用户在搜索栏中输入特定对象(按名称搜索),我应该找到特定半径的对象,例如500米以内。
例如这是一条记录:Latitude = 41.72213058512578,Longitude = 44.77684020996094,Name = company1
如果我找到latmin
, lngmin
和latmax
, lngmax
如何查询数据库?我想在 C# 中实现这一点。
最佳答案
研究 Haversine 公式。
在您的应用程序或数据库中的存储过程中创建此查询。它将返回给定半径内给定 latpoint 和 longpoint 的 15 个最近位置。半径现在设置为 50,您可以随意更改。
SELECT z.zip,
z.primary_city,
z.latitude, z.longitude,
p.distance_unit
* DEGREES(ACOS(COS(RADIANS(p.latpoint))
* COS(RADIANS(z.latitude))
* COS(RADIANS(p.longpoint) - RADIANS(z.longitude))
+ SIN(RADIANS(p.latpoint))
* SIN(RADIANS(z.latitude)))) AS distance_in_meters
FROM zip AS z
JOIN ( /* these are the query parameters */
SELECT 42.81 AS latpoint, -70.81 AS longpoint,
50.0 AS radius, 111054.0 AS distance_unit
) AS p ON 1=1
WHERE z.latitude
BETWEEN p.latpoint - (p.radius / p.distance_unit)
AND p.latpoint + (p.radius / p.distance_unit)
AND z.longitude
BETWEEN p.longpoint - (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
AND p.longpoint + (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
ORDER BY distance_in_meters
LIMIT 15
将 distance_in_miles 的 111054.0 更改为 69.0
在您的 C# 应用程序中调用存储过程并从列表中的查询中获取数据。
private List<DataModel> getData(double latitude, double longitude, int radius)
{
SqlParameter[] param =
{
new SqlParameter("@lat", latitude),
new SqlParameter("@lon", longitude),
new SqlParameter("@rad", radius)
};
//Call stored procedure
var data db.Database.SqlQuery<DataModel("Haversine",param)
return data.ToList();
}
关于c# - 如何计算给定纬度/经度位置的边界框并在 C# 中查询数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38863884/