1) पहले अपने SQLite डेटा को एक अच्छे सन्निकटन के साथ फ़िल्टर करें और उस डेटा की मात्रा कम करें जिसे आपको अपने जावा कोड में मूल्यांकन करने की आवश्यकता है। इस उद्देश्य के लिए निम्नलिखित प्रक्रिया का उपयोग करें:
एक नियतकालिक सीमा है और डेटा पर अधिक सटीक फिल्टर, यह गणना करने के लिए बेहतर है 4 स्थानों है कि में हैं radius
उत्तर की मीटर, पश्चिम, पूर्व और अपने केंद्रीय बिंदु के दक्षिण अपने जावा कोड में और उसके बाद से आसानी से जांच की तुलना में और अधिक से अधिक कम SQL ऑपरेटर (>, <) यह निर्धारित करने के लिए कि डेटाबेस में आपके अंक उस आयत में हैं या नहीं।
विधि calculateDerivedPosition(...)
आपके लिए उन बिंदुओं की गणना करती है (चित्र में p1, P2, p3, p4)।
public static PointF calculateDerivedPosition(PointF point,
double range, double bearing)
{
double EarthRadius = 6371000;
double latA = Math.toRadians(point.x);
double lonA = Math.toRadians(point.y);
double angularDistance = range / EarthRadius;
double trueCourse = Math.toRadians(bearing);
double lat = Math.asin(
Math.sin(latA) * Math.cos(angularDistance) +
Math.cos(latA) * Math.sin(angularDistance)
* Math.cos(trueCourse));
double dlon = Math.atan2(
Math.sin(trueCourse) * Math.sin(angularDistance)
* Math.cos(latA),
Math.cos(angularDistance) - Math.sin(latA) * Math.sin(lat));
double lon = ((lonA + dlon + Math.PI) % (Math.PI * 2)) - Math.PI;
lat = Math.toDegrees(lat);
lon = Math.toDegrees(lon);
PointF newPoint = new PointF((float) lat, (float) lon);
return newPoint;
}
और अब अपनी क्वेरी बनाएं:
PointF center = new PointF(x, y);
final double mult = 1;
PointF p1 = calculateDerivedPosition(center, mult * radius, 0);
PointF p2 = calculateDerivedPosition(center, mult * radius, 90);
PointF p3 = calculateDerivedPosition(center, mult * radius, 180);
PointF p4 = calculateDerivedPosition(center, mult * radius, 270);
strWhere = " WHERE "
+ COL_X + " > " + String.valueOf(p3.x) + " AND "
+ COL_X + " < " + String.valueOf(p1.x) + " AND "
+ COL_Y + " < " + String.valueOf(p2.y) + " AND "
+ COL_Y + " > " + String.valueOf(p4.y);
COL_X
डेटाबेस में कॉलम का नाम है जो अक्षांश मानों को संग्रहीत करता है और COL_Y
देशांतर के लिए है।
तो आपके पास कुछ आंकड़े हैं जो एक अच्छे सन्निकटन के साथ आपके केंद्रीय बिंदु के पास हैं।
2) अब आप इन फ़िल्टर किए गए डेटा पर लूप कर सकते हैं और निर्धारित कर सकते हैं कि क्या वे वास्तव में आपके बिंदु (सर्कल में) के पास हैं या निम्न विधियों का उपयोग नहीं कर रहे हैं:
public static boolean pointIsInCircle(PointF pointForCheck, PointF center,
double radius) {
if (getDistanceBetweenTwoPoints(pointForCheck, center) <= radius)
return true;
else
return false;
}
public static double getDistanceBetweenTwoPoints(PointF p1, PointF p2) {
double R = 6371000;
double dLat = Math.toRadians(p2.x - p1.x);
double dLon = Math.toRadians(p2.y - p1.y);
double lat1 = Math.toRadians(p1.x);
double lat2 = Math.toRadians(p2.x);
double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2)
* Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
double d = R * c;
return d;
}
का आनंद लें!
मैंने इस संदर्भ का उपयोग और अनुकूलित किया और इसे पूरा किया।