查看Haversine 公式。
在您的应用程序或数据库中的存储过程中创建此查询。它将返回给定半径内与给定纬度和经度点最近的 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();
}