2016-02-01 10 views
13

में ठीक से काम नहीं कर रही है, मैं भूगर्भ से संबंधित एंड्रॉइड ऐप पर काम कर रहा हूं। मैं पार्स का बैकएंड के रूप में उपयोग कर रहा हूं। मुझे उपयोगकर्ता के वर्तमान स्थान के आधार पर परिणाम प्रदर्शित करने की आवश्यकता है।जहां पिछली क्वेरी पार्स

मैं इस क्वेरी का उपयोग कर रहा:

ParseQuery<ParseObject> query = ParseQuery.getQuery("Restaurants"); 
ParseGeoPoint sLatlong = new ParseGeoPoint(currentLat, currentLong); 
     query.whereNear("rest_location", sLatlong); 

लेकिन परिणाम दूरी बुद्धिमान पृथक नहीं किया जा।

क्या कोई मेरी मदद कर सकता है।

+0

क्या आप जानते हैं कि पार्स सही बंद हो रहा है? जनवरी 2017 में उनकी सेवा बंद हो जाएगी। http://blog.parse.com/announcements/moving-on/ – Dom

+0

हाँ मुझे पता है कि। मैं अपने विचार को प्रमाणित करने के लिए बस 3 महीने के लिए इसका उपयोग करूँगा। – Anirudh

+0

मेरे उत्तर में एक साइड नोट के रूप में जब आप कहते हैं कि परिणाम दूरी के अनुसार क्रमबद्ध नहीं हैं, तो क्या आप 'FindCallback.done (...)' विधि में परिणामों के क्रम की जांच कर रहे हैं? अन्यथा आप परिणामों के आदेश की जांच कर रहे हैं? हो सकता है कि आप परिणाम संसाधित करने के बाद स्वयं को ऑर्डर बदल रहे हों। –

उत्तर

4

पार्स के लिए Android Documentation के अनुसार डिफ़ॉल्ट सॉर्ट ऑर्डर पहले से ही दूरी (निकटतम तक निकटतम) होना चाहिए जबतक कि आप स्वयं एक और सॉर्ट ऑर्डर निर्दिष्ट नहीं कर लेते।

इसके अलावा, आप के रूप में आप,

निर्दिष्ट कर सकते हैं कि आप केवल मील की एक निश्चित संख्या के भीतर स्थानों चाहते हैं, किलोमीटर आदि ParseQuery.whereWithin* तरीकों में देखना चाहते हो सकता है बाकी सब विफल रहता है और सॉर्ट क्रम अभी नहीं खाता है तो लौटाए गए स्थानों पर काम करना चाहते हैं, आप क्वेरी से लौटे का उपयोग करके ParseObject एस के माध्यम से लूपिंग करके हमेशा उन्हें स्वयं क्रमबद्ध कर सकते हैं।

यह एक ParseGeoPoint वस्तु वापस आ जाएगी और आप तो कर सकते हैं निम्नलिखित

ParseGeoPoint.distanceInKilometersTo(sLatlong); 

उपयोगकर्ता के स्थान पर दूरी मिलता है और उस पर क्रमबद्ध करने के लिए।

संदर्भ यहाँ के लिए एक नमूना Comparator है:

public class UserLocationComparator implements Comparator<ParseObject> { 

    private final ParseGeoPoint userLoc; 

    public UserLocationComparator(ParseGeoPoint userLoc) { 
     this.userLoc = userLoc; 
    } 

    @Override 
    public int compare(ParseObject po1, ParseObject po2) { 
     ParseGeoPoint loc1 = po1.getParseGeoPoint("rest_location"); 
     ParseGeoPoint loc2 = po2.getParseGeoPoint("rest_location"); 

     return loc1 == null ? 
       (loc2 == null ? 0 : 1) : 
       (loc2 == null ? -1 : Double.compare(userLoc.distanceInKilometersTo(loc1), userLoc.distanceInKilometersTo(loc2))); 
    } 
} 

और फिर यह सोचते हैं आप एक List<ParseObject> results; बस कार्य करें:

Collections.sort(results, new UserLocationComparator(sLatlong)); 
-1

Step1: तुम सब है कि क्या जांच करने की आवश्यकता की सबसे पहले अपने कॉलम "rest_location" प्रकार "GeoPoint" प्रकार का है। यदि ऐसा है तो आपको अपने द्वारा लिखे गए कोड के साथ स्वचालित रूप से दूरी से क्रमबद्ध परिणाम प्राप्त करना चाहिए। केवल समस्या यह हो सकती है कि "rest_location" geopoint प्रकार का नहीं है या फिर पार्स के साथ कुछ समस्या है। पार्स प्रलेखन के अनुसार: https://www.parse.com/docs/android/guide#geopoints यह उपयोगकर्ता स्थान से क्रमबद्ध क्रम (सबसे दूर तक) में डिफ़ॉल्ट परिणाम देता है।

यदि यह काम नहीं करता है तो आपको अपने स्वयं के तुलनित्र का उपयोग करना चाहिए।

class DistanceComparator implements Comparator<ParseObject> { 

    ParseGeoPoint userGeoPoint; 

    public DistanceComparator(ParseGeoPoint geoPoint) { 
     userGeoPoint = geoPoint; 
    } 

    @Override 
    public int compare(ParseObject lhs, ParseObject rhs) { 
     double dist1 = lhs.getParseGeoPoint("rest_location").distanceInKilometersTo(userGeoPoint); 
     double dist2 = rhs.getParseGeoPoint("rest_location").distanceInKilometersTo(userGeoPoint); 

     return Double.compare(dist1,dist2); 
    } 
    } 
अब

आप बस पारित कर सकते हैं Collections.sort (locationList, नई DistanceComparator (sLatLong));

संबंधित मुद्दे