以下是我需要实施的方案:
假设我有一个数据库表,其中包含我所在城市的餐馆的纬度和经度全部,比如500家餐馆。现在我正在使用我的应用程序站在城市的某个地方,并想知道我附近的餐馆,比如在10英里半径范围内。
要实现这一点,应用程序必须首先知道我当前的位置(我已经这样做了)。一旦我的位置已知,应用程序需要在10英里范围内的所有餐厅放置标记(假设总共500个中的25个)。我不需要为那些远远超过那些的标记显示标记。现在,当我点击任何标记时,我将看到InfoWindow然后点击它我需要导航到一个新活动并显示一些细节,如地址,姓名,电话号码(这些都来自数据库)以及它与我当前位置的距离
现在我的两个问题:
答案 0 :(得分:1)
在BI中编写一个方法,该方法为您提供地图边界之间的所有餐厅(或距离地图中心(LatLon)的给定距离)。 我曾经在Sqlite中嵌入自定义函数
[SqliteFunctionAttribute(Name = "distance", Arguments = 4, FuncType = FunctionType.Scalar)]
class SqliteDistance : SqliteFunction
{
public override object Invoke(object[] args)
{
double latA = System.Convert.ToDouble(args[0]);
double lonA = System.Convert.ToDouble(args[1]);
double latB = System.Convert.ToDouble(args[2]);
double lonB = System.Convert.ToDouble(args[3]);
const double R = 6371;
const double pigreco = 3.1415927;
double lat_alfa, lat_beta;
double lon_alfa, lon_beta;
double fi;
double p, d;
/* Converte i gradi in radianti */
lat_alfa = pigreco * latA / 180;
lat_beta = pigreco * latB / 180;
lon_alfa = pigreco * lonA / 180;
lon_beta = pigreco * lonB / 180;
/* Calcola l'angolo compreso fi */
fi = Math.Abs(lon_alfa - lon_beta);
/* Calcola il terzo lato del triangolo sferico */
p = Math.Acos(Math.Sin(lat_beta) * Math.Sin(lat_alfa) +
Math.Cos(lat_beta) * Math.Cos(lat_alfa) * Math.Cos(fi));
/* Calcola la distanza sulla superficie
terrestre R = ~6371 km */
d = p * R;
return (d);
}
}
然后在你的查询中:
Public List<Restaurant> GiveMeRestaurants(double fromLat, double fromLon)
{
String sql="Select * from restaurants where distance('" + fromLat.ToString() + "','" + fromLon.ToString() + "',restaurants.Latitude,restaurants.Longitude) <= 100 )";
}
这也可以给你直线距离。
答案 1 :(得分:0)
因此,您可以在Web服务中移动此逻辑或通过LINQ
执行此操作看看Is there a simple way to write a custom function in LINQ to Entities?