1) Lúc đầu, hãy lọc dữ liệu SQLite của bạn với lượng dữ liệu gần đúng và giảm dần mà bạn cần đánh giá trong mã java của mình. Sử dụng quy trình sau cho mục đích này:
Để có ngưỡng xác định và bộ lọc dữ liệu chính xác hơn, tốt hơn là bạn nên tính toán 4 vị trí theo radius
mét là bắc, tây, đông và nam của điểm trung tâm trong mã java của bạn và sau đó kiểm tra dễ dàng bằng ít hơn và hơn Toán tử SQL (>, <) để xác định xem các điểm của bạn trong cơ sở dữ liệu có nằm trong hình chữ nhật đó hay không.
Phương pháp calculateDerivedPosition(...)
tính các điểm đó cho bạn (p1, p2, p3, p4 trong hình).
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;
}
Và bây giờ hãy tạo truy vấn của bạn:
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
là tên của cột trong cơ sở dữ liệu lưu trữ các giá trị vĩ độ và COL_Y
là kinh độ.
Vì vậy, bạn có một số dữ liệu gần điểm trung tâm của bạn với một giá trị gần đúng.
2) Bây giờ bạn có thể lặp lại các dữ liệu đã lọc này và xác định xem chúng có thực sự gần điểm của bạn (trong vòng kết nối) hay không bằng cách sử dụng các phương pháp sau:
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;
}
Thưởng thức!
Tôi đã sử dụng và tùy chỉnh tài liệu tham khảo này và hoàn thành nó.