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;
}
สนุก!
ฉันใช้และปรับแต่งการอ้างอิงนี้และทำให้เสร็จสมบูรณ์