我在Google地图中有很多位置。在数据库(SQL Server)中,我存储了它们的坐标。模型是这样的:
public class Marker
{
public int Id { get; set; }
public string Lat { get; set; }
public string Long { get; set; }
}
1 coordinate(latitude and longitude)
和1 radius (i.e 100 meter)
将提供给我,我应该在位置列表的半径范围内找到此区域中的位置。
如何计算坐标上半径的距离?
答案 0 :(得分:1)
我认为你需要从给定点使用Haversine公式foreach点并将结果与radius进行比较。
答案 1 :(得分:1)
以下SQL查询使用Spherical Law of Cosines来计算表中坐标和坐标之间的距离。
d = acos(sin(φ1).sin(φ2)+ cos(φ1).cos(φ2).cos(Δλ))。R
"SELECT Id,Lat,Long,(6367 * acos( cos( radians(center_lat) )
* cos( radians( Lat ) ) * cos( radians( Long ) - radians(center_lng) )
+ sin( radians(center_lat) ) * sin( radians( Lat ) ) ) ) AS distance FROM table
HAVING distance < radius ORDER BY distance ASC LIMIT 0 , 20"
为MS SQL使用预准备语句&amp; C#。
<强>尝试强>
private static void SqlCommandPrepareEx(string connectionString)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand(null, connection);
// Create and prepare an SQL statement.
command.CommandText =
"SELECT Id, Lat, Long, (6367 * acos( cos( radians(@center_lat) ) * cos( radians( Lat ) ) * cos( radians( Long ) - radians(@center_lng) ) + sin( radians(@center_lat) ) * sin( radians( Lat ) ) ) ) AS distance FROM table HAVING distance < @radius ORDER BY distance ASC LIMIT 0 , 20");
SqlParameter center_lat = new SqlParameter("@center_lat", SqlDbType.Decimal);
center_lat.Precision = 10;
center_lat.Scale = 6;
center_lat.Value = YOURVALUEHERE;//latitude of centre
command.Parameters.Add(center_lat);
SqlParameter center_lng = new SqlParameter("@center_lng", SqlDbType.Decimal);
center_lng.Precision = 10;
center_lng.Scale = 6;
center_lng.Value = YOURVALUEHERE;//longitude of centre
command.Parameters.Add(center_lng);
SqlParameter radius = new SqlParameter("@radius", SqlDbType.Int,3);
radius.Value = YOURVALUEHERE;
command.Parameters.Add(radius);//Radius in km
// Call Prepare after setting the Commandtext and Parameters.
command.Prepare();
command.ExecuteNonQuery();
}
}
因为我没有MS SQL&amp; C#我无法测试
PS使用3956英里6367英里