首页 文章

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

提问于
浏览
1

这是我需要实现的场景:

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

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

现在我的两个问题:

  • 我需要仅在给定半径范围内显示标记,而不是其余部分 . 我也不想在 Map 上画一个圆圈 . 我是否必须遍历所有位置并查看哪些位于半径范围内或者是否有更快更有效的方法?

  • 我可以选择获得所有标记的直线距离和道路距离吗?

2 回答

  • 1

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

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

  • 0

    在BI中编写一个方法,为您提供Map的边界之间的所有餐厅(或者在距离Map的中心(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 )";
    
    
    }
    

    这也可以给你直线距离 .

    • 对于道路距离,您可以使用中心 Map 和坐标或餐厅拨打谷歌播放服务

相关问题