在给定半径内的地图上显示标记(Xamarin.Android)

时间:2013-12-29 16:18:04

标签: google-maps xamarin.android distance

以下是我需要实施的方案:

假设我有一个数据库表,其中包含我所在城市的餐馆的纬度和经度全部,比如500家餐馆。现在我正在使用我的应用程序站在城市的某个地方,并想知道我附近的餐馆,比如在10英里半径范围内。

要实现这一点,应用程序必须首先知道我当前的位置(我已经这样做了)。一旦我的位置已知,应用程序需要在10英里范围内的所有餐厅放置标记(假设总共500个中的25个)。我不需要为那些远远超过那些的标记显示标记。现在,当我点击任何标记时,我将看到InfoWindow然后点击它我需要导航到一个新活动并显示一些细节,如地址,姓名,电话号码(这些都来自数据库)以及它与我当前位置的距离

现在我的两个问题:

  1. 我只需要在给定半径范围内显示标记,而不是其余部分。我也不想在地图上画一个圆圈。我是否必须遍历所有位置并查看哪些位于半径范围内或者是否有更快更有效的方法?
  2. 我可以选择获得所有标记的直线距离和道路距离吗?

2 个答案:

答案 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. 对于道路距离,您可以使用中心地图和坐标或餐厅来调用Google Play服务

答案 1 :(得分:0)

因此,您可以在Web服务中移动此逻辑或通过LINQ

执行此操作

看看Is there a simple way to write a custom function in LINQ to Entities?