解析API - 如何缩小结果范围?

时间:2014-10-19 17:38:25

标签: xamarin.ios geolocation xamarin

我使用以下代码获取最近的诊所的位置,以kms为单位,代码可以很好地运行。但是我无法理解的是如何绕过解析对象只返回100个对象,所以我想我的问题应该是如何返回一个与当前诊所长度匹配的子集。

我在viewdIdLoadMethod

中调用以下函数
List<Clinics> _clicics;
_clicics =GetAllNearestFamousPlaces (54.269412, -0.93399086);


public List<Clinics>  GetAllNearestFamousPlaces(double currentLatitude,double currentLongitude)
    {
        List<Clinics> Caldistance = new List<Clinics>();

        var query = ParseObject.GetQuery("clinics");
        query.FindAsync().ContinueWith(t =>
            {

        IEnumerable<ParseObject> results = t.Result;
        foreach (var obj in results)
        {
           double distance = Distance(currentLatitude, currentLongitude, obj.Get<double>("lat"), obj.Get<double>("long"));
            if (distance < 25)          //nearbyplaces which are within 25 kms 
            {
                Clinics dist = new Clinics();
                dist.Name = obj.Get<string>("Name");
                dist.Latitute = obj.Get<double>("lat");
                dist.Longitude =obj.Get<double>("long");
                Caldistance.Add(dist);
                    }
                }
            });

        return Caldistance;


    }


    private double Distance(double lat1, double lon1, double lat2, double lon2)
    {
        double theta = lon1 - lon2;
        double dist = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) + Math.Cos(deg2rad(lat1)) * Math.Cos(deg2rad(lat2)) * Math.Cos(deg2rad(theta));
        dist = Math.Acos(dist);
        dist = rad2deg(dist);
        dist = (dist * 60 * 1.1515) / 0.6213711922;          //miles to kms
        return (dist);
    }


    private double deg2rad(double deg)
    {
        return (deg * Math.PI / 180.0);
    }

    private double rad2deg(double rad)
    {
        return (rad * 180.0 / Math.PI);
    }

1 个答案:

答案 0 :(得分:0)

这可能在语法上不正确 - 我实际上并没有使用Parse所以我根据他们的文档进行猜测

// assume your point of origin is 54.269412, -0.93399086
// each degree of lat/long is **roughly** 100 km so we'll fudge and +- .5 to narrow down the
// list of clinics

double lat = 54.269412;
double lng = -0.93399086;

double minLong = lng - 0.5;
double maxLong = lng + 0.5;
double minLat = lat - 0.5;
double maxLat = lat + 0.5;

var query = from clinic in ParseObject.GetQuery("clinics")
            where clinic.Get<double>("lat") >= minLat 
            and clinic.Get<double>("lat") <= maxLat
            and clinic.Get<double>("long") >= minLat
            and clinic.Get<double>("long") <= maxLat
            select clinic;

// 1000 is the max we can request at a time
query = query.Limit(1000);

// now execute your query to get the results, and then use your Distance() function to calculate
// the precise distance and remove results that are to far away, etc