我给出了一个由纬度和经度定义的位置。现在我想计算一个边界框,例如那点500米。
边界框应定义为latmin
,lngmin
和latmax
,lngmax
。
我的数据库有近152.000条记录(由lat long定义的对象位置),如果用户在搜索栏中输入特定对象(按名称搜索),我应该找到特定半径的对象,例如500米范围内。
例如,这是一条记录:Latitude = 41.72213058512578, Longitude = 44.77684020996094, Name = company1
如果我找到latmin
,lngmin
和latmax
,lngmax
如何查询数据库?我想在C#中实现这一点。
答案 0 :(得分:1)
查看Haversine公式。
在数据库中的应用程序或存储过程中创建此查询。它将返回15个最近的位置到给定半径内的给定latpoint和longpoint。半径现在设置为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.0C#应用程序中的类似内容,用于调用存储过程并从列表中的查询中获取数据。
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();
}