Haversine Formula를 사용하여 SQLite에서 가장 가까운 위치 가져오기
SQLite 데이터베이스에 위도 및 경도 좌표를 저장하면 위치 기반 위치 기반 검색의 다양한 가능성이 열립니다. 응용 프로그램. 일반적인 작업 중 하나는 Haversine 공식을 기반으로 특정 지점에 가장 가까운 위치를 검색하는 것입니다. MySQL은 기본적으로 사용자 정의 함수를 통해 이를 지원하지만 SQLite는 좀 더 복잡한 접근 방식이 필요합니다.
Haversine Formula를 위한 사용자 정의 외부 함수
SQLite는 고급 계산 구현을 위한 사용자 정의 외부 함수를 지원합니다. 그러나 이러한 기능을 만들고 통합하면 불필요한 복잡성과 성능 오버헤드가 발생할 수 있습니다. 또한 결과를 거리별로 정렬하려면 데이터베이스에 거리 열을 추가해야 하는데 이는 비효율적이고 비실용적입니다.
경계 직사각형을 사용한 효율적인 필터링
이 과제에는 경계 직사각형을 사용하여 데이터베이스를 필터링하는 작업이 포함됩니다. 주어진 점과 미리 정의된 반경을 기반으로 직사각형의 네 모서리를 계산하면 관련 없는 데이터를 대부분 제거하고 필요한 처리량을 크게 줄일 수 있습니다. 그런 다음 파생된 위도와 경도를 사용하여 SQL 쿼리에 대한 WHERE 절을 구성할 수 있습니다.
PointF center = new PointF(x, y); final double mult = 1.1; // Mult for more reliable results 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);
필터링된 결과 내 거리 계산
데이터가 필터링되면, Haversine을 사용하여 결과를 반복하고 실제 거리를 계산할 수 있습니다. 공식:
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) { // Haversine formula for calculating distance in meters // ... }
효율적인 필터링과 정확한 거리 계산을 결합하면 사용자 지정 외부 함수나 지속적인 거리 열에 의존하지 않고도 SQLite 데이터베이스에서 가장 가까운 위치를 검색할 수 있습니다.
위 내용은 사용자 정의 기능 없이 SQLite에서 가장 가까운 위치를 효율적으로 찾는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!